3 Commits fadd8623d9 ... f62a5a0007

Author SHA1 Message Date
  SimonBoulier f62a5a0007 Level permissions 7 years ago
  SimonBoulier fadd8623d9 todo 7 years ago
  SimonBoulier d4c8671914 Level permissions 7 years ago

+ 8 - 9
TODO.md

@@ -11,15 +11,14 @@
 [x] virer (ou faire fonctionner) le bouton 'Ajouter un abonnement' de la page de modification d'un membre qui fait planter
 
 [x] autocomplete dans prêt objet
-[ ] discuter avec qqn et faire PR
 
-[ ] notifs au bureau (gros truc)
-[ ] plusieurs row dans une RowLevel perm (pas indispensable)
+[ ] readme -> dossier doc @JocelynD
+[ ] check migrations @JocelynD
+[ ] relire tout le code @JocelynD
+[ ] faire PR
 
-[ ] commentaire mieux
-[x] readme
-[ ] check daimrod place date inscription et fin
-[ ] faire tester la secu
-[x] migrations propres
+[ ] notifs au bureau (gros truc)
 
-[ ] relire tout le code avec qqn !
+[ ] plusieurs row dans une RowLevel perm (pas indispensable)
+[ ] place de groupes dans admin
+[ ] générer nom de code row level perm

+ 10 - 11
coin/members/admin.py

@@ -36,23 +36,23 @@ class OfferSubscriptionInline(admin.TabularInline):
     model = OfferSubscription
     extra = 0
 
-    common_fields = ('subscription_date', 'resign_date', 'commitment', 'offer')
-    all_fields = ('get_subscription_reference',) + common_fields
+    writable_fields = ('subscription_date', 'resign_date', 'commitment', 'offer')
+    all_fields = ('get_subscription_reference',) + writable_fields
 
     def get_fields(self, request, obj=None):
         if obj:
             return self.all_fields
         else:
-            return self.common_fields
+            return self.writable_fields
 
-    # création de membre : lecture écriture
-    # modification d'un membre : lecture seule seulement
     def get_readonly_fields(self, request, obj=None):
-        if obj:
-            return self.all_fields
+        # création ou superuser : lecture écriture
+        if not obj or request.user.is_superuser:
+            return ('get_subscription_reference',)
+        # modification : lecture seule seulement
         else:
-            return ()
-
+            return self.all_fields
+    
     show_change_link = True
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
@@ -60,8 +60,7 @@ class OfferSubscriptionInline(admin.TabularInline):
             return super(OfferSubscriptionInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
         else:
             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)])
+                kwargs["queryset"] = RowLevelPermission.get_manageable_offers(request.user)
             return super(OfferSubscriptionInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
     # pas très beau

+ 5 - 5
coin/members/autocomplete_light_registry.py

@@ -8,13 +8,13 @@ from models import Member
 autocomplete_light.register(Member,
                             # Just like in ModelAdmin.search_fields
                             search_fields=[
-                                '^first_name', 'last_name', 'organization_name',
-                                'username', 'nickname'],
+                                '^first_name', '^last_name', 'organization_name',
+                                '^username', '^nickname'],
                             attrs={
                                 # This will set the input placeholder attribute:
-                                'placeholder': 'Nom/Prénom/Pseudo (min 4 caractères)',
+                                'placeholder': 'Nom/Prénom/Pseudo (min 3 caractères)',
                                 # Nombre minimum de caractères à saisir avant de compléter.
-                                # Fixé à 4 pour ne pas qu'on puisse avoir accès à la liste de tous les membres facilement quand on n'est pas superuser. Peut-être que 3 serait plus convénient.
-                                'data-autocomplete-minimum-characters': 4,
+                                # Fixé à 3 pour ne pas qu'on puisse avoir accès à la liste de tous les membres facilement quand on n'est pas superuser.
+                                'data-autocomplete-minimum-characters': 3,
                             },
 )

+ 10 - 6
coin/members/models.py

@@ -506,13 +506,13 @@ class RowLevelPermission(Permission):
         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()
-        # les RowLevelpermission qui correspondent et qui sont relatives à des OfferSubscription
-        rowperms = [p for p in cls.objects.filter(content_type=ContentType.objects.get_for_model(OfferSubscription))
-                   if ('offers.' + p.codename) in perms]
-        # les offres correspondantes
-        offers = [p.offer for p in rowperms]
-        return offers
+        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) # @JocelynD: un petit .distinct() ici non ?
 
     @classmethod
     def get_manageable_users(cls, user):
@@ -525,6 +525,10 @@ class RowLevelPermission(Permission):
             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'
+
 
 
 @receiver(pre_save, sender=Member)

+ 1 - 1
coin/offers/admin.py

@@ -38,7 +38,7 @@ class OfferSubscriptionAdmin(admin.ModelAdmin):
                     'offer', 'member')
     search_fields = ['member__first_name', 'member__last_name', 'member__email',
                      'member__nickname']
-
+    
     fields = (
                 'member',
                 'offer',

+ 1 - 1
coin/offers/forms.py

@@ -11,4 +11,4 @@ class OfferAdminForm(ModelForm):
         widgets = {
             'configuration_type': Select(choices=(('','---------'),) + Configuration.get_configurations_choices_list())
         }
-        exclude = ('', )
+        exclude = ('', )

+ 2 - 0
hardware_provisioning/admin.py

@@ -69,6 +69,8 @@ class ItemAdmin(admin.ModelAdmin):
     save_as = True
     actions = ['give_back']
 
+    form = autocomplete_light.modelform_factory(Loan, fields='__all__')
+
     def give_back(self, request, queryset):
         for item in queryset.filter(loans__loan_date_end=None):
             item.give_back()