Parcourir la source

Improve get_automatic_username to use organization_name and nickname when needed

Fabs il y a 10 ans
Parent
commit
da5072f7f1
2 fichiers modifiés avec 56 ajouts et 14 suppressions
  1. 22 13
      coin/members/models.py
  2. 34 1
      coin/members/tests.py

+ 22 - 13
coin/members/models.py

@@ -3,7 +3,6 @@ from __future__ import unicode_literals
 
 import ldapdb.models
 import unicodedata
-import string
 import datetime
 from django.db import models
 from django.db.models import Q
@@ -239,23 +238,34 @@ Member._meta.get_field('email').null = False
 def count_active_members():
     return Member.objects.filter(status='member').count()
 
-def get_automatic_username(first_name, last_name):
+def get_automatic_username(member):
     """
     Calcul le username automatiquement en fonction
     du nom et du prénom
     """
 
-    # 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
-    username = ('%s%s' % (first_name_letters, last_name))
+    # S'il s'agit d'une entreprise, utilise son nom:
+    if member.type == 'legal_entity' and member.organization_name:
+        username = member.organization_name
+    # Sinon, si un pseudo est définit, l'utilise
+    elif member.nickname:
+        username = member.nickname
+    # Sinon, utilise nom et prenom
+    elif member.first_name and member.last_name:
+        # Première lettre de chaque partie du prénom
+        first_name_letters = ''.join(
+            [c[0] for c in member.first_name.split('-')]
+        )
+        # Concaténer avec nom de famille
+        username = ('%s%s' % (first_name_letters, member.last_name))
+    else:
+        raise Exception('Il n\'y a pas sufissement d\'informations pour déterminer un login automatiquement')
+
     # Remplacer ou enlever les caractères non ascii
     username = unicodedata.normalize('NFD', username)\
         .encode('ascii', 'ignore')
-    # Enlever ponctuation et espace
-    punctuation = (string.punctuation + ' ').encode('ascii')
+    # Enlever ponctuation (sauf _-.) et espace
+    punctuation = ('!"#$%&\'()*+,/:;<=>?@[\\]^`{|}~ ').encode('ascii')
     username = username.translate(None, punctuation)
     # En minuscule
     username = username.lower()
@@ -266,7 +276,7 @@ def get_automatic_username(first_name, last_name):
     member = Member.objects.filter(username=username)
     base_username = username
     incr = 2
-    # Tant qu'un membre est trouvé, incrément un entier à la fin
+    # Tant qu'un membre est trouvé, incrémente un entier à la fin
     while member:
         if len(base_username) >= 30:
             username = base_username[30-len(str(incr)):]
@@ -387,8 +397,7 @@ def define_username(sender, instance, **kwargs):
     le calcul automatiquement en fonction du nom et du prénom
     """
     if not instance.username and not instance.pk:
-        instance.username = get_automatic_username(instance.first_name, 
-                                                   instance.last_name)
+        instance.username = get_automatic_username(instance)
 
 
 @receiver(pre_save, sender=LdapUser)

+ 34 - 1
coin/members/tests.py

@@ -202,6 +202,28 @@ class MemberTests(TestCase):
         member2.delete()
         member3.delete()
 
+    def test_when_creating_legal_entity_organization_name_is_used_for_username(self):
+        """
+        Lors de la créatio d'une entreprise, son nom doit être utilisée lors de
+        la détermination automatique du username
+        """
+        random = os.urandom(4).encode('hex')
+        member = Member(type='legal_entity', organization_name='ILLYSE' + random, email='illyse@coin.org')
+        member.save()
+        self.assertEqual(member.username, 'illyse' + random)
+        member.delete()
+
+    def test_when_creating_member_with_nickname_it_is_used_for_username(self):
+        """
+        Lors de la création d'une personne, qui a un pseudo, celui-ci est utilisé en priorité
+        """
+        random = os.urandom(4).encode('hex')
+        member = Member(first_name='Richard', last_name='Stallman', nickname='rms' + random, email='illyse@coin.org')
+        member.save()
+        self.assertEqual(member.username, 'rms' + random)
+
+        member.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
@@ -291,7 +313,7 @@ class MemberTests(TestCase):
 
     def test_member_is_paid_up(self):
         """
-        Test que end_date_of_membership d'un membre envoi bien la date de fin d'adhésion
+        Test l'état "a jour de cotisation" d'un adhérent.
         """
         # Créé un membre
         first_name = 'Capitain'
@@ -327,6 +349,17 @@ class MemberTests(TestCase):
         # de cotisation
         self.assertEqual(member.is_paid_up(), True)
 
+    def test_member_cant_be_created_without_names(self):
+        """
+        Test qu'un membre ne peut pas être créé sans "noms"
+        (prenom, nom) ou pseudo ou nom d'organization
+        """
+        member = Member(username='blop')
+        self.assertRaises(Exception, member.save)
+
+        member = Member()
+        self.assertRaises(Exception, member.save)
+
 
 class MemberAdminTests(TestCase):