Browse Source

Replace get_manageable_offers and get_manageable_users by manageable_by, an operation of the manager

(Only for the beauty of the code)
SimonBoulier 7 years ago
parent
commit
5d9325b852
4 changed files with 43 additions and 33 deletions
  1. 3 2
      coin/members/admin.py
  2. 17 26
      coin/members/models.py
  3. 5 5
      coin/offers/admin.py
  4. 18 0
      coin/offers/models.py

+ 3 - 2
coin/members/admin.py

@@ -61,7 +61,7 @@ class OfferSubscriptionInline(admin.TabularInline):
             return super(OfferSubscriptionInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
         else:
             if db_field.name == "offer":
-                kwargs["queryset"] = RowLevelPermission.get_manageable_offers(request.user)
+                kwargs["queryset"] = Offer.objects.manageable_by(request.user)
             return super(OfferSubscriptionInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     # pas très beau
@@ -74,6 +74,7 @@ class OfferSubscriptionInline(admin.TabularInline):
             return request.user.is_superuser
 
     # sinon on pourrait supprimer les abo qu'on ne peut pas gérer
+    # pourrait peut-être être plus fin, obj réfère ici au member de la page
     def has_delete_permission(self, request, obj=None):
         return request.user.is_superuser
 
@@ -144,7 +145,7 @@ class MemberAdmin(UserAdmin):
         if request.user.is_superuser:
             return qs
         else:
-            offers = RowLevelPermission.get_manageable_offers(request.user)
+            offers = Offer.objects.manageable_by(request.user)
             return qs.filter(offersubscription__offer__in=offers).distinct()
 
     def get_readonly_fields(self, request, obj=None):

+ 17 - 26
coin/members/models.py

@@ -9,7 +9,7 @@ from django.db import models
 from django.db.models import Q, Max
 from django.db.models.signals import pre_save
 from django.dispatch import receiver
-from django.contrib.auth.models import AbstractUser, Permission
+from django.contrib.auth.models import AbstractUser, Permission, UserManager
 from django.contrib.contenttypes.models import ContentType
 from django.conf import settings
 from django.core.validators import RegexValidator
@@ -22,6 +22,19 @@ from coin.mixins import CoinLdapSyncMixin
 from coin import utils
 
 
+
+class MemberManager(UserManager):
+    def manageable_by(self, user):
+        """" Renvoie la liste des members que l'utilisateur est autorisé à voir
+        dans l'interface d'administration.
+        """
+        if user.is_superuser:
+            return super(MemberManager, self).all()
+        else:
+            offers = Offer.objects.manageable_by(user)
+            return super(MemberManager, self).filter(offersubscription__offer__in=offers).distinct()
+
+
 class Member(CoinLdapSyncMixin, AbstractUser):
 
     # USERNAME_FIELD = 'login'
@@ -82,6 +95,8 @@ class Member(CoinLdapSyncMixin, AbstractUser):
     balance = models.DecimalField(max_digits=5, decimal_places=2, default=0,
                                   verbose_name='account balance')
 
+    objects = MemberManager()
+
     # Following fields are managed by the parent class AbstractUser :
     # username, first_name, last_name, email
     # However we hack the model to force theses fields to be required. (see
@@ -524,35 +539,11 @@ class RowLevelPermission(Permission):
         help_text="Offre dont l'utilisateur est autorisé à voir et modifier les membres et les abonnements.")
     description = models.TextField(blank=True)
 
-    @classmethod
-    def get_manageable_offers(cls, user):
-        """" Renvoie la liste des offres dont l'utilisateur est autorisé à
-        voir les membres et les abonnements dans l'interface d'administration.
-        """
-        # toutes les permissions appliquées à cet utilisateur
-        # (liste de chaines de caractères)
-        perms = user.get_all_permissions()
-        allowedcodenames = [ s.split('offers.',1)[1] for s in perms if s.startswith('offers.')]
-        # parmi toutes les RowLevelpermission, celles qui sont relatives à des OfferSubscription et qui sont dans allowedcodenames
-        rowperms = cls.objects.filter(content_type=ContentType.objects.get_for_model(OfferSubscription), codename__in=allowedcodenames)
-        # toutes les Offers pour lesquelles il existe une RowLevelpermission correspondante dans rowperms
-        return Offer.objects.filter(rowlevelpermission__in=rowperms).distinct()
-
-    @classmethod
-    def get_manageable_users(cls, user):
-        """" Renvoie la liste des members que l'utilisateur est autorisé à voir
-        dans l'interface d'administration.
-        """
-        if user.is_superuser:
-            return Member.objects.all()
-        else:
-            offers = RowLevelPermission.get_manageable_offers(user)
-            return Member.objects.filter(offersubscription__offer__in=offers).distinct()
-
     class Meta:
         verbose_name = 'permission fine'
         verbose_name_plural = 'permissions fines'
 
+
 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"

+ 5 - 5
coin/offers/admin.py

@@ -5,7 +5,7 @@ from django.contrib import admin
 from django.db.models import Q
 from polymorphic.admin import PolymorphicChildModelAdmin
 
-from coin.members.models import RowLevelPermission
+from coin.members.models import Member
 from coin.offers.models import Offer, OfferSubscription
 from coin.offers.offersubscription_filter import\
             OfferSubscriptionTerminationFilter,\
@@ -59,10 +59,10 @@ class OfferSubscriptionAdmin(admin.ModelAdmin):
             return super(OfferSubscriptionAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
         else:
             if db_field.name == "member":
-                kwargs["queryset"] = RowLevelPermission.get_manageable_users(request.user)
+                kwargs["queryset"] = Member.objects.manageable_by(request.user)
             if db_field.name == "offer":
-                # pouah c'est pas beau, faut faire mieux, ça serait bien que get_manageable_offers renvoie un QuerrySet plutôt qu'une liste
-                kwargs["queryset"] = Offer.objects.filter(id__in=[p.id for p in RowLevelPermission.get_manageable_offers(request.user)])
+                # 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)])
             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
@@ -71,7 +71,7 @@ class OfferSubscriptionAdmin(admin.ModelAdmin):
         if request.user.is_superuser:
             return qs
         else:
-            offers = RowLevelPermission.get_manageable_offers(request.user)
+            offers = Offer.objects.manageable_by(request.user)
             return qs.filter(offer__in=offers)
 
     def get_inline_instances(self, request, obj=None):

+ 18 - 0
coin/offers/models.py

@@ -7,8 +7,24 @@ from django.conf import settings
 from django.db import models
 from django.db.models import Count, Q
 from django.core.validators import MinValueValidator
+from django.contrib.contenttypes.models import ContentType
 
 
+class OfferManager(models.Manager):
+    def manageable_by(self, user):
+        """" Renvoie la liste des offres dont l'utilisateur est autorisé à
+        voir les membres et les abonnements dans l'interface d'administration.
+        """
+        from coin.members.models import RowLevelPermission
+        # toutes les permissions appliquées à cet utilisateur
+        # (liste de chaines de caractères)
+        perms = user.get_all_permissions()
+        allowedcodenames = [ s.split('offers.',1)[1] for s in perms if s.startswith('offers.')]
+        # parmi toutes les RowLevelPermission, celles qui sont relatives à des OfferSubscription et qui sont dans allowedcodenames
+        rowperms = RowLevelPermission.objects.filter(content_type=ContentType.objects.get_for_model(OfferSubscription), codename__in=allowedcodenames)
+        # toutes les Offers pour lesquelles il existe une RowLevelpermission correspondante dans rowperms
+        return super(OfferManager, self).filter(rowlevelpermission__in=rowperms).distinct()
+
 class Offer(models.Model):
     """Description of an offer available to subscribers.
 
@@ -44,6 +60,8 @@ class Offer(models.Model):
                                        verbose_name='n\'est pas facturable',
                                        help_text='L\'offre ne sera pas facturée par la commande charge_members')
 
+    objects = OfferManager()
+
     def get_configuration_type_display(self):
         """
         Renvoi le nom affichable du type de configuration