From 4f60440ea199f62d0854e5c29c7af9452cf0426e Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 2 Sep 2024 12:16:37 +0100 Subject: [PATCH] allow adding users to exams by group --- generic/forms.py | 94 ++++++++++--------- .../generic/cid_group_view_detail.html | 47 +++++++--- generic/urls.py | 10 ++ generic/views.py | 35 +++++++ 4 files changed, 129 insertions(+), 57 deletions(-) diff --git a/generic/forms.py b/generic/forms.py index 524136e7..96f7c303 100755 --- a/generic/forms.py +++ b/generic/forms.py @@ -68,6 +68,7 @@ from django.forms.utils import from_current_timezone, to_current_timezone from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit + class SplitDateTimeFieldDefaultTime(SplitDateTimeField): def compress(self, data_list): if data_list: @@ -79,9 +80,9 @@ class SplitDateTimeFieldDefaultTime(SplitDateTimeField): ) if data_list[1] in self.empty_values: data_list[1] = datetime.time(0, 1) - #raise ValidationError( + # raise ValidationError( # self.error_messages["invalid_time"], code="invalid_time" - #) + # ) result = datetime.datetime.combine(*data_list) return from_current_timezone(result) return None @@ -98,9 +99,9 @@ class SplitDateTimeFieldDefaultTimeEnd(SplitDateTimeField): ) if data_list[1] in self.empty_values: data_list[1] = datetime.time(23, 59) - #raise ValidationError( + # raise ValidationError( # self.error_messages["invalid_time"], code="invalid_time" - #) + # ) result = datetime.datetime.combine(*data_list) return from_current_timezone(result) return None @@ -111,29 +112,28 @@ class ExamFormMixin: super(ModelForm, self).__init__(*args, **kwargs) self.helper = FormHelper() - self.helper.form_id = 'id-exam-form' - self.helper.form_class = 'exam-form' - self.helper.form_method = 'post' - self.helper.form_action = 'submit' + self.helper.form_id = "id-exam-form" + self.helper.form_class = "exam-form" + self.helper.form_method = "post" + self.helper.form_action = "submit" + self.helper.add_input(Submit("submit", "Submit")) - self.helper.add_input(Submit('submit', 'Submit')) - - #if user.is_superuser or user.groups.filter(name="cid_user_manager").exists(): + # if user.is_superuser or user.groups.filter(name="cid_user_manager").exists(): # cid_user_group_queryset = CidUserGroup.objects.filter(archive=False) # user_user_group_queryset = UserUserGroup.objects.filter(archive=False) - #else: + # else: # cid_user_group_queryset = CidUserGroup.objects.none() # user_user_group_queryset = UserUserGroup.objects.none() - #self.fields["cid_user_groups"] = ModelMultipleChoiceField( + # self.fields["cid_user_groups"] = ModelMultipleChoiceField( # required=False, # queryset=cid_user_group_queryset, - #) - #self.fields["user_user_groups"] = ModelMultipleChoiceField( + # ) + # self.fields["user_user_groups"] = ModelMultipleChoiceField( # required=False, # queryset=user_user_group_queryset, - #) + # ) self.fields["start_date"] = SplitDateTimeFieldDefaultTime( widget=SplitDateTimeWidget( date_attrs={"type": "date", "class": "datepicker"}, @@ -169,8 +169,8 @@ class ExamFormMixin: "active", "publish_results", "archive", - #"cid_user_groups", - #"user_user_groups", + # "cid_user_groups", + # "user_user_groups", # "author", ] @@ -199,6 +199,7 @@ class ExamAuthorFormMixin(ModelForm): widget=FilteredSelectMultiple(verbose_name="Authors", is_stacked=False), ) + class ExamMarkerFormMixin(ModelForm): class Meta: fields = ["markers"] @@ -213,37 +214,41 @@ class ExamMarkerFormMixin(ModelForm): class ExamGroupsFormMixin(ModelForm): - class Meta: - #model = ExamCollection - fields = ("cid_user_groups", "user_user_groups") + class Meta: + # model = ExamCollection + fields = ("cid_user_groups", "user_user_groups") - def __init__(self, *args, user, **kwargs) -> None: - super(ModelForm, self).__init__(*args, **kwargs) + def __init__(self, *args, user, **kwargs) -> None: + super(ModelForm, self).__init__(*args, **kwargs) - # TODO: decide how we should handle managing user groups - # i.e who should be able to access a list of all users? + # TODO: decide how we should handle managing user groups + # i.e who should be able to access a list of all users? - if user.is_superuser or user.groups.filter(name="cid_user_manager").exists(): - cid_user_group_queryset = CidUserGroup.objects.filter(archive=False) - user_user_group_queryset = UserUserGroup.objects.filter(archive=False) - else: - cid_user_group_queryset = CidUserGroup.objects.filter(archive=False, open_access=True) - user_user_group_queryset = UserUserGroup.objects.none(archive=False, open_access=True) - #cid_user_group_queryset = CidUserGroup.objects.none() - #user_user_group_queryset = UserUserGroup.objects.none() - - self.fields["cid_user_groups"] = ModelMultipleChoiceField( - required=False, - queryset=cid_user_group_queryset, - label="CID User Groups", + if user.is_superuser or user.groups.filter(name="cid_user_manager").exists(): + cid_user_group_queryset = CidUserGroup.objects.filter(archive=False) + user_user_group_queryset = UserUserGroup.objects.filter(archive=False) + else: + cid_user_group_queryset = CidUserGroup.objects.filter( + archive=False, open_access=True ) - self.fields["user_user_groups"] = ModelMultipleChoiceField( - required=False, - queryset=user_user_group_queryset, - label="User Groups", + user_user_group_queryset = UserUserGroup.objects.none( + archive=False, open_access=True ) - self.fields["cid_user_groups"].widget.attrs["size"] = 8 - self.fields["user_user_groups"].widget.attrs["size"] = 8 + # cid_user_group_queryset = CidUserGroup.objects.none() + # user_user_group_queryset = UserUserGroup.objects.none() + + self.fields["cid_user_groups"] = ModelMultipleChoiceField( + required=False, + queryset=cid_user_group_queryset, + label="CID User Groups", + ) + self.fields["user_user_groups"] = ModelMultipleChoiceField( + required=False, + queryset=user_user_group_queryset, + label="User Groups", + ) + self.fields["cid_user_groups"].widget.attrs["size"] = 8 + self.fields["user_user_groups"].widget.attrs["size"] = 8 class ExaminationForm(ModelForm): @@ -751,4 +756,3 @@ class ExamCollectionCloneForm(ModelForm): class Meta: model = ExamCollection fields = ("name", "date") - diff --git a/generic/templates/generic/cid_group_view_detail.html b/generic/templates/generic/cid_group_view_detail.html index 5ba72409..5e1d18ba 100755 --- a/generic/templates/generic/cid_group_view_detail.html +++ b/generic/templates/generic/cid_group_view_detail.html @@ -39,44 +39,67 @@ {% endif %} {% endif %}

Exams

- The group is currently associated with the following exams. + The group is currently associated with the following exams. This allows the users within the group to be easily added to the exam. It will not automatically give members of the group access to the exam. {% if group_type == "cid" %} Add more here. {% else %} Add more here. {% endif %} +

It is possible to quickly add or remove all group candidates from an exam by clicking the buttons below. This will only affect the {{users|length}} candidates in this group. You will need to refresh the page to see updated candidate counts.

{% with group.GetGroupExams as exam_map %} {% for key, value in exam_map.items %}

{{key}}

- + {% endfor %} {% endwith %} + + {% endblock %} {% block js %}