Browse Source

Remove pre_save post_save for Member modem, prefer override save method.
This prepare disable ldap

Fabs 11 years ago
parent
commit
4efcec9b70
2 changed files with 53 additions and 30 deletions
  1. 41 30
      coin/members/models.py
  2. 12 0
      coin/members/tests.py

+ 41 - 30
coin/members/models.py

@@ -84,6 +84,21 @@ class Member(models.Model):
             Q(subscription_date__lte=date),
             Q(resign_date__isnull=True) | Q(resign_date__gte=date))
 
+    def save(self, *args, **kwargs):
+        create = (self.pk == None)
+
+        # If not ldap_cn defined and creation
+        if not self.ldap_cn and create:
+            self.ldap_cn = get_ldap_cn(self.first_name, self.last_name)
+
+        # Save in ldap and in database
+        try:
+            sync_member_with_ldap_user(self, create)
+            super(Member, self).save(*args, **kwargs)
+        except:
+            pass
+
+
     class Meta:
         verbose_name = 'membre'
 
@@ -202,49 +217,45 @@ def define_display_name(sender, instance, **kwargs):
                                            instance.last_name)
 
 
-@receiver(pre_save, sender=Member)
-def define_ldap_cn(sender, instance, **kwargs):
+def get_ldap_cn(first_name, last_name):
     """
-    Lors de la sauvegarde d'un membre. Si le champ ldap_cn n'est pas définit,
-    le calcul automatiquement en fonction du nom et du prénom
+    Calcul le login / ldap_cn automatiquement en fonction du nom et du prénom
     """
-    if not instance.ldap_cn:
-        # Première lettre de chaque partie du prénom
-        first_name_letters = ''.join(
-            [c[0] for c in instance.first_name.split('-')]
-        )
-        # Concaténer avec nom de famille
-        ldap_cn = ('%s%s' % (first_name_letters, instance.last_name))
-        # Remplacer ou enlever les caractères non ascii
-        ldap_cn = unicodedata.normalize('NFD', ldap_cn)\
-            .encode('ascii', 'ignore')
-        # Enlever ponctuation et espace
-        ldap_cn = ldap_cn.translate(None, string.punctuation + ' ')
-        # En minuscule
-        ldap_cn = ldap_cn.lower()
-
-        instance.ldap_cn = ldap_cn
-
-
-@receiver(post_save, sender=Member)
-def sync_ldap(sender, instance, created, **kwargs):
+    # Première lettre de chaque partie du prénom
+    first_name_letters = ''.join(
+        [c[0] for c in first_name.split('-')]
+    )
+    # Concaténer avec nom de famille
+    ldap_cn = ('%s%s' % (first_name_letters, last_name))
+    # Remplacer ou enlever les caractères non ascii
+    ldap_cn = unicodedata.normalize('NFD', ldap_cn)\
+        .encode('ascii', 'ignore')
+    # Enlever ponctuation et espace
+    ldap_cn = ldap_cn.translate(None, string.punctuation + ' ')
+    # En minuscule
+    ldap_cn = ldap_cn.lower()
+
+    return ldap_cn
+
+
+def sync_member_with_ldap_user(member, created):
     """
     Update LDAP data when a member is saved
     """
     if not created:
-        ldap_user = LdapUser.objects.get(pk=instance.ldap_cn)
+        ldap_user = LdapUser.objects.get(pk=member.ldap_cn)
 
     if created:
         max_uidNumber = LdapUser.objects.order_by('-uidNumber')[0].uidNumber
 
         ldap_user = LdapUser()
-        ldap_user.pk = instance.ldap_cn
-        ldap_user.uid = instance.ldap_cn
-        ldap_user.nick_name = instance.ldap_cn
+        ldap_user.pk = member.ldap_cn
+        ldap_user.uid = member.ldap_cn
+        ldap_user.nick_name = member.ldap_cn
         ldap_user.uidNumber = max_uidNumber + 1
 
-    ldap_user.last_name = instance.last_name
-    ldap_user.first_name = instance.first_name
+    ldap_user.last_name = member.last_name
+    ldap_user.first_name = member.first_name
     ldap_user.save()
 
     if created:

+ 12 - 0
coin/members/tests.py

@@ -156,6 +156,18 @@ class MemberTests(TestCase):
         member.delete();
         LdapUser.objects.get(pk=member.ldap_cn).delete();
 
+    def test_when_saving_member_and_ldap_fail_dont_save(self):
+        """
+        Test que lors de la sauvegarde d'un membre et que la sauvegarde en LDAP
+        échoue, rien n'est sauvegardé en base
+        """
+        first_name = u'Gérard'
+        last_name = u'Majax'
+        ldap_cn = MemberTestsUtils.get_random_ldap_cn()
+        member = Member(first_name = first_name, last_name = last_name, ldap_cn = ldap_cn)
+        member.save()
+        
+
 
 class MemberAdminTests(TestCase):
     def setUp(self):