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 UserAnswer as SbasUserAnswer
|
||||||
from sbas.models import Exam as SbasExam
|
from sbas.models import Exam as SbasExam
|
||||||
from sbas.models import Question as SbasQuestion
|
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:
|
class ExamFormMixin:
|
||||||
@@ -82,7 +122,7 @@ class ExamFormMixin:
|
|||||||
required=False,
|
required=False,
|
||||||
queryset=user_user_group_queryset,
|
queryset=user_user_group_queryset,
|
||||||
)
|
)
|
||||||
self.fields["start_date"] = SplitDateTimeField(
|
self.fields["start_date"] = SplitDateTimeFieldDefaultTime(
|
||||||
widget=SplitDateTimeWidget(
|
widget=SplitDateTimeWidget(
|
||||||
date_attrs={"type": "date", "class": "datepicker"},
|
date_attrs={"type": "date", "class": "datepicker"},
|
||||||
time_attrs={"type": "time", "class": "timepicker"},
|
time_attrs={"type": "time", "class": "timepicker"},
|
||||||
@@ -91,7 +131,7 @@ class ExamFormMixin:
|
|||||||
),
|
),
|
||||||
required=False,
|
required=False,
|
||||||
)
|
)
|
||||||
self.fields["end_date"] = SplitDateTimeField(
|
self.fields["end_date"] = SplitDateTimeFieldDefaultTimeEnd(
|
||||||
widget=SplitDateTimeWidget(
|
widget=SplitDateTimeWidget(
|
||||||
date_attrs={"type": "date", "class": "datepicker"},
|
date_attrs={"type": "date", "class": "datepicker"},
|
||||||
time_attrs={"type": "time", "class": "timepicker"},
|
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")
|
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:
|
if self.end_date is not None and self.end_date <= self.start_date:
|
||||||
print(f"{self.start_date=}")
|
raise ValidationError({"end_date" : "End date must be after start date"})
|
||||||
print(f"{self.end_date=}")
|
|
||||||
raise ValidationError("End date must be after start date")
|
|
||||||
|
|
||||||
return super().clean(*args, **kwargs)
|
return super().clean(*args, **kwargs)
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,14 @@ Exam mode: {{ exam.exam_mode }}<br />
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
Open access: {{ exam.open_access }}<br />
|
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">
|
<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>
|
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>
|
</div>
|
||||||
|
|||||||
@@ -92,3 +92,7 @@ form input:required {
|
|||||||
padding: 1px;
|
padding: 1px;
|
||||||
font-size: small;
|
font-size: small;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.errorlist {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user