models.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738
  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 la methode sync_to_ldap
  8. 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. @transaction.atomic
  17. def save(self, *args, **kwargs):
  18. # Détermine si on est dans une création ou une mise à jour
  19. creation = (self.pk == None)
  20. # Sauvegarde en base de donnée (mais sans commit, cf decorator)
  21. super(CoinLdapSyncModel, self).save(*args, **kwargs)
  22. # Sauvegarde dans le LDAP
  23. # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
  24. # commit
  25. try:
  26. self.sync_to_ldap(creation)
  27. except:
  28. raise
  29. class Meta:
  30. abstract = True