Coverage for website/events/admin/registration.py: 46.05%
56 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from functools import partial
3from django.contrib import admin
4from django.core.exceptions import PermissionDenied
5from django.forms import Field
6from django.urls import path
8import events.admin.views as admin_views
9from events import models, services
10from members.models import Member
11from payments.widgets import PaymentWidget
12from utils.admin import DoNextModelAdmin
14from .forms import RegistrationAdminForm
17@admin.register(models.EventRegistration)
18class RegistrationAdmin(DoNextModelAdmin):
19 """Custom admin for registrations."""
21 form = RegistrationAdminForm
23 list_select_related = ["event", "member"]
25 def save_model(self, request, obj, form, change):
26 if not services.is_organiser(request.member, obj.event):
27 raise PermissionDenied
28 return super().save_model(request, obj, form, change)
30 def has_view_permission(self, request, obj=None):
31 """Only give view permission if the user is an organiser."""
32 if obj is not None and not services.is_organiser(request.member, obj.event): 32 ↛ 33line 32 didn't jump to line 33 because the condition on line 32 was never true
33 return False
34 return super().has_view_permission(request, obj)
36 def has_change_permission(self, request, obj=None):
37 """Only give change permission if the user is an organiser."""
38 if obj is not None and not services.is_organiser(request.member, obj.event): 38 ↛ 39line 38 didn't jump to line 39 because the condition on line 38 was never true
39 return False
40 return super().has_change_permission(request, obj)
42 def has_delete_permission(self, request, obj=None):
43 """Only give delete permission if the user is an organiser."""
44 if obj is not None and not services.is_organiser(request.member, obj.event): 44 ↛ 45line 44 didn't jump to line 45 because the condition on line 44 was never true
45 return False
46 return super().has_delete_permission(request, obj)
48 def get_form(self, request, obj=None, **kwargs):
49 return super().get_form(
50 request,
51 obj,
52 formfield_callback=partial(
53 self.formfield_for_dbfield, request=request, obj=obj
54 ),
55 **kwargs,
56 )
58 def formfield_for_dbfield(self, db_field, request, obj=None, **kwargs):
59 """Customise the formfields of event and member."""
60 field = super().formfield_for_dbfield(db_field, request, **kwargs)
61 if db_field.name in ("event", "member"):
62 # Disable add/change/delete buttons
63 field.widget.can_add_related = False
64 field.widget.can_change_related = False
65 field.widget.can_delete_related = False
66 elif db_field.name == "payment":
67 return Field(
68 widget=PaymentWidget(obj=obj),
69 initial=field.initial,
70 required=False,
71 )
72 return field
74 def formfield_for_foreignkey(self, db_field, request, **kwargs):
75 """Customise the formfields of event and member."""
76 if db_field.name == "event":
77 # allow to restrict event
78 if request.GET.get("event_pk"):
79 kwargs["queryset"] = models.Event.objects.filter(
80 pk=int(request.GET["event_pk"])
81 )
82 else:
83 kwargs["queryset"] = models.Event.objects
84 # restrict to events organised by user
85 if not (
86 request.user.is_superuser
87 or request.user.has_perm("events.override_organiser")
88 ):
89 kwargs["queryset"] = kwargs["queryset"].filter(
90 organisers__in=list(
91 request.member.get_member_groups().values_list("id", flat=True)
92 )
93 )
94 elif db_field.name == "member":
95 # Filter the queryset to current members only
96 kwargs["queryset"] = Member.current_members.all()
97 return super().formfield_for_foreignkey(db_field, request, **kwargs)
99 def get_urls(self):
100 urls = super().get_urls()
101 custom_urls = [
102 path(
103 "<int:registration>/fields/",
104 self.admin_site.admin_view(
105 admin_views.RegistrationAdminFields.as_view(admin=self)
106 ),
107 name="events_registration_fields",
108 ),
109 ]
110 return custom_urls + urls