ernestophone.ens.fr/gestion/admin.py

118 lines
3.8 KiB
Python
Raw Normal View History

"""
Administration minimaliste du site de l'Ernestophone.
Les chefs peuvent modifier les utilisateurs et les événements.
Les super-utilisateurs peuvent en plus ajouter ou supprimer ces objets et gérer
les permissions.
"""
2015-03-17 19:03:51 +01:00
from django.contrib import admin
from django.contrib.auth.models import User, Group, Permission
2015-03-17 19:03:51 +01:00
from django.contrib.auth.admin import UserAdmin
from gestion.models import ErnestoUser
2015-04-13 18:56:43 +02:00
from calendrier.models import Event
2015-03-17 19:03:51 +01:00
2015-03-17 19:03:51 +01:00
class UserProfileInline(admin.StackedInline):
"""Affichage du profil ernestophone dans la vue UserAdmin"""
2019-03-16 18:32:49 +01:00
2015-03-17 19:03:51 +01:00
model = ErnestoUser
2015-03-17 19:03:51 +01:00
def ProfileInfo(field, short_description, boolean=False):
def getter(self):
try:
return getattr(self.profile, field)
except ErnestoUser.DoesNotExist:
return ""
2019-03-16 18:32:49 +01:00
2015-03-17 19:03:51 +01:00
getter.short_description = short_description
getter.boolean = boolean
return getter
2019-03-16 18:32:49 +01:00
User.profile_doodlename = ProfileInfo("doodlename", "Nom pour le doodle")
2015-03-17 19:03:51 +01:00
User.profile_phone = ProfileInfo("phone", "Telephone")
User.profile_instru = ProfileInfo("instru", "Instrument joué")
User.profile_is_ern = ProfileInfo("is_ernesto", "Ernestophoniste")
User.profile_is_chef = ProfileInfo("is_chef", "Chef Fanfare")
User.profile_get_mails = ProfileInfo("mails", "Recevoir les mails")
2015-03-17 19:03:51 +01:00
2015-03-17 19:03:51 +01:00
class UserProfileAdmin(UserAdmin):
"""
Management des utilisateurs de l'ernestosite.
Lors de la sauvegarde, les chefs se voient octroyées les permissions
d'édition des comptes et événements mais il ne peuvent pas en créer via
l'interface admin.
"""
2019-03-16 18:32:49 +01:00
list_display = [
"username",
"first_name",
"last_name",
"email",
"profile_doodlename",
2019-03-16 18:32:49 +01:00
"profile_phone",
"profile_instru",
"profile_is_ern",
"profile_is_chef",
]
list_display_links = ["username", "email", "first_name", "last_name"]
list_filter = ["profile__instru"]
ordering = ["username"]
search_fields = [
"username",
"first_name",
"last_name",
"profile__phone",
"profile__instru",
]
inlines = [UserProfileInline]
staff_fieldsets = [
2019-03-16 18:32:49 +01:00
("Général", {"fields": ["username", "password", "first_name", "last_name"]}),
("Permissions", {"fields": ["is_active"]}),
]
def get_fieldsets(self, request, user=None):
"""
Les super utilisateurs ont toutes les infos.
Les autres (e.g. les chefs) ne peuvent modifier qu'un nombre restreints
de choses.
"""
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):
"""
Ajoute le chef au group Chef.
Le groupe est créé si nécessaire.
"""
chef_group, created = Group.objects.get_or_create(name="Chef")
if created:
# Si le groupe vient d'être créé :
# On associe les bonnes permissions au groupe Chef
2019-03-16 18:32:49 +01:00
perms = [
("change_user", "auth", "user"),
("change_event", "calendrier", "event"),
("change_ernestouser", "gestion", "ernestouser"),
]
for nat_key in perms:
perm = Permission.objects.get_by_natural_key(*nat_key)
chef_group.permissions.add(perm)
# On met tous les chef dans le groupe
2018-01-05 09:54:23 +01:00
chef_group.user_set.set(User.objects.filter(profile__is_chef=True))
# Les chefs sont dans le groupe Chef
if user.profile.is_chef:
print("J'aime la choucroute")
user.is_staff = True
user.groups.add(chef_group)
user.save()
2015-03-28 18:54:48 +01:00
2015-03-17 19:03:51 +01:00
admin.site.unregister(User)
admin.site.register(User, UserProfileAdmin)
2015-04-13 18:56:43 +02:00
admin.site.register(Event)