Skip to content

Commit e850619

Browse files
committed
allow contributors to edit dropout questionnaires
1 parent 3458454 commit e850619

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

evap/contributor/forms.py

+35-16
Original file line numberDiff line numberDiff line change
@@ -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_questionnaire
74+
]
75+
self.fields["dropout_questionnaires"].initial = [
76+
q.pk for q in general_contribution.questionnaires.all() if q.is_dropout_questionnaire
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

evap/staff/forms.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -357,15 +357,15 @@ def save(self, commit=True) -> Course:
357357

358358
class EvaluationForm(forms.ModelForm):
359359
general_questionnaires: "forms.ModelMultipleChoiceField[Questionnaire]" = forms.ModelMultipleChoiceField(
360-
Questionnaire.objects.general_questionnaires().exclude(visibility=Questionnaire.Visibility.HIDDEN),
360+
queryset=None,
361361
widget=CheckboxSelectMultiple,
362362
label=_("General questions"),
363363
)
364364
dropout_questionnaires: "forms.ModelMultipleChoiceField[Questionnaire]" = forms.ModelMultipleChoiceField(
365-
Questionnaire.objects.dropout_questionnaires().exclude(visibility=Questionnaire.Visibility.HIDDEN),
365+
queryset=None,
366+
required=False,
366367
widget=CheckboxSelectMultiple,
367368
label=_("Dropout Questionnaires"),
368-
required=False,
369369
)
370370

371371
class Meta:

0 commit comments

Comments
 (0)