💄 Improve Django Admin

This commit is contained in:
Yohann D'ANELLO 2020-08-01 15:13:29 +02:00
parent 59bfdbbfc7
commit b6453ce03d
7 changed files with 180 additions and 85 deletions

View File

@ -4,6 +4,9 @@
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from note.templatetags.pretty_money import pretty_money
from note_kfet.admin import admin_site
from .forms import ProfileForm
@ -18,6 +21,7 @@ class ProfileInline(admin.StackedInline):
can_delete = False
@admin.register(User, site=admin_site)
class CustomUserAdmin(UserAdmin):
inlines = (ProfileInline,)
list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
@ -33,9 +37,33 @@ class CustomUserAdmin(UserAdmin):
return super().get_inline_instances(request, obj)
# Update Django User with profile
admin_site.register(User, CustomUserAdmin)
@admin.register(Club, site=admin_site)
class ClubAdmin(admin.ModelAdmin):
list_display = ('name', 'parent_club', 'email', 'require_memberships', 'pretty_fee_paid',
'pretty_fee_unpaid', 'membership_start', 'membership_end',)
ordering = ('name',)
search_fields = ('name', 'email',)
# Add other models
admin_site.register(Club)
admin_site.register(Membership)
def pretty_fee_paid(self, obj):
return pretty_money(obj.membership_fee_paid)
def pretty_fee_unpaid(self, obj):
return pretty_money(obj.membership_fee_unpaid)
pretty_fee_paid.short_description = _("membership fee (paid students)")
pretty_fee_unpaid.short_description = _("membership fee (unpaid students)")
@admin.register(Membership, site=admin_site)
class MembershipAdmin(admin.ModelAdmin):
list_display = ('user', 'club', 'date_start', 'date_end', 'view_roles', 'pretty_fee',)
ordering = ('-date_start', 'club')
def view_roles(self, obj):
return ", ".join(role.name for role in obj.roles.all())
def pretty_fee(self, obj):
return pretty_money(obj.fee)
view_roles.short_description = _("roles")
pretty_fee.short_description = _("fee")

View File

@ -10,6 +10,7 @@ from note_kfet.admin import admin_site
from .models.notes import Alias, Note, NoteClub, NoteSpecial, NoteUser
from .models.transactions import Transaction, TemplateCategory, TransactionTemplate, \
RecurrentTransaction, MembershipTransaction, SpecialTransaction
from .templatetags.pretty_money import pretty_money
class AliasInlines(admin.TabularInline):
@ -37,7 +38,7 @@ class NoteAdmin(PolymorphicParentModelAdmin):
# Organize notes by registration date
date_hierarchy = 'created_at'
ordering = ['-created_at']
ordering = ['name']
# Search by aliases
search_fields = ['alias__name']
@ -74,6 +75,18 @@ class NoteSpecialAdmin(PolymorphicChildModelAdmin):
"""
readonly_fields = ('balance',)
def has_add_permission(self, request):
"""
A club note should not be manually added
"""
return False
def has_delete_permission(self, request, obj=None):
"""
A club note should not be manually removed
"""
return False
@admin.register(NoteUser, site=admin_site)
class NoteUserAdmin(PolymorphicChildModelAdmin):
@ -103,11 +116,11 @@ class TransactionAdmin(PolymorphicParentModelAdmin):
"""
Admin customisation for Transaction
"""
child_models = (RecurrentTransaction, MembershipTransaction, SpecialTransaction)
child_models = (Transaction, RecurrentTransaction, MembershipTransaction, SpecialTransaction)
list_display = ('created_at', 'poly_source', 'poly_destination',
'quantity', 'amount', 'valid')
list_filter = ('valid',)
autocomplete_fields = (
readonly_fields = (
'source',
'destination',
)
@ -146,6 +159,13 @@ class MembershipTransactionAdmin(PolymorphicChildModelAdmin):
"""
@admin.register(RecurrentTransaction, site=admin_site)
class RecurrentTransactionAdmin(PolymorphicChildModelAdmin):
"""
Admin customisation for RecurrentTransaction
"""
@admin.register(SpecialTransaction, site=admin_site)
class SpecialTransactionAdmin(PolymorphicChildModelAdmin):
"""
@ -158,8 +178,9 @@ class TransactionTemplateAdmin(admin.ModelAdmin):
"""
Admin customisation for TransactionTemplate
"""
list_display = ('name', 'poly_destination', 'amount', 'category', 'display',)
list_filter = ('category', 'display')
list_display = ('name', 'poly_destination', 'pretty_amount', 'category', 'display', 'highlighted',)
list_filter = ('category', 'display', 'highlighted',)
search_fields = ('name', 'destination__club__name', 'amount',)
autocomplete_fields = ('destination',)
def poly_destination(self, obj):
@ -170,6 +191,11 @@ class TransactionTemplateAdmin(admin.ModelAdmin):
poly_destination.short_description = _('destination')
def pretty_amount(self, obj):
return pretty_money(obj.amount)
pretty_amount.short_description = _("amount")
@admin.register(TemplateCategory, site=admin_site)
class TemplateCategoryAdmin(admin.ModelAdmin):
@ -177,4 +203,3 @@ class TemplateCategoryAdmin(admin.ModelAdmin):
Admin customisation for TransactionTemplate
"""
list_display = ('name',)
list_filter = ('name',)

