|
@@ -4,6 +4,8 @@ import pprint
|
|
|
import os
|
|
|
import base64
|
|
|
import hashlib
|
|
|
+import unicodedata
|
|
|
+import string
|
|
|
from django.db import models
|
|
|
from ldapdb.models.fields import CharField, IntegerField, ListField
|
|
|
from django.db.models.signals import post_save, pre_save, post_delete
|
|
@@ -95,13 +97,15 @@ class MembershipFee(models.Model):
|
|
|
help_text='fin de validité de cotisation')
|
|
|
|
|
|
def __unicode__(self):
|
|
|
- return (u'%s - %s - %i€' % (self.member, self.start_date, self.amount))
|
|
|
+ return (u'%s - %s - %i€' % (self.member, self.start_date,
|
|
|
+ self.amount))
|
|
|
|
|
|
|
|
|
class LdapUser(ldapdb.models.Model):
|
|
|
# TODO: déplacer ligne suivante dans settings.py
|
|
|
base_dn = "ou=users,ou=unix,o=ILLYSE,l=Villeurbanne,st=RHA,c=FR"
|
|
|
- object_classes = ['inetOrgPerson', 'organizationalPerson', 'person', 'top', 'posixAccount']
|
|
|
+ object_classes = ['inetOrgPerson', 'organizationalPerson', 'person',
|
|
|
+ 'top', 'posixAccount']
|
|
|
|
|
|
uid = CharField(db_column='uid', unique=True, max_length=255)
|
|
|
nick_name = CharField(db_column='cn', unique=True, primary_key=True,
|
|
@@ -113,7 +117,8 @@ class LdapUser(ldapdb.models.Model):
|
|
|
password = CharField(db_column='userPassword', max_length=255)
|
|
|
uidNumber = IntegerField(db_column='uidNumber', unique=True)
|
|
|
gidNumber = IntegerField(db_column='gidNumber', default=2000)
|
|
|
- homeDirectory = CharField(db_column='homeDirectory', max_length=255 , default='/tmp')
|
|
|
+ homeDirectory = CharField(db_column='homeDirectory', max_length=255,
|
|
|
+ default='/tmp')
|
|
|
|
|
|
def __unicode__(self):
|
|
|
return self.display_name
|
|
@@ -159,6 +164,41 @@ def change_password(sender, instance, **kwargs):
|
|
|
instance.password = '{SSHA}' + base64.b64encode(digest + salt)
|
|
|
|
|
|
|
|
|
+@receiver(pre_save, sender=LdapUser)
|
|
|
+def define_display_name(sender, instance, **kwargs):
|
|
|
+ """
|
|
|
+ Lors de la sauvegarde d'un utilisateur Ldap, le champ display_name est la
|
|
|
+ concaténation de first_name et last_name
|
|
|
+ """
|
|
|
+ if not instance.display_name:
|
|
|
+ instance.display_name = '%s %s' % (instance.first_name,
|
|
|
+ instance.last_name)
|
|
|
+
|
|
|
+
|
|
|
+@receiver(pre_save, sender=Member)
|
|
|
+def define_ldap_cn(sender, instance, **kwargs):
|
|
|
+ """
|
|
|
+ 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
|
|
|
+ """
|
|
|
+ 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):
|
|
|
"""
|
|
@@ -187,7 +227,9 @@ def sync_ldap(sender, instance, created, **kwargs):
|
|
|
|
|
|
|
|
|
@receiver(post_delete, sender=Member)
|
|
|
-def remove_ldap_user_from_coin_group_when_deleting_member(sender, instance, **kwargs):
|
|
|
+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"
|