From 813cbe7b13d19ac578fcbc60784f42e5bad449e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Fri, 26 Aug 2016 22:18:22 +0200 Subject: [PATCH 1/2] Meilleure gestion des permissions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Il n'est plus possible de modifier l'attribut `is_superuser` dans l'interface admin. les membres du burô ne doivent plus être super- utilisateurs en prévision de l'arrivée de l'appli K-Fêt. Pour donner les permissions adéquates au burô, il faut créer un groupe COF avec tous les droits sur les applis `gestioncof` et `bda` ainsi que les droits sur les d'utilisateurs et ajouter les membres du burô à ce groupe. --- gestioncof/admin.py | 13 +++++++++++++ gestioncof/shared.py | 3 +-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gestioncof/admin.py b/gestioncof/admin.py index 342317f3..db70946b 100644 --- a/gestioncof/admin.py +++ b/gestioncof/admin.py @@ -5,6 +5,7 @@ from __future__ import print_function from __future__ import unicode_literals from django.contrib import admin +from django.utils.translation import ugettext_lazy as _ from gestioncof.models import SurveyQuestionAnswer, SurveyQuestion, \ CofProfile, EventOption, EventOptionChoice, Event, Club, CustomMail, \ Survey, EventCommentField, EventRegistration @@ -162,6 +163,13 @@ class UserProfileAdmin(UserAdmin): return False is_cof.short_description = 'Membre du COF' is_cof.boolean = True + + fieldsets = [ + (None, {'fields': ['username', 'password']}), + (_('Personal info'), {'fields': ['first_name', 'last_name', 'email']}), + (_('Groups'), {'fields': ['groups']}) + ] + list_display = ('profile_num',) + UserAdmin.list_display \ + ('profile_login_clipper', 'profile_phone', 'profile_occupation', 'profile_mailing_cof', 'profile_mailing_bda', @@ -175,6 +183,11 @@ class UserProfileAdmin(UserAdmin): CofProfileInline, ] + def save_model(self, request, user, form, change): + if user.profile.is_buro: + user.is_staff = True + user.save() + # FIXME: This is absolutely horrible. def user_unicode(self): diff --git a/gestioncof/shared.py b/gestioncof/shared.py index fc901d50..87021a00 100644 --- a/gestioncof/shared.py +++ b/gestioncof/shared.py @@ -58,8 +58,7 @@ class COFCASBackend(CASBackend): if not user.email: user.email = settings.CAS_EMAIL_FORMAT % profile.login_clipper user.save() - if profile.is_buro and not user.is_superuser: - user.is_superuser = True + if profile.is_buro and not user.is_staff: user.is_staff = True user.save() return user From 9d5931fd6f73802d269bbd00c9b31b2dce41b5e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Tue, 30 Aug 2016 22:31:55 +0200 Subject: [PATCH 2/2] Meilleure gestion des permissions dans l'admin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Seul les superusers ont le contrôle sur les groupes et permissions. Un membre du burô est automatiquement ajouté au groupe COF, lui même créé automatiquement s'il n'existe pas. --- gestioncof/admin.py | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/gestioncof/admin.py b/gestioncof/admin.py index db70946b..09965785 100644 --- a/gestioncof/admin.py +++ b/gestioncof/admin.py @@ -12,10 +12,11 @@ from gestioncof.models import SurveyQuestionAnswer, SurveyQuestion, \ from gestioncof.petits_cours_models import PetitCoursDemande, \ PetitCoursSubject, PetitCoursAbility, PetitCoursAttribution, \ PetitCoursAttributionCounter -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group, Permission from django.contrib.auth.admin import UserAdmin from django.core.urlresolvers import reverse from django.utils.safestring import mark_safe +from django.db.models import Q import django.utils.six as six import autocomplete_light @@ -164,12 +165,6 @@ class UserProfileAdmin(UserAdmin): is_cof.short_description = 'Membre du COF' is_cof.boolean = True - fieldsets = [ - (None, {'fields': ['username', 'password']}), - (_('Personal info'), {'fields': ['first_name', 'last_name', 'email']}), - (_('Groups'), {'fields': ['groups']}) - ] - list_display = ('profile_num',) + UserAdmin.list_display \ + ('profile_login_clipper', 'profile_phone', 'profile_occupation', 'profile_mailing_cof', 'profile_mailing_bda', @@ -183,9 +178,38 @@ class UserProfileAdmin(UserAdmin): CofProfileInline, ] + staff_fieldsets = [ + (None, {'fields': ['username', 'password']}), + (_('Personal info'), {'fields': ['first_name', 'last_name', 'email']}), + ] + + def get_fieldsets(self, request, user=None): + if not request.user.is_superuser: + return self.staff_fieldsets + return super(UserProfileAdmin, self).get_fieldsets(request, user) + def save_model(self, request, user, form, change): + cof_group, created = Group.objects.get_or_create(name='COF') + if created: + # Si le groupe COF n'était pas déjà dans la bdd + # On lui assigne les bonnes permissions + perms = Permission.objects.filter( + Q(content_type__app_label='gestioncof') + | Q(content_type__app_label='bda') + | (Q(content_type__app_label='auth') + & Q(content_type__model='user'))) + cof_group.permissions = perms + # On y associe les membres du Burô + cof_group.user_set = User.objects.filter(profile__is_buro=True) + # Sauvegarde + cof_group.save() + # le Burô est staff et appartient au groupe COF if user.profile.is_buro: user.is_staff = True + user.groups.add(cof_group) + else: + user.is_staff = False + user.groups.remove(cof_group) user.save()