View File

@ -20,7 +20,9 @@ class PermissionAdmin(admin.ModelAdmin):
"""
Admin customisation for Permission
"""
list_display = ('type', 'model', 'field', 'mask', 'description', )
list_display = ('description', 'type', 'model', 'field', 'mask', )
list_filter = ('type', 'mask', 'model',)
search_fields = ('description', 'field',)
@admin.register(Role, site=admin_site)

View File

@ -28,4 +28,15 @@ class RemittanceAdmin(admin.ModelAdmin):
return not obj.closed and super().has_change_permission(request, obj)
admin_site.register(SogeCredit)
@admin.register(SogeCredit, site=admin_site)
class SogeCreditAdmin(admin.ModelAdmin):
"""
Admin customisation for Remittance
"""
list_display = ('user', 'valid',)
readonly_fields = ('transactions', 'credit_transaction',)
def has_add_permission(self, request):
# Don't create a credit manually
return False

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-01 10:47+0200\n"
"POT-Creation-Date: 2020-08-01 15:06+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -193,7 +193,7 @@ msgstr ""
#: apps/activity/tables.py:79 apps/member/forms.py:107
#: apps/registration/forms.py:69 apps/treasury/forms.py:122
#: templates/note/transaction_form.html:127
#: templates/note/transaction_form.html:129
msgid "First name"
msgstr ""
@ -291,6 +291,24 @@ msgstr ""
msgid "changelogs"
msgstr ""
#: apps/member/admin.py:53 apps/member/models.py:178
#: templates/member/club_info.html:41
msgid "membership fee (paid students)"
msgstr ""
#: apps/member/admin.py:54 apps/member/models.py:183
#: templates/member/club_info.html:44
msgid "membership fee (unpaid students)"
msgstr ""
#: apps/member/admin.py:68 apps/member/models.py:270
msgid "roles"
msgstr ""
#: apps/member/admin.py:69 apps/member/models.py:284
msgid "fee"
msgstr ""
#: apps/member/apps.py:14 apps/wei/tables.py:150 apps/wei/tables.py:181
msgid "member"
msgstr ""
@ -324,7 +342,7 @@ msgid "Credit amount"
msgstr ""
#: apps/member/forms.py:112 apps/registration/forms.py:74
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:133
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:135
msgid "Bank"
msgstr ""
@ -478,14 +496,6 @@ msgstr ""
msgid "Uncheck if this club don't require memberships."
msgstr ""
#: apps/member/models.py:178 templates/member/club_info.html:41
msgid "membership fee (paid students)"
msgstr ""
#: apps/member/models.py:183 templates/member/club_info.html:44
msgid "membership fee (unpaid students)"
msgstr ""
#: apps/member/models.py:189 templates/member/club_info.html:33
msgid "membership duration"
msgstr ""
@ -521,10 +531,6 @@ msgstr ""
msgid "clubs"
msgstr ""
#: apps/member/models.py:270
msgid "roles"
msgstr ""
#: apps/member/models.py:275
msgid "membership starts on"
msgstr ""
@ -533,10 +539,6 @@ msgstr ""
msgid "membership ends on"
msgstr ""
#: apps/member/models.py:284
msgid "fee"
msgstr ""
#: apps/member/models.py:303 apps/member/views.py:535 apps/wei/views.py:797
msgid "User is not a member of the parent club"
msgstr ""
@ -645,15 +647,20 @@ msgstr ""
msgid "Members of the club"
msgstr ""
#: apps/note/admin.py:121 apps/note/models/transactions.py:106
#: apps/note/admin.py:134 apps/note/models/transactions.py:106
msgid "source"
msgstr ""
#: apps/note/admin.py:129 apps/note/admin.py:171
#: apps/note/admin.py:142 apps/note/admin.py:192
#: apps/note/models/transactions.py:55 apps/note/models/transactions.py:119
msgid "destination"
msgstr ""
#: apps/note/admin.py:197 apps/note/models/transactions.py:59
#: apps/note/models/transactions.py:137
msgid "amount"
msgstr ""
#: apps/note/forms.py:14
msgid "select an image"
msgstr ""
@ -775,10 +782,6 @@ msgstr ""
msgid "A template with this name already exist"
msgstr ""
#: apps/note/models/transactions.py:59 apps/note/models/transactions.py:137
msgid "amount"
msgstr ""
#: apps/note/models/transactions.py:60
msgid "in centimes"
msgstr ""
@ -834,7 +837,7 @@ msgstr ""
#: apps/note/models/transactions.py:230
#: templates/activity/activity_entry.html:13 templates/base.html:99
#: templates/note/transaction_form.html:15
#: templates/note/transaction_form.html:141
#: templates/note/transaction_form.html:143
msgid "Transfer"
msgstr ""
@ -1128,7 +1131,7 @@ msgid "You can't change the type of the remittance."
msgstr ""
#: apps/treasury/forms.py:126 apps/treasury/tables.py:47
#: apps/treasury/tables.py:113 templates/note/transaction_form.html:95
#: apps/treasury/tables.py:113 templates/note/transaction_form.html:97
#: templates/treasury/remittance_form.html:18
msgid "Amount"
msgstr ""
@ -1149,7 +1152,7 @@ msgstr ""
msgid "Description"
msgstr ""
#: apps/treasury/models.py:48 templates/note/transaction_form.html:121
#: apps/treasury/models.py:48 templates/note/transaction_form.html:123
msgid "Name"
msgstr ""
@ -1942,7 +1945,7 @@ msgid "Consum"
msgstr ""
#: templates/note/conso_form.html:39 templates/note/transaction_form.html:57
#: templates/note/transaction_form.html:76
#: templates/note/transaction_form.html:78
msgid "Name or alias..."
msgstr ""
@ -1966,7 +1969,7 @@ msgstr ""
msgid "Double consumptions"
msgstr ""
#: templates/note/conso_form.html:150 templates/note/transaction_form.html:152
#: templates/note/conso_form.html:150 templates/note/transaction_form.html:154
msgid "Recent transactions history"
msgstr ""
@ -1974,23 +1977,23 @@ msgstr ""
msgid "Select emitters"
msgstr ""
#: templates/note/transaction_form.html:60
#: templates/note/transaction_form.html:61
msgid "I am the emitter"
msgstr ""
#: templates/note/transaction_form.html:70
#: templates/note/transaction_form.html:72
msgid "Select receivers"
msgstr ""
#: templates/note/transaction_form.html:87
#: templates/note/transaction_form.html:89
msgid "Action"
msgstr ""
#: templates/note/transaction_form.html:102
#: templates/note/transaction_form.html:104
msgid "Reason"
msgstr ""
#: templates/note/transaction_form.html:111
#: templates/note/transaction_form.html:113
msgid "Transfer type"
msgstr ""
@ -2102,7 +2105,7 @@ msgid "Log in again"
msgstr ""
#: templates/registration/login.html:7 templates/registration/login.html:8
#: templates/registration/login.html:22
#: templates/registration/login.html:31
#: templates/registration/password_reset_complete.html:10
msgid "Log in"
msgstr ""
@ -2116,6 +2119,12 @@ msgid ""
msgstr ""
#: templates/registration/login.html:23
msgid ""
"You must be logged with a staff account with the higher mask to access "
"Django Admin."
msgstr ""
#: templates/registration/login.html:32
msgid "Forgotten your password or username?"
msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-01 10:47+0200\n"
"POT-Creation-Date: 2020-08-01 15:06+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -194,7 +194,7 @@ msgstr "Nom de famille"
#: apps/activity/tables.py:79 apps/member/forms.py:107
#: apps/registration/forms.py:69 apps/treasury/forms.py:122
#: templates/note/transaction_form.html:127
#: templates/note/transaction_form.html:129
msgid "First name"
msgstr "Prénom"
@ -292,6 +292,24 @@ msgstr "journal de modification"
msgid "changelogs"
msgstr "journaux de modifications"
#: apps/member/admin.py:53 apps/member/models.py:178
#: templates/member/club_info.html:41
msgid "membership fee (paid students)"
msgstr "cotisation pour adhérer (normalien élève)"
#: apps/member/admin.py:54 apps/member/models.py:183
#: templates/member/club_info.html:44
msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)"
#: apps/member/admin.py:68 apps/member/models.py:270
msgid "roles"
msgstr "rôles"
#: apps/member/admin.py:69 apps/member/models.py:284
msgid "fee"
msgstr "cotisation"
#: apps/member/apps.py:14 apps/wei/tables.py:150 apps/wei/tables.py:181
msgid "member"
msgstr "adhérent"
@ -325,7 +343,7 @@ msgid "Credit amount"
msgstr "Montant à créditer"
#: apps/member/forms.py:112 apps/registration/forms.py:74
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:133
#: apps/treasury/forms.py:124 templates/note/transaction_form.html:135
msgid "Bank"
msgstr "Banque"
@ -479,14 +497,6 @@ msgstr "nécessite des adhésions"
msgid "Uncheck if this club don't require memberships."
msgstr "Décochez si ce club n'utilise pas d'adhésions."
#: apps/member/models.py:178 templates/member/club_info.html:41
msgid "membership fee (paid students)"
msgstr "cotisation pour adhérer (normalien élève)"
#: apps/member/models.py:183 templates/member/club_info.html:44
msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)"
#: apps/member/models.py:189 templates/member/club_info.html:33
msgid "membership duration"
msgstr "durée de l'adhésion"
@ -526,10 +536,6 @@ msgstr "club"
msgid "clubs"
msgstr "clubs"
#: apps/member/models.py:270
msgid "roles"
msgstr "rôles"
#: apps/member/models.py:275
msgid "membership starts on"
msgstr "l'adhésion commence le"
@ -538,10 +544,6 @@ msgstr "l'adhésion commence le"
msgid "membership ends on"
msgstr "l'adhésion finit le"
#: apps/member/models.py:284
msgid "fee"
msgstr "cotisation"
#: apps/member/models.py:303 apps/member/views.py:535 apps/wei/views.py:797
msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent"
@ -652,15 +654,20 @@ msgstr "Gérer les rôles d'un utilisateur dans le club"
msgid "Members of the club"
msgstr "Membres du club"
#: apps/note/admin.py:121 apps/note/models/transactions.py:106
#: apps/note/admin.py:134 apps/note/models/transactions.py:106
msgid "source"
msgstr "source"
#: apps/note/admin.py:129 apps/note/admin.py:171
#: apps/note/admin.py:142 apps/note/admin.py:192
#: apps/note/models/transactions.py:55 apps/note/models/transactions.py:119
msgid "destination"
msgstr "destination"
#: apps/note/admin.py:197 apps/note/models/transactions.py:59
#: apps/note/models/transactions.py:137
msgid "amount"
msgstr "montant"
#: apps/note/forms.py:14
msgid "select an image"
msgstr "Choisissez une image"
@ -783,10 +790,6 @@ msgstr "catégories de transaction"
msgid "A template with this name already exist"
msgstr "Un modèle de transaction avec un nom similaire existe déjà."
#: apps/note/models/transactions.py:59 apps/note/models/transactions.py:137
msgid "amount"
msgstr "montant"
#: apps/note/models/transactions.py:60
msgid "in centimes"
msgstr "en centimes"
@ -844,7 +847,7 @@ msgstr ""
#: apps/note/models/transactions.py:230
#: templates/activity/activity_entry.html:13 templates/base.html:99
#: templates/note/transaction_form.html:15
#: templates/note/transaction_form.html:141
#: templates/note/transaction_form.html:143
msgid "Transfer"
msgstr "Virement"
@ -1155,7 +1158,7 @@ msgid "You can't change the type of the remittance."
msgstr "Vous ne pouvez pas changer le type de la remise."
#: apps/treasury/forms.py:126 apps/treasury/tables.py:47
#: apps/treasury/tables.py:113 templates/note/transaction_form.html:95
#: apps/treasury/tables.py:113 templates/note/transaction_form.html:97
#: templates/treasury/remittance_form.html:18
msgid "Amount"
msgstr "Montant"
@ -1176,7 +1179,7 @@ msgstr "Objet"
msgid "Description"
msgstr "Description"
#: apps/treasury/models.py:48 templates/note/transaction_form.html:121
#: apps/treasury/models.py:48 templates/note/transaction_form.html:123
msgid "Name"
msgstr "Nom"
@ -2002,7 +2005,7 @@ msgid "Consum"
msgstr "Consommer"
#: templates/note/conso_form.html:39 templates/note/transaction_form.html:57
#: templates/note/transaction_form.html:76
#: templates/note/transaction_form.html:78
msgid "Name or alias..."
msgstr "Pseudo ou alias ..."
@ -2026,7 +2029,7 @@ msgstr "Consommations simples"
msgid "Double consumptions"
msgstr "Consommations doubles"
#: templates/note/conso_form.html:150 templates/note/transaction_form.html:152
#: templates/note/conso_form.html:150 templates/note/transaction_form.html:154
msgid "Recent transactions history"
msgstr "Historique des transactions récentes"
@ -2034,23 +2037,23 @@ msgstr "Historique des transactions récentes"
msgid "Select emitters"
msgstr "Sélection des émetteurs"
#: templates/note/transaction_form.html:60
#: templates/note/transaction_form.html:61
msgid "I am the emitter"
msgstr "Je suis l'émetteur"
#: templates/note/transaction_form.html:70
#: templates/note/transaction_form.html:72
msgid "Select receivers"
msgstr "Sélection des destinataires"
#: templates/note/transaction_form.html:87
#: templates/note/transaction_form.html:89
msgid "Action"
msgstr "Action"
#: templates/note/transaction_form.html:102
#: templates/note/transaction_form.html:104
msgid "Reason"
msgstr "Raison"
#: templates/note/transaction_form.html:111
#: templates/note/transaction_form.html:113
msgid "Transfer type"
msgstr "Type de transfert"
@ -2166,7 +2169,7 @@ msgid "Log in again"
msgstr "Se connecter à nouveau"
#: templates/registration/login.html:7 templates/registration/login.html:8
#: templates/registration/login.html:22
#: templates/registration/login.html:31
#: templates/registration/password_reset_complete.html:10
msgid "Log in"
msgstr "Se connecter"
@ -2183,6 +2186,14 @@ msgstr ""
"masque de permissions plus fort ?"
#: templates/registration/login.html:23
msgid ""
"You must be logged with a staff account with the higher mask to access "
"Django Admin."
msgstr ""
"Vous devez être connecté avec un compte staff avec le masque le plus haut "
"pour accéder à Django Admin."
#: templates/registration/login.html:32
msgid "Forgotten your password or username?"
msgstr "Mot de passe ou pseudo oublié ?"

View File

@ -17,6 +17,15 @@ SPDX-License-Identifier: GPL-2.0-or-later
{% endblocktrans %}
</p>
{% endif %}
{% if request.resolver_match.view_name == 'admin:login' %}
<div class="alert alert-info">
{% blocktrans trimmed %}
You must be logged with a staff account with the higher mask to access Django Admin.
{% endblocktrans %}
</div>
{% endif %}
<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
{{ form | crispy }}
<input type="submit" value="{% trans 'Log in' %}" class="btn btn-primary">