From 282e62ef6fd46d7748310192d369b9441f5c84cd Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Wed, 12 Jul 2023 09:39:55 +0200 Subject: [PATCH] "start" not "end" should be mandatory --- .../EvaluationContainer.vue | 4 +- .../assignmentsPage/AssignmentDetails.vue | 4 +- .../assignment/AssignmentView.vue | 2 +- client/src/types.ts | 4 +- .../course/creators/test_course.py | 4 +- .../commands/create_default_courses.py | 4 +- .../course_session/serializers.py | 16 ++++---- .../course_session/tests/test_models.py | 4 +- .../migrations/0010_auto_20230712_0920.py | 38 +++++++++++++++++++ server/vbv_lernwelt/duedate/models.py | 34 ++++++++++------- 10 files changed, 81 insertions(+), 33 deletions(-) create mode 100644 server/vbv_lernwelt/duedate/migrations/0010_auto_20230712_0920.py diff --git a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationContainer.vue b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationContainer.vue index 1b4a872f..0ff0f641 100644 --- a/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationContainer.vue +++ b/client/src/pages/cockpit/assignmentEvaluationPage/EvaluationContainer.vue @@ -60,7 +60,9 @@ function editTask(task: AssignmentEvaluationTask) { const assignmentDetail = computed(() => findAssignmentDetail(props.assignment.id)); -const dueDate = computed(() => dayjs(assignmentDetail.value?.evaluation_deadline_end)); +const dueDate = computed(() => + dayjs(assignmentDetail.value?.evaluation_deadline_start) +); const inEvaluationTask = computed( () => stepIndex.value >= 1 && stepIndex.value <= numTasks.value diff --git a/client/src/pages/cockpit/assignmentsPage/AssignmentDetails.vue b/client/src/pages/cockpit/assignmentsPage/AssignmentDetails.vue index eaae98e0..515ad009 100644 --- a/client/src/pages/cockpit/assignmentsPage/AssignmentDetails.vue +++ b/client/src/pages/cockpit/assignmentsPage/AssignmentDetails.vue @@ -56,12 +56,12 @@ const assignmentDetail = computed(() =>
Abgabetermin: - {{ dayjs(assignmentDetail.submission_deadline_end).format("DD.MM.YYYY") }} + {{ dayjs(assignmentDetail.submission_deadline_start).format("DD.MM.YYYY") }} - Freigabetermin: - {{ dayjs(assignmentDetail.evaluation_deadline_end).format("DD.MM.YYYY") }} + {{ dayjs(assignmentDetail.evaluation_deadline_start).format("DD.MM.YYYY") }}
diff --git a/client/src/pages/learningPath/learningContentPage/assignment/AssignmentView.vue b/client/src/pages/learningPath/learningContentPage/assignment/AssignmentView.vue index a310c78f..98d3af32 100644 --- a/client/src/pages/learningPath/learningContentPage/assignment/AssignmentView.vue +++ b/client/src/pages/learningPath/learningContentPage/assignment/AssignmentView.vue @@ -123,7 +123,7 @@ const showPreviousButton = computed(() => stepIndex.value != 0); const showNextButton = computed(() => stepIndex.value + 1 < numPages.value); const showExitButton = computed(() => numPages.value === stepIndex.value + 1); const dueDate = computed(() => - dayjs(state.courseSessionAssignment?.submission_deadline_end) + dayjs(state.courseSessionAssignment?.submission_deadline_start) ); const currentTask = computed(() => { if (stepIndex.value > 0 && stepIndex.value <= numTasks.value) { diff --git a/client/src/types.ts b/client/src/types.ts index ab0f521d..7b523401 100644 --- a/client/src/types.ts +++ b/client/src/types.ts @@ -428,9 +428,9 @@ export interface CourseSessionAssignment { course_session_id: number; learning_content_id: number; submission_deadline_id: number; - submission_deadline_end: string; + submission_deadline_start: string; evaluation_deadline_id: number; - evaluation_deadline_end: string; + evaluation_deadline_start: string; } export interface CourseSession { diff --git a/server/vbv_lernwelt/course/creators/test_course.py b/server/vbv_lernwelt/course/creators/test_course.py index 44a9a8d0..1e3df840 100644 --- a/server/vbv_lernwelt/course/creators/test_course.py +++ b/server/vbv_lernwelt/course/creators/test_course.py @@ -180,11 +180,11 @@ def create_course_session_assignment(course_session, assignment): course_session.save() submission_deadline = csa.submission_deadline if submission_deadline: - submission_deadline.end = course_session.start_date + timedelta(days=14) + submission_deadline.start = course_session.start_date + timedelta(days=14) submission_deadline.save() evaluation_deadline = csa.evaluation_deadline if evaluation_deadline: - evaluation_deadline.end = course_session.start_date + timedelta(days=28) + evaluation_deadline.start = course_session.start_date + timedelta(days=28) evaluation_deadline.save() return csa diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index ec204b8d..3023653e 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -589,11 +589,11 @@ def create_course_session_assignments(course_session, assignment_slug, i=1): course_session.save() submission_deadline = csa.submission_deadline if submission_deadline: - submission_deadline.end = course_session.start_date + timedelta(days=14) + submission_deadline.start = course_session.start_date + timedelta(days=14) submission_deadline.save() evaluation_deadline = csa.evaluation_deadline if evaluation_deadline: - evaluation_deadline.end = course_session.start_date + timedelta(days=28) + evaluation_deadline.start = course_session.start_date + timedelta(days=28) evaluation_deadline.save() diff --git a/server/vbv_lernwelt/course_session/serializers.py b/server/vbv_lernwelt/course_session/serializers.py index 9d524ccd..defd7c6a 100644 --- a/server/vbv_lernwelt/course_session/serializers.py +++ b/server/vbv_lernwelt/course_session/serializers.py @@ -31,8 +31,8 @@ class CourseSessionAttendanceCourseSerializer(serializers.ModelSerializer): class CourseSessionAssignmentSerializer(serializers.ModelSerializer): - submission_deadline_end = serializers.SerializerMethodField() - evaluation_deadline_end = serializers.SerializerMethodField() + submission_deadline_start = serializers.SerializerMethodField() + evaluation_deadline_start = serializers.SerializerMethodField() class Meta: model = CourseSessionAssignment @@ -41,15 +41,15 @@ class CourseSessionAssignmentSerializer(serializers.ModelSerializer): "course_session_id", "learning_content_id", "submission_deadline_id", - "submission_deadline_end", + "submission_deadline_start", "evaluation_deadline_id", - "evaluation_deadline_end", + "evaluation_deadline_start", ] - def get_evaluation_deadline_end(self, obj): + def get_evaluation_deadline_start(self, obj): if obj.evaluation_deadline: - return obj.evaluation_deadline.end + return obj.evaluation_deadline.start - def get_submission_deadline_end(self, obj): + def get_submission_deadline_start(self, obj): if obj.submission_deadline: - return obj.submission_deadline.end + return obj.submission_deadline.start diff --git a/server/vbv_lernwelt/course_session/tests/test_models.py b/server/vbv_lernwelt/course_session/tests/test_models.py index e3590f37..8e1e40b5 100644 --- a/server/vbv_lernwelt/course_session/tests/test_models.py +++ b/server/vbv_lernwelt/course_session/tests/test_models.py @@ -22,8 +22,8 @@ class CourseSessionModelsTestCase(TestCase): deadline_date = datetime( 2023, 7, 6, 8, 30, tzinfo=timezone.get_current_timezone() ) - due_date.end = deadline_date + due_date.start = deadline_date due_date.save() this_date = DueDate.objects.get(pk=due_date.pk) - self.assertEqual(this_date.end, deadline_date) + self.assertEqual(this_date.start, deadline_date) diff --git a/server/vbv_lernwelt/duedate/migrations/0010_auto_20230712_0920.py b/server/vbv_lernwelt/duedate/migrations/0010_auto_20230712_0920.py new file mode 100644 index 00000000..a54f8713 --- /dev/null +++ b/server/vbv_lernwelt/duedate/migrations/0010_auto_20230712_0920.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.13 on 2023-07-12 07:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("duedate", "0009_alter_duedate_course_session"), + ] + + operations = [ + migrations.AlterField( + model_name="duedate", + name="description", + field=models.CharField(blank=True, default="", max_length=1024), + ), + migrations.AlterField( + model_name="duedate", + name="end", + field=models.DateTimeField(blank=True, db_index=True, null=True), + ), + migrations.AlterField( + model_name="duedate", + name="learning_content_description", + field=models.CharField(blank=True, default="", max_length=1024), + ), + migrations.AlterField( + model_name="duedate", + name="start", + field=models.DateTimeField(db_index=True, null=True), + ), + migrations.AlterField( + model_name="duedate", + name="title", + field=models.CharField(default="", max_length=1024), + ), + ] diff --git a/server/vbv_lernwelt/duedate/models.py b/server/vbv_lernwelt/duedate/models.py index c584d49d..36d8f773 100644 --- a/server/vbv_lernwelt/duedate/models.py +++ b/server/vbv_lernwelt/duedate/models.py @@ -10,12 +10,13 @@ from vbv_lernwelt.course.models import CourseSession class DueDate(models.Model): - start = models.DateTimeField(null=True, blank=True, db_index=True) - end = models.DateTimeField(db_index=True, null=True) - # TODO: Welcher Default Wert ist hier sinnvoll? - title = models.CharField(default=_("Termin"), max_length=1024) - learning_content_description = models.CharField(default="", max_length=1024) - description = models.CharField(default="", max_length=1024) + start = models.DateTimeField(null=True, db_index=True) + end = models.DateTimeField(null=True, blank=True, db_index=True) + title = models.CharField(default="", max_length=1024) + learning_content_description = models.CharField( + default="", blank=True, max_length=1024 + ) + description = models.CharField(default="", blank=True, max_length=1024) url = models.CharField(default="", blank=True, max_length=1024) course_session = models.ForeignKey( "course.CourseSession", @@ -28,20 +29,27 @@ class DueDate(models.Model): def Meta(self): ordering = ["start", "end"] verbose_name = _("Termin") - help = "The end date is mandatory. You can set the start date if you want to have a deadline with a duration." + help = "The start date is mandatory. You can set the end date if you want to have a deadline with a duration." def __str__(self): + if self.is_undefined: + return f"DueDate: {self.title} undefined" start_str = self.start.strftime("%Y-%m-%d %H:%M") if self.start else "-" - end_str = self.end.strftime("%Y-%m-%d %H:%M") if self.end else "-" - return f"DueDate: {self.title} {start_str} to {end_str}" + result = f"DueDate: {self.title} {start_str}" + + if self.end: + end_str = self.end.strftime("%Y-%m-%d %H:%M") if self.end else "-" + result += f" - {end_str}" + + return result @property def is_undefined(self): - return self.end is None + return self.start is None @property def duration(self): - if self.start is None: + if self.end is None: return datetime.timedelta(0) return self.end - self.start @@ -65,12 +73,12 @@ class DueDate(models.Model): else: qs = qs.filter(course_session__course_assignment__user=user) - qs = qs.order_by("end")[:limit] + qs = qs.order_by("start")[:limit] return qs @classmethod def get_next_due_dates_qs(cls): now = timezone.now() - qs = cls.objects.filter(end__gte=now) + qs = cls.objects.filter(start__gte=now) return qs