mixins.py 1.9 KB

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