tidy up exam start and end dates a little

This commit is contained in:
Ross
2024-05-20 10:06:04 +01:00
parent d50fbaafd6
commit 966de4a139
4 changed files with 55 additions and 5 deletions
+42 -2
View File
@@ -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"},
+1 -3
View File
@@ -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)
@@ -38,6 +38,14 @@ Exam mode: {{ exam.exam_mode }}<br />
{% endif %}
Open access: {{ exam.open_access }}<br />
{% if exam.start_date %}
Start date: {{ exam.start_date }}
{% endif %}
{% if exam.end_date %}
/ End date: {{ exam.end_date }}
{% endif %}
<div class="parent-help" title="Click to enable / disable the exam">
Exam active: <input type="checkbox" id="exam-active-switch" {% if exam.active %}checked{% endif %} data-posturl="{% url exam.get_app_name|add:':exam_toggle_active' pk=exam.pk %}"> <span class="help-text">[When checked the exam will be available to take in the test system]</span>
</div>
+4
View File
@@ -91,4 +91,8 @@ form input:required {
.json-editor-btn-edit, .json-editor-btn-collapse {
padding: 1px;
font-size: small;
}
.errorlist {
color: red;
}