Browse Source

Add a mandatory method in CoinLdapModel delete_from_ldap to ensure if eleting object in LDAP fail, don't delete it in database

Fabs 11 years ago
parent
commit
bd9a605998
2 changed files with 33 additions and 16 deletions
  1. 15 14
      coin/members/models.py
  2. 18 2
      coin/models.py

+ 15 - 14
coin/members/models.py

@@ -152,6 +152,21 @@ class Member(CoinLdapSyncModel):
             ldap_group.members.append(ldap_user.pk)
             ldap_group.save()
 
+    def delete_from_ldap(self):
+        """
+        Delete member from the LDAP
+        """
+        assert self.ldap_cn, ('Can\'t delete from LDAP because missing '
+                              'ldap_cn value for the Member : %s' % self)
+
+        # Lorsqu'un membre est supprimé du SI, son utilisateur LDAP
+        # correspondant est sorti du groupe "coin" afin qu'il n'est plus
+        # accès au SI
+        ldap_group = LdapGroup.objects.get(pk='coin')
+        if self.ldap_cn in ldap_group.members:
+            ldap_group.members.remove(self.ldap_cn)
+            ldap_group.save()
+
     class Meta:
         verbose_name = 'membre'
 
@@ -280,20 +295,6 @@ def define_display_name(sender, instance, **kwargs):
                                            instance.last_name)
 
 
-@receiver(post_delete, sender=Member)
-def remove_ldap_user_from_coin_group_when_deleting_member(sender,
-                                                          instance,
-                                                          **kwargs):
-    """
-    Lorsqu'un membre est supprimé du SI, son utilisateur LDAP correspondant est
-    sorti du groupe "coin"
-    """
-    ldap_group = LdapGroup.objects.get(pk='coin')
-    if instance.ldap_cn in ldap_group.members:
-        ldap_group.members.remove(instance.ldap_cn)
-        ldap_group.save()
-
-
 @receiver(user_logged_in)
 def define_member_user(sender, request, user, **kwargs):
     """

+ 18 - 2
coin/models.py

@@ -7,8 +7,8 @@ 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.
+    à 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é.
@@ -18,6 +18,11 @@ class CoinLdapSyncModel(models.Model):
         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
@@ -34,5 +39,16 @@ class CoinLdapSyncModel(models.Model):
         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