@@ -15,6 +15,12 @@ class EvaluationForm(forms.ModelForm):
15
15
general_questionnaires : "forms.ModelMultipleChoiceField[Questionnaire]" = forms .ModelMultipleChoiceField (
16
16
queryset = None , required = False , widget = CheckboxSelectMultiple , label = _ ("General questionnaires" )
17
17
)
18
+ dropout_questionnaires : "forms.ModelMultipleChoiceField[Questionnaire]" = forms .ModelMultipleChoiceField (
19
+ queryset = None ,
20
+ required = False ,
21
+ widget = CheckboxSelectMultiple ,
22
+ label = _ ("Dropout Questionnaires" ),
23
+ )
18
24
course = forms .ModelChoiceField (Course .objects .all (), disabled = True , required = False , widget = forms .HiddenInput ())
19
25
name_de_field = forms .CharField (label = _ ("Name (German)" ), disabled = True , required = False )
20
26
name_en_field = forms .CharField (label = _ ("Name (English)" ), disabled = True , required = False )
@@ -28,6 +34,7 @@ class Meta:
28
34
"vote_end_date" ,
29
35
"participants" ,
30
36
"general_questionnaires" ,
37
+ "dropout_questionnaires" ,
31
38
"course" ,
32
39
)
33
40
field_classes = {
@@ -46,6 +53,12 @@ def __init__(self, *args, **kwargs):
46
53
.distinct ()
47
54
.prefetch_related ("questions" )
48
55
)
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
+ )
49
62
50
63
self .fields ["vote_start_datetime" ].localize = True
51
64
self .fields ["vote_end_date" ].localize = True
@@ -55,9 +68,12 @@ def __init__(self, *args, **kwargs):
55
68
queryset = (queryset | self .instance .participants .all ()).distinct ()
56
69
self .fields ["participants" ].queryset = queryset
57
70
58
- if self .instance .general_contribution :
71
+ if general_contribution := self .instance .general_contribution :
59
72
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_questionnaire
74
+ ]
75
+ self .fields ["dropout_questionnaires" ].initial = [
76
+ q .pk for q in general_contribution .questionnaires .all () if q .is_dropout_questionnaire
61
77
]
62
78
63
79
if not self .instance .allow_editors_to_edit :
@@ -73,6 +89,19 @@ def clean(self):
73
89
self .add_error ("vote_start_datetime" , "" )
74
90
self .add_error ("vote_end_date" , _ ("The first day of evaluation must be before the last one." ))
75
91
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
+
76
105
def clean_vote_end_date (self ):
77
106
vote_end_date = self .cleaned_data .get ("vote_end_date" )
78
107
@@ -83,22 +112,12 @@ def clean_vote_end_date(self):
83
112
84
113
return vote_end_date
85
114
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
-
99
115
def save (self , * args , ** kw ):
100
116
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 )
102
121
return evaluation
103
122
104
123
0 commit comments