mixins.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. # -*- coding: utf-8 -*-
  2. from django.db import transaction
  3. class CoinLdapSyncMixin(object):
  4. """
  5. Ce mixin est à utiliser lorsqu'il s'agit de définir un modèle
  6. à synchroniser avec le LDAP. Le modèle doit définir les méthodes :
  7. sync_to_ldap et delete_from_ldap qui s'occupent du transfert vers le LDAP.
  8. L'avantage de ce modèle est que si cette méthode échoue, la sauvegarde en
  9. base de données échoue à son tour et rien n'est sauvegardé afin de conserver
  10. la cohérence entre base de donnée et LDAP
  11. """
  12. def sync_to_ldap(self, creation, *args, **kwargs):
  13. raise NotImplementedError('Using CoinLdapSyncModel require '
  14. 'sync_to_ldap method being implemented')
  15. def delete_from_ldap(self, *args, **kwargs):
  16. raise NotImplementedError('Using CoinLdapSyncModel require '
  17. 'delete_from_ldap method being implemented')
  18. @transaction.atomic
  19. def save(self, *args, **kwargs):
  20. # Détermine si on est dans une création ou une mise à jour
  21. creation = (self.pk == None)
  22. # Récupère les champs mis à jour si cela est précisé
  23. update_fields = kwargs['update_fields'] if 'update_fields' in kwargs else None
  24. # Sauvegarde en base de donnée (mais sans commit, cf decorator)
  25. super(CoinLdapSyncMixin, self).save(*args, **kwargs)
  26. # Sauvegarde dans le LDAP
  27. # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
  28. # commit
  29. try:
  30. self.sync_to_ldap(creation=creation,update_fields=update_fields)
  31. except:
  32. raise
  33. @transaction.atomic
  34. def delete(self, *args, **kwargs):
  35. # Supprime de la base de donnée (mais sans commit, cf decorator)
  36. super(CoinLdapSyncMixin, self).delete(*args, **kwargs)
  37. try:
  38. self.delete_from_ldap()
  39. except:
  40. raise