123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- # -*- coding: utf-8 -*-
- from django.db import models
- from django.db import transaction
- class CoinLdapSyncModel(models.Model):
- """
- Ce modèle abstrait est à utiliser lorsqu'il s'agit de définir un modèle
- à synchroniser avec le LDAP. Le modèle doit définir le methodes :
- sync_to_ldap et delete_from_ldap qui s'occupe du transfert vers le LDAP.
- L'avantage de ce modèle est que si cette méthode échoue, la sauvegarde en
- base de données échoue a son tour et rien n'est sauvegardé afin de conservé
- l'intégrité.
- """
- def sync_to_ldap(self, creation):
- raise NotImplementedError('Using CoinLdapSyncModel require '
- 'sync_to_ldap method being implemented')
- def delete_from_ldap(self):
- raise NotImplementedError('Using CoinLdapSyncModel require '
- 'delete_from_ldap method being implemented')
- @transaction.atomic
- def save(self, *args, **kwargs):
- # Détermine si on est dans une création ou une mise à jour
- creation = (self.pk == None)
- # Sauvegarde en base de donnée (mais sans commit, cf decorator)
- super(CoinLdapSyncModel, self).save(*args, **kwargs)
- # Sauvegarde dans le LDAP
- # Si la sauvegarde LDAP échoue, Rollback la sauvegarde en base, sinon
- # commit
- try:
- self.sync_to_ldap(creation)
- except:
- raise
- @transaction.atomic
- def delete(self, *args, **kwargs):
- # Supprime de la base de donnée (mais sans commit, cf decorator)
- super(CoinLdapSyncModel, self).delete(*args, **kwargs)
- try:
- self.delete_from_ldap()
- except:
- raise
- class Meta:
- abstract = True
|