Coverage for website/events/admin/forms.py: 54.00%

44 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1from django import forms 

2from django.core.exceptions import ValidationError 

3from django.urls import reverse 

4from django.utils.translation import gettext_lazy as _ 

5 

6from events.models import Event, EventRegistration, RegistrationInformationField 

7from events.widgets import FieldsWidget 

8 

9 

10class RegistrationAdminForm(forms.ModelForm): 

11 """Custom admin form to add a link to the registration information fields admin.""" 

12 

13 fields = forms.URLField(widget=FieldsWidget, required=False) 

14 

15 def __init__(self, *args, **kwargs): 

16 super().__init__(*args, **kwargs) 

17 try: 

18 if self.instance.event.has_fields: 

19 self.fields["fields"].initial = reverse( 

20 "admin:events_registration_fields", args=[self.instance.pk] 

21 ) 

22 else: 

23 self.fields["fields"].widget = self.fields["fields"].hidden_widget() 

24 except Event.DoesNotExist: 

25 self.fields["fields"].widget = self.fields["fields"].hidden_widget() 

26 

27 class Meta: 

28 fields = "__all__" 

29 model = EventRegistration 

30 

31 

32class RegistrationInformationFieldForm(forms.ModelForm): 

33 """Custom form for the registration information fields that adds an order field.""" 

34 

35 order = forms.IntegerField(label=_("order"), initial=0) 

36 

37 def __init__(self, *args, **kwargs): 

38 super().__init__(*args, **kwargs) 

39 try: 

40 event = self.instance.event 

41 order = event.get_registrationinformationfield_order() 

42 order_value = list(order).index(self.instance.pk) 

43 self.fields["order"].initial = order_value 

44 except Event.DoesNotExist: 

45 pass 

46 

47 class Meta: 

48 fields = "__all__" 

49 model = RegistrationInformationField 

50 widgets = { 

51 "type": forms.Select, 

52 } 

53 

54 

55class EventAdminForm(forms.ModelForm): 

56 def clean(self): 

57 super().clean() 

58 self.instance.clean_changes(self.changed_data) 

59 

60 def clean_organisers(self): 

61 if ( 

62 self.request.member 

63 and self.cleaned_data.get("organisers") 

64 and not ( 

65 self.request.member.get_member_groups() 

66 .filter(pk__in=self.cleaned_data.get("organisers").values_list("pk")) 

67 .exists() 

68 ) 

69 ) and not ( 

70 self.request.user.is_superuser 

71 or self.request.user.has_perm("events.override_organiser") 

72 ): 

73 raise ValidationError( 

74 _("You cannot remove your own access from this event.") 

75 ) 

76 

77 if self.cleaned_data.get("organisers").all() == 0: 

78 raise ValidationError(_("An event must have at least one organiser.")) 

79 return self.cleaned_data.get("organisers")