models.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # -*- coding: utf-8 -*-
  2. from django.db import models
  3. from django.db import transaction
  4. class CoinLdapSyncModel(models.Model):
  5. """
  6. Ce modèle abstrait est à utiliser lorsqu'il s'agit de définir un modèle
  7. à synchroniser avec le LDAP. Le modèle doit définir le methodes :
  8. sync_to_ldap et delete_from_ldap qui s'occupe 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 a son tour et rien n'est sauvegardé afin de conservé
  11. l'intégrité.
  12. """
  13. def sync_to_ldap(self, creation):
  14. raise NotImplementedError('Using CoinLdapSyncModel require '
  15. 'sync_to_ldap method being implemented')
  16. def delete_from_ldap(self):
  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. # Sauvegarde en base de donnée (mais sans commit, cf decorator)
  24. super(CoinLdapSyncModel, self).save(*args, **kwargs)
  25. # Sauvegarde dans le LDAP
  26. # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
  27. # commit
  28. try:
  29. self.sync_to_ldap(creation)
  30. except:
  31. raise
  32. @transaction.atomic
  33. def delete(self, *args, **kwargs):
  34. # Supprime de la base de donnée (mais sans commit, cf decorator)
  35. super(CoinLdapSyncModel, self).delete(*args, **kwargs)
  36. try:
  37. self.delete_from_ldap()
  38. except:
  39. raise
  40. class Meta:
  41. abstract = True