mixins.py 2.1 KB

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