1234567891011121314151617181920212223242526272829303132333435363738 |
- # -*- 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 la methode sync_to_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')
- @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
- class Meta:
- abstract = True
|