mixins.py 2.1 KB

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