|
@@ -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"
|