Browse Source

Surcharge RowLevelPermission.save.() au lieu d'utiliser des signaux

SimonBoulier 7 years ago
parent
commit
800bffa6c8
1 changed files with 28 additions and 32 deletions
  1. 28 32
      coin/members/models.py

+ 28 - 32
coin/members/models.py

@@ -540,6 +540,34 @@ class RowLevelPermission(Permission):
         help_text="Offre dont l'utilisateur est autorisé à voir et modifier les membres et les abonnements.")
     description = models.TextField(blank=True)
 
+    def save(self, *args, **kwargs):
+        """
+        Lors de la sauvegarde d'une RowLevelPermission. Si le champ codename n'est pas définit,
+        le calcul automatiquement.
+        """
+        if not self.codename:
+            self.codename = self.generate_codename()
+        return super(RowLevelPermission, self).save(*args, **kwargs)
+
+    def generate_codename(self):
+        """
+        Calcule le codename automatiquement en fonction du name.
+        """
+        # Convertit en ASCII. Convertit les espaces en tirets. Enlève les caractères qui ne sont ni alphanumériques, ni soulignements, ni tirets. Convertit en minuscules. Les espaces en début et fin de chaîne sont aussi enlevés
+        codename = slugify(self.name)
+        # Maximum de 30 char
+        codename = codename[:30]
+        # Recherche dans les membres existants un codename identique
+        perm = Permission.objects.filter(codename=codename)
+        base_codename = codename
+        incr = 2
+        # Tant qu'une permission est trouvée, incrémente un entier à la fin
+        while perm:
+            codename = base_codename + str(incr)
+            perm = Permission.objects.filter(codename=codename)
+            incr += 1
+        return codename
+
     class Meta:
         verbose_name = 'permission fine'
         verbose_name_plural = 'permissions fines'
@@ -548,35 +576,3 @@ class RowLevelPermission(Permission):
 RowLevelPermission._meta.get_field('codename').blank = True
 RowLevelPermission._meta.get_field('codename').help_text = 'Laisser vide pour le générer automatiquement'
 RowLevelPermission._meta.get_field('content_type').help_text = "Garder 'abonnement' pour une utilisation normale"
-
-def get_automatic_codename(perm):
-    """
-    Calcule le codename automatiquement en fonction du name.
-    """
-
-    # Convertit en ASCII. Convertit les espaces en tirets. Enlève les caractères qui ne sont ni alphanumériques, ni soulignements, ni tirets. Convertit en minuscules. Les espaces en début et fin de chaîne sont aussi enlevés
-    codename = slugify(perm.name)
-    # Maximum de 30 char
-    codename = codename[:30]
-
-    # Recherche dans les membres existants un codename identique
-    perm = Permission.objects.filter(codename=codename)
-    base_codename = codename
-    incr = 2
-    # Tant qu'une permission est trouvée, incrémente un entier à la fin
-    while perm:
-        codename = base_codename + str(incr)
-        perm = Permission.objects.filter(codename=codename)
-        incr += 1
-
-    return codename
-
-
-@receiver(pre_save, sender=RowLevelPermission)
-def define_codename(sender, instance, **kwargs):
-    """
-    Lors de la sauvegarde d'une RowLevelPermission. Si le champ codename n'est pas définit,
-    le calcul automatiquement.
-    """
-    if not instance.codename:
-        instance.codename = get_automatic_codename(instance)