|
@@ -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:
|