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

1from functools import partial 

2 

3from django.contrib import admin 

4from django.core.exceptions import PermissionDenied 

5from django.forms import Field 

6from django.urls import path 

7 

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 

13 

14from .forms import RegistrationAdminForm 

15 

16 

17@admin.register(models.EventRegistration) 

18class RegistrationAdmin(DoNextModelAdmin): 

19 """Custom admin for registrations.""" 

20 

21 form = RegistrationAdminForm 

22 

23 list_select_related = ["event", "member"] 

24 

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) 

29 

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) 

35 

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) 

41 

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) 

47 

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 ) 

57 

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 

73 

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) 

98 

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