mixins.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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):
  13. raise NotImplementedError('Using CoinLdapSyncModel require '
  14. 'sync_to_ldap method being implemented')
  15. def delete_from_ldap(self):
  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. # Sauvegarde en base de donnée (mais sans commit, cf decorator)
  23. super(CoinLdapSyncMixin, self).save(*args, **kwargs)
  24. # Sauvegarde dans le LDAP
  25. # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
  26. # commit
  27. try:
  28. self.sync_to_ldap(creation)
  29. except:
  30. raise
  31. @transaction.atomic
  32. def delete(self, *args, **kwargs):
  33. # Supprime de la base de donnée (mais sans commit, cf decorator)
  34. super(CoinLdapSyncMixin, self).delete(*args, **kwargs)
  35. try:
  36. self.delete_from_ldap()
  37. except:
  38. raise