# -*- 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.commit_manually
    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_with_ldap(creation)
        except:
            #transaction.rollback()
            raise
        else:
            #transaction.commit()

    class Meta:
        abstract = True
