1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2025-06-21 20:38:24 +02:00

Improve Django-admin interface, inlines and filters

Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
Emmy D'Anello
2024-02-23 21:43:44 +01:00
parent cae1c6fdb8
commit de504398d2
6 changed files with 372 additions and 185 deletions

View File

@ -3,13 +3,45 @@
from django.contrib import admin
from django.contrib.admin import ModelAdmin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _
from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicParentModelAdmin
from polymorphic.admin import PolymorphicChildModelAdmin, PolymorphicChildModelFilter, PolymorphicParentModelAdmin, \
PolymorphicInlineSupportMixin, StackedPolymorphicInline
from .models import CoachRegistration, ParticipantRegistration, Payment, Registration, \
StudentRegistration, VolunteerRegistration
class RegistrationInline(StackedPolymorphicInline):
class StudentRegistrationInline(StackedPolymorphicInline.Child):
model = StudentRegistration
autocomplete_fields = ('team',)
show_change_link = True
class CoachRegistrationInline(StackedPolymorphicInline.Child):
model = CoachRegistration
autocomplete_fields = ('team',)
show_change_link = True
class VolunteerRegistrationInline(StackedPolymorphicInline.Child):
model = VolunteerRegistration
show_change_link = True
model = Registration
child_inlines = (
StudentRegistrationInline,
CoachRegistrationInline,
VolunteerRegistrationInline,
)
class PaymentInline(admin.TabularInline):
model = Payment
extra = 0
autocomplete_fields = ('registrations',)
@admin.register(Registration)
class RegistrationAdmin(PolymorphicParentModelAdmin):
child_models = (StudentRegistration, CoachRegistration, VolunteerRegistration,)
@ -97,12 +129,34 @@ class VolunteerRegistrationAdmin(PolymorphicChildModelAdmin):
@admin.register(Payment)
class PaymentAdmin(ModelAdmin):
list_display = ('id', 'concerned_people', 'grouped', 'type', 'valid', )
search_fields = ('registrations__user__last_name', 'registrations__user__first_name', 'registrations__user__email',)
list_display = ('concerned_people', 'tournament', 'team', 'grouped', 'type', 'amount', 'valid', )
search_fields = ('registrations__user__last_name', 'registrations__user__first_name', 'registrations__user__email',
'registrations__team__name', 'registrations__team__participation__team__trigram',)
list_filter = ('registrations__team__participation__valid', 'type',
'grouped', 'valid', 'registrations__polymorphic_ctype',)
'grouped', 'valid', 'registrations__team__participation__tournament', 'final',)
autocomplete_fields = ('registrations',)
actions = ('mark_as_valid', 'mark_as_pending', 'mark_as_invalid',)
@admin.display(description=_('concerned people'))
def concerned_people(self, record: Payment):
return ", ".join(f"{reg.user.first_name} {reg.user.last_name}" for reg in record.registrations.all())
@admin.action(description=_('Mark as valid'))
def mark_as_valid(self, request, queryset):
queryset.update(valid=True)
@admin.action(description=_('Mark as pending'))
def mark_as_pending(self, request, queryset):
queryset.update(valid=None)
@admin.action(description=_('Mark as invalid'))
def mark_as_invalid(self, request, queryset):
queryset.update(valid=False)
admin.site.unregister(User)
@admin.register(User)
class UserCustomAdmin(PolymorphicInlineSupportMixin, UserAdmin):
inlines = [RegistrationInline]

View File

@ -589,6 +589,8 @@ class Payment(models.Model):
@property
def team(self):
return self.registrations.first().team
team.fget.short_description = _("team")
team.fget.admin_order_field = 'registrations__team__trigram'
@property
def tournament(self):
@ -596,6 +598,8 @@ class Payment(models.Model):
from participation.models import Tournament
return Tournament.final_tournament()
return self.registrations.first().team.participation.tournament
tournament.fget.short_description = _("tournament")
tournament.fget.admin_order_field = 'registrations__team__participation__tournament'
def get_checkout_intent(self, none_if_link_disabled=False):
if self.checkout_intent_id is None: