med/users/admin.py

132 lines
4.6 KiB
Python
Raw Normal View History

2019-08-02 12:57:53 +00:00
# -*- mode: python; coding: utf-8 -*-
# Copyright (C) 2017-2019 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from django.contrib import admin
2019-08-09 21:12:56 +00:00
from django.contrib import messages
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
2019-08-09 21:12:56 +00:00
from django.contrib.auth.forms import PasswordResetForm
2019-08-10 08:44:17 +00:00
from django.urls import reverse
2019-08-08 19:51:37 +00:00
from django.utils.html import format_html
2019-08-08 10:16:40 +00:00
from django.utils.translation import ugettext_lazy as _
from reversion.admin import VersionAdmin
2019-08-10 08:44:17 +00:00
from med.admin import admin_site
2019-08-09 20:52:47 +00:00
from .forms import UserCreationAdminForm
2019-08-09 21:17:55 +00:00
from .models import Adhesion, Clef, User
2019-08-02 12:57:53 +00:00
2017-07-03 18:06:21 +00:00
class ClefAdmin(VersionAdmin):
2019-08-08 12:55:20 +00:00
list_display = ('nom', 'proprio', 'commentaire')
2019-08-09 20:52:47 +00:00
ordering = ('nom',)
2019-08-10 08:44:17 +00:00
search_fields = ('nom', 'proprio', 'commentaire')
2019-08-10 09:42:27 +00:00
autocomplete_fields = ('proprio',)
2017-07-03 18:06:21 +00:00
2019-08-02 12:57:53 +00:00
class AdhesionAdmin(VersionAdmin):
list_display = ('annee_debut', 'annee_fin')
2019-08-10 09:42:27 +00:00
autocomplete_fields = ('adherent',)
2019-08-02 12:57:53 +00:00
class IsAdherentFilter(admin.SimpleListFilter):
title = _('adherent status')
parameter_name = 'is_adherent'
def lookups(self, request, model_admin):
return (
('Yes', _('Yes')),
)
def queryset(self, request, queryset):
value = self.value()
if value == 'Yes':
# Get current membership year and list all members
2019-08-08 17:16:54 +00:00
last_adh_year = Adhesion.objects.all().order_by('annee_debut') \
2019-08-08 13:35:25 +00:00
.reverse().first()
return last_adh_year.adherent
return queryset
class UserAdmin(VersionAdmin, BaseUserAdmin):
2019-08-08 10:16:40 +00:00
# Customize admin to add more fields
fieldsets = (
2019-08-02 19:35:30 +00:00
(None, {'fields': ('username', 'password')}),
2019-08-08 10:16:40 +00:00
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email',
'telephone', 'address', 'comment')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
'groups', 'user_permissions',
'maxemprunt')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
list_display = ('username', 'email', 'first_name', 'last_name',
2019-08-08 19:51:37 +00:00
'maxemprunt', 'is_adherent', 'is_staff', 'actions_btn')
list_filter = (IsAdherentFilter, 'is_staff', 'is_superuser', 'is_active',
'groups')
2019-08-09 20:52:47 +00:00
# Customize required initial fields
add_form_template = 'admin/change_form.html'
add_form = UserCreationAdminForm
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ("username", "email", "first_name", "last_name",
"address", "telephone"),
}),
)
2019-08-09 21:12:56 +00:00
def save_model(self, request, obj, form, change):
"""
On creation, send a password init mail
"""
super().save_model(request, obj, form, change)
if not change:
# Virtually fill the password reset form
password_reset = PasswordResetForm(data={'email': obj.email})
if password_reset.is_valid():
password_reset.save(request=request,
use_https=request.is_secure())
messages.success(request, _("An email to set the password"
" was sent."))
else:
messages.error(request, _("The email is invalid."))
def is_adherent(self, obj):
"""
Get current membership year and check if user is there
"""
2019-08-08 17:16:54 +00:00
last_adh_year = Adhesion.objects.all().order_by('annee_debut') \
2019-08-08 13:35:25 +00:00
.reverse().first()
2019-08-08 19:51:37 +00:00
is_member = last_adh_year and obj in last_adh_year.adherent.all()
if is_member:
return format_html(
'<img src="/static/admin/img/icon-yes.svg" alt="True">'
)
else:
# TODO permit adhere only if perms.users.add_user
return format_html(
'<img src="/static/admin/img/icon-no.svg" alt="False"> '
'<a class="button" href="{}">{}</a>',
reverse('users:adherer', args=[obj.pk]),
_('Adhere')
)
is_adherent.short_description = _('is adherent')
2019-08-08 19:51:37 +00:00
is_adherent.allow_tags = True
def actions_btn(self, obj):
# TODO permit adhere only if perms.media.add_emprunt
return format_html(
'<a class="button" href="{}">{}</a>',
reverse('media:add-emprunt', args=[obj.pk]),
_('Register borrowed item')
)
2019-08-08 19:51:37 +00:00
actions_btn.short_description = _('actions')
actions_btn.allow_tags = True
2019-08-08 17:16:54 +00:00
2019-08-02 12:57:53 +00:00
2019-08-10 06:04:46 +00:00
admin_site.register(User, UserAdmin)
admin_site.register(Adhesion, AdhesionAdmin)
admin_site.register(Clef, ClefAdmin)