tidy up exam start and end dates a little
This commit is contained in:
+42
-2
@@ -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
@@ -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>
|
||||
|
||||
@@ -91,4 +91,8 @@ form input:required {
|
||||
.json-editor-btn-edit, .json-editor-btn-collapse {
|
||||
padding: 1px;
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
.errorlist {
|
||||
color: red;
|
||||
}
|
||||
Reference in New Issue
Block a user