From 966de4a139aefabc767e1cd23435fc82fc41e745 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 20 May 2024 10:06:04 +0100 Subject: [PATCH] tidy up exam start and end dates a little --- generic/forms.py | 44 ++++++++++++++++++- generic/models.py | 4 +- .../generic/exam_overview_headers.html | 8 ++++ rad/static/css/forms.css | 4 ++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/generic/forms.py b/generic/forms.py index bbc2e972..0c9b6204 100755 --- a/generic/forms.py +++ b/generic/forms.py @@ -61,6 +61,46 @@ from longs.models import Long from sbas.models import UserAnswer as SbasUserAnswer from sbas.models import Exam as SbasExam from sbas.models import Question as SbasQuestion +from django.core.exceptions import ValidationError +import datetime +from django.forms.utils import from_current_timezone, to_current_timezone + +class SplitDateTimeFieldDefaultTime(SplitDateTimeField): + def compress(self, data_list): + if data_list: + # Raise a validation error if time or date is empty + # (possible if SplitDateTimeField has required=False). + if data_list[0] in self.empty_values: + raise ValidationError( + self.error_messages["invalid_date"], code="invalid_date" + ) + if data_list[1] in self.empty_values: + data_list[1] = datetime.time(0, 0) + #raise ValidationError( + # self.error_messages["invalid_time"], code="invalid_time" + #) + result = datetime.datetime.combine(*data_list) + return from_current_timezone(result) + return None + + +class SplitDateTimeFieldDefaultTimeEnd(SplitDateTimeField): + def compress(self, data_list): + if data_list: + # Raise a validation error if time or date is empty + # (possible if SplitDateTimeField has required=False). + if data_list[0] in self.empty_values: + raise ValidationError( + self.error_messages["invalid_date"], code="invalid_date" + ) + if data_list[1] in self.empty_values: + data_list[1] = datetime.time(23, 59) + #raise ValidationError( + # self.error_messages["invalid_time"], code="invalid_time" + #) + result = datetime.datetime.combine(*data_list) + return from_current_timezone(result) + return None class ExamFormMixin: @@ -82,7 +122,7 @@ class ExamFormMixin: required=False, queryset=user_user_group_queryset, ) - self.fields["start_date"] = SplitDateTimeField( + self.fields["start_date"] = SplitDateTimeFieldDefaultTime( widget=SplitDateTimeWidget( date_attrs={"type": "date", "class": "datepicker"}, time_attrs={"type": "time", "class": "timepicker"}, @@ -91,7 +131,7 @@ class ExamFormMixin: ), required=False, ) - self.fields["end_date"] = SplitDateTimeField( + self.fields["end_date"] = SplitDateTimeFieldDefaultTimeEnd( widget=SplitDateTimeWidget( date_attrs={"type": "date", "class": "datepicker"}, time_attrs={"type": "time", "class": "timepicker"}, diff --git a/generic/models.py b/generic/models.py index 25504a80..b6e9f66e 100644 --- a/generic/models.py +++ b/generic/models.py @@ -598,9 +598,7 @@ class ExamOrCollectionGenericBase(models.Model, AuthorMixin): raise ValidationError("If restrict to dates is set, a start date must be set") if self.end_date is not None and self.end_date <= self.start_date: - print(f"{self.start_date=}") - print(f"{self.end_date=}") - raise ValidationError("End date must be after start date") + raise ValidationError({"end_date" : "End date must be after start date"}) return super().clean(*args, **kwargs) diff --git a/generic/templates/generic/exam_overview_headers.html b/generic/templates/generic/exam_overview_headers.html index c611ede0..2ef494ec 100644 --- a/generic/templates/generic/exam_overview_headers.html +++ b/generic/templates/generic/exam_overview_headers.html @@ -38,6 +38,14 @@ Exam mode: {{ exam.exam_mode }}
{% endif %} Open access: {{ exam.open_access }}
+{% if exam.start_date %} + Start date: {{ exam.start_date }} +{% endif %} +{% if exam.end_date %} + / End date: {{ exam.end_date }} +{% endif %} + +
Exam active: [When checked the exam will be available to take in the test system]
diff --git a/rad/static/css/forms.css b/rad/static/css/forms.css index 23ad5608..b0883855 100644 --- a/rad/static/css/forms.css +++ b/rad/static/css/forms.css @@ -91,4 +91,8 @@ form input:required { .json-editor-btn-edit, .json-editor-btn-collapse { padding: 1px; font-size: small; +} + +.errorlist { + color: red; } \ No newline at end of file