1
0

3 Commits de3bb650aa ... 7edf5b7601

Auteur SHA1 Message Date
  SimonBoulier 7edf5b7601 Factorisation de code dans formfield_for_foreignkey il y a 7 ans
  SimonBoulier de91d6b1b3 Surcharge RowLevelPermission.save.() au lieu d'utiliser des signaux il y a 7 ans
  SimonBoulier b1695a952d Use slugify for get_automatic_codename il y a 7 ans
2 fichiers modifiés avec 31 ajouts et 48 suppressions
  1. 29 43
      coin/members/models.py
  2. 2 5
      coin/offers/admin.py

+ 29 - 43
coin/members/models.py

@@ -15,6 +15,7 @@ from django.conf import settings
 from django.core.validators import RegexValidator
 from django.core.validators import RegexValidator
 from django.core.exceptions import ValidationError
 from django.core.exceptions import ValidationError
 from django.utils import timezone
 from django.utils import timezone
+from django.utils.text import slugify
 from ldapdb.models.fields import CharField, IntegerField, ListField
 from ldapdb.models.fields import CharField, IntegerField, ListField
 
 
 from coin.offers.models import Offer, OfferSubscription
 from coin.offers.models import Offer, OfferSubscription
@@ -538,6 +539,34 @@ class RowLevelPermission(Permission):
         help_text="Offre dont l'utilisateur est autorisé à voir et modifier les membres et les abonnements.")
         help_text="Offre dont l'utilisateur est autorisé à voir et modifier les membres et les abonnements.")
     description = models.TextField(blank=True)
     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:
     class Meta:
         verbose_name = 'permission fine'
         verbose_name = 'permission fine'
         verbose_name_plural = 'permissions fines'
         verbose_name_plural = 'permissions fines'
@@ -546,46 +575,3 @@ class RowLevelPermission(Permission):
 RowLevelPermission._meta.get_field('codename').blank = True
 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('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"
 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.
-    """
-    if perm.name:
-        codename = perm.name
-    else:
-        raise Exception('Il n\'y a pas sufissement d\'informations pour déterminer un codename automatiquement')
-
-    # Remplacer ou enlever les caractères non ascii
-    codename = unicodedata.normalize('NFD', codename)\
-        .encode('ascii', 'ignore')
-    # Enlever ponctuation (sauf _-.) et espace
-    punctuation = ('!"#$%&\'()*+,/:;<=>?@[\\]^`{|}~').encode('ascii')
-    codename = codename.translate(None, punctuation)
-    # En minuscule
-    codename = codename.lower()
-    # Maximum de 30 char
-    codename = codename[:30]
-    codename = codename.strip().replace(' ', '-')
-
-    # 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)

+ 2 - 5
coin/offers/admin.py

@@ -55,15 +55,12 @@ class OfferSubscriptionAdmin(admin.ModelAdmin):
 
 
     # Si pas super user on restreint les membres et offres accessibles
     # Si pas super user on restreint les membres et offres accessibles
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
-        if request.user.is_superuser:
-            return super(OfferSubscriptionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
-        else:
+        if not request.user.is_superuser:
             if db_field.name == "member":
             if db_field.name == "member":
                 kwargs["queryset"] = Member.objects.manageable_by(request.user)
                 kwargs["queryset"] = Member.objects.manageable_by(request.user)
             if db_field.name == "offer":
             if db_field.name == "offer":
-                # pouah c'est pas beau, faut faire mieux, ça serait bien que manageable_by renvoie un QuerrySet plutôt qu'une liste
                 kwargs["queryset"] = Offer.objects.filter(id__in=[p.id for p in Offer.objects.manageable_by(request.user)])
                 kwargs["queryset"] = Offer.objects.filter(id__in=[p.id for p in Offer.objects.manageable_by(request.user)])
-            return super(OfferSubscriptionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
+        return super(OfferSubscriptionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
 
     # Si pas super user on restreint la liste des offres que l'on peut voir
     # Si pas super user on restreint la liste des offres que l'on peut voir
     def get_queryset(self, request):
     def get_queryset(self, request):