@@ -15,6 +15,12 @@ class EvaluationForm(forms.ModelForm):
1515 general_questionnaires : "forms.ModelMultipleChoiceField[Questionnaire]" = forms .ModelMultipleChoiceField (
1616 queryset = None , required = False , widget = CheckboxSelectMultiple , label = _ ("General questionnaires" )
1717 )
18+ dropout_questionnaires : "forms.ModelMultipleChoiceField[Questionnaire]" = forms .ModelMultipleChoiceField (
19+ queryset = None ,
20+ required = False ,
21+ widget = CheckboxSelectMultiple ,
22+ label = _ ("Dropout questionnaires" ),
23+ )
1824 course = forms .ModelChoiceField (Course .objects .all (), disabled = True , required = False , widget = forms .HiddenInput ())
1925 name_de_field = forms .CharField (label = _ ("Name (German)" ), disabled = True , required = False )
2026 name_en_field = forms .CharField (label = _ ("Name (English)" ), disabled = True , required = False )
@@ -28,6 +34,7 @@ class Meta:
2834 "vote_end_date" ,
2935 "participants" ,
3036 "general_questionnaires" ,
37+ "dropout_questionnaires" ,
3138 "course" ,
3239 )
3340 field_classes = {
@@ -46,6 +53,12 @@ def __init__(self, *args, **kwargs):
4653 .distinct ()
4754 .prefetch_related ("questions" )
4855 )
56+ self .fields ["dropout_questionnaires" ].queryset = (
57+ Questionnaire .objects .dropout_questionnaires ()
58+ .filter (Q (visibility = Questionnaire .Visibility .EDITORS ) | Q (contributions__evaluation = self .instance ))
59+ .distinct ()
60+ .prefetch_related ("questions" )
61+ )
4962
5063 self .fields ["vote_start_datetime" ].localize = True
5164 self .fields ["vote_end_date" ].localize = True
@@ -55,9 +68,12 @@ def __init__(self, *args, **kwargs):
5568 queryset = (queryset | self .instance .participants .all ()).distinct ()
5669 self .fields ["participants" ].queryset = queryset
5770
58- if self .instance .general_contribution :
71+ if general_contribution := self .instance .general_contribution :
5972 self .fields ["general_questionnaires" ].initial = [
60- q .pk for q in self .instance .general_contribution .questionnaires .all ()
73+ q .pk for q in general_contribution .questionnaires .all () if q .is_general
74+ ]
75+ self .fields ["dropout_questionnaires" ].initial = [
76+ q .pk for q in general_contribution .questionnaires .all () if q .is_dropout
6177 ]
6278
6379 if not self .instance .allow_editors_to_edit :
@@ -73,6 +89,19 @@ def clean(self):
7389 self .add_error ("vote_start_datetime" , "" )
7490 self .add_error ("vote_end_date" , _ ("The first day of evaluation must be before the last one." ))
7591
92+ # Ensure locked questionnaires cannot be deselected and only unlocked ones can be added
93+ selected_questionnaires = self .instance .general_contribution .questionnaires .filter (is_locked = True ).distinct ()
94+ selected_questionnaires |= self .cleaned_data .get ("general_questionnaires" ).filter (is_locked = False )
95+ selected_questionnaires |= self .cleaned_data .get ("dropout_questionnaires" ).filter (is_locked = False )
96+
97+ self .cleaned_data .update (
98+ general_questionnaires = selected_questionnaires .exclude (type = Questionnaire .Type .DROPOUT ),
99+ dropout_questionnaires = selected_questionnaires .filter (type = Questionnaire .Type .DROPOUT ),
100+ )
101+
102+ if not self .cleaned_data .get ("general_questionnaires" ):
103+ self .add_error ("general_questionnaires" , _ ("At least one questionnaire must be selected." ))
104+
76105 def clean_vote_end_date (self ):
77106 vote_end_date = self .cleaned_data .get ("vote_end_date" )
78107
@@ -83,22 +112,12 @@ def clean_vote_end_date(self):
83112
84113 return vote_end_date
85114
86- def clean_general_questionnaires (self ):
87- # Ensure all locked questionnaires still have the same status (included or not)
88- not_locked = []
89- if self .cleaned_data .get ("general_questionnaires" ):
90- not_locked = list (self .cleaned_data .get ("general_questionnaires" ).filter (is_locked = False ))
91-
92- locked = list (self .instance .general_contribution .questionnaires .filter (is_locked = True ))
93-
94- if not not_locked + locked :
95- self .add_error ("general_questionnaires" , _ ("At least one questionnaire must be selected." ))
96-
97- return not_locked + locked
98-
99115 def save (self , * args , ** kw ):
100116 evaluation = super ().save (* args , ** kw )
101- evaluation .general_contribution .questionnaires .set (self .cleaned_data .get ("general_questionnaires" ))
117+ selected_questionnaires = self .cleaned_data .get ("general_questionnaires" ) | self .cleaned_data .get (
118+ "dropout_questionnaires"
119+ )
120+ evaluation .general_contribution .questionnaires .set (selected_questionnaires )
102121 return evaluation
103122
104123
0 commit comments