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.members.append(ldap_user.pk)
             ldap_group.save()
             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:
     class Meta:
         verbose_name = 'membre'
         verbose_name = 'membre'
 
 
@@ -280,20 +295,6 @@ def define_display_name(sender, instance, **kwargs):
                                            instance.last_name)
                                            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)
 @receiver(user_logged_in)
 def define_member_user(sender, request, user, **kwargs):
 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
     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
     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é
     base de données échoue a son tour et rien n'est sauvegardé afin de conservé
     l'intégrité.
     l'intégrité.
@@ -18,6 +18,11 @@ class CoinLdapSyncModel(models.Model):
         raise NotImplementedError('Using CoinLdapSyncModel require '
         raise NotImplementedError('Using CoinLdapSyncModel require '
                                   'sync_to_ldap method being implemented')
                                   'sync_to_ldap method being implemented')
 
 
+
+    def delete_from_ldap(self):
+        raise NotImplementedError('Using CoinLdapSyncModel require '
+                                  'delete_from_ldap method being implemented')
+
     @transaction.atomic
     @transaction.atomic
     def save(self, *args, **kwargs):
     def save(self, *args, **kwargs):
         # Détermine si on est dans une création ou une mise à jour
         # Détermine si on est dans une création ou une mise à jour
@@ -34,5 +39,16 @@ class CoinLdapSyncModel(models.Model):
         except:
         except:
             raise
             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:
     class Meta:
         abstract = True
         abstract = True