Refactor some fields in `DueDate`

This commit is contained in:
Daniel Egger 2023-08-23 11:08:34 +02:00
parent e821159864
commit 279b6c1dd5
7 changed files with 241 additions and 89 deletions

View File

@ -23,9 +23,9 @@
"confirmSubmitPerson": "Hiermit bestätige ich, dass die folgende Person meine Ergebnisse bewerten soll.", "confirmSubmitPerson": "Hiermit bestätige ich, dass die folgende Person meine Ergebnisse bewerten soll.",
"confirmSubmitResults": "Hiermit bestätige ich, dass ich die Zusammenfassung meiner Ergebnisse überprüft habe und so abgeben will.", "confirmSubmitResults": "Hiermit bestätige ich, dass ich die Zusammenfassung meiner Ergebnisse überprüft habe und so abgeben will.",
"dueDateIntroduction": "Reiche deine Ergebnisse pünktlich ein bis am: ", "dueDateIntroduction": "Reiche deine Ergebnisse pünktlich ein bis am: ",
"dueDateEvaluation": "Freigabetermin Bewertung",
"dueDateNotSet": "Keine Abgabedaten wurden erfasst für diese Durchführung", "dueDateNotSet": "Keine Abgabedaten wurden erfasst für diese Durchführung",
"dueDateSubmission": "Abgabetermin", "dueDateSubmission": "Abgabetermin",
"dueDateTitle": "Abgabetermin",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"effortTitle": "Zeitaufwand", "effortTitle": "Zeitaufwand",
"initialSituationTitle": "Ausgangslage", "initialSituationTitle": "Ausgangslage",
@ -107,7 +107,7 @@
"showAllDueDates": "Alle Termine anzeigen" "showAllDueDates": "Alle Termine anzeigen"
}, },
"edoniqTest": { "edoniqTest": {
"qualifiesForExtendedTime": "edoniqTest.qualifiesForExtendedTime" "qualifiesForExtendedTime": "Ich habe Anrecht auf einen Nachteilsausgleich."
}, },
"feedback": { "feedback": {
"answers": "Antworten", "answers": "Antworten",
@ -250,7 +250,6 @@
"titel": "Lernmedien" "titel": "Lernmedien"
}, },
"overview": "Übersicht", "overview": "Übersicht",
"show": "Mediathek anzeigen",
"title": "Mediathek" "title": "Mediathek"
}, },
"messages": { "messages": {
@ -273,7 +272,7 @@
"selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.", "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.",
"selfEvaluationYes": "@:selfEvaluation: Ich kann das.", "selfEvaluationYes": "@:selfEvaluation: Ich kann das.",
"steps": "Schritt {{current}} von {{max}}", "steps": "Schritt {{current}} von {{max}}",
"title": "@:selfEvaluation.selfEvaluation {{title}}", "title": "Selbsteinschätzung {{title}}",
"yes": "Ja, ich kann das" "yes": "Ja, ich kann das"
}, },
"settings": { "settings": {

View File

@ -41,7 +41,7 @@ const step = useRouteQuery("step");
</li> </li>
</ul> </ul>
<h3 class="mb-4 mt-8">{{ $t("assignment.dueDateTitle") }}asdf</h3> <h3 class="mb-4 mt-8">{{ $t("assignment.dueDateSubmission") }}</h3>
<p v-if="props.dueDate?.toString() === 'Invalid Date'" class="text-large"> <p v-if="props.dueDate?.toString() === 'Invalid Date'" class="text-large">
{{ $t("assignment.dueDateIntroduction") }} {{ $t("assignment.dueDateIntroduction") }}
<DateEmbedding :single-date="dueDate"></DateEmbedding> <DateEmbedding :single-date="dueDate"></DateEmbedding>

View File

@ -0,0 +1,25 @@
# Generated by Django 3.2.20 on 2023-08-23 09:27
from django.db import migrations
import wagtail.blocks
import wagtail.fields
class Migration(migrations.Migration):
dependencies = [
('assignment', '0005_alter_assignment_assignment_type'),
]
operations = [
migrations.AlterField(
model_name='assignment',
name='evaluation_tasks',
field=wagtail.fields.StreamField([('task', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock()), ('description', wagtail.blocks.RichTextBlock(blank=True, features=['ul', 'bold', 'italic', 'link'], required=False)), ('max_points', wagtail.blocks.IntegerBlock()), ('sub_tasks', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock()), ('description', wagtail.blocks.RichTextBlock(blank=True, features=['ul', 'bold', 'italic', 'link'], required=False)), ('points', wagtail.blocks.IntegerBlock())]), blank=True, use_json_field=True))]))], blank=True, help_text='Beurteilungsschritte', use_json_field=True),
),
migrations.AlterField(
model_name='assignment',
name='tasks',
field=wagtail.fields.StreamField([('task', wagtail.blocks.StructBlock([('title', wagtail.blocks.TextBlock()), ('file_submission_required', wagtail.blocks.BooleanBlock(required=False)), ('content', wagtail.blocks.StreamBlock([('explanation', wagtail.blocks.StructBlock([('text', wagtail.blocks.RichTextBlock(features=['ul', 'bold', 'italic', 'link']))])), ('user_text_input', wagtail.blocks.StructBlock([('text', wagtail.blocks.RichTextBlock(blank=True, features=['ul', 'bold', 'italic', 'link'], required=False))])), ('user_confirmation', wagtail.blocks.StructBlock([('text', wagtail.blocks.RichTextBlock(features=['ul', 'bold', 'italic', 'link']))]))], blank=True))]))], blank=True, help_text='Teilaufgaben', use_json_field=True),
),
]

View File

@ -1,5 +1,4 @@
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _
from django_jsonform.models.fields import JSONField as JSONSchemaField from django_jsonform.models.fields import JSONField as JSONSchemaField
from vbv_lernwelt.assignment.models import AssignmentType from vbv_lernwelt.assignment.models import AssignmentType
@ -53,23 +52,22 @@ class CourseSessionAttendanceCourse(models.Model):
) )
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.pk: if self.learning_content_id:
title = "" if not self.due_date_id:
url = "" self.due_date = DueDate.objects.create(
page = None course_session=self.course_session,
if self.learning_content_id: )
title = self.learning_content.title
page = self.learning_content.page_ptr if not self.due_date.manual_override_fields:
url = self.learning_content.get_frontend_url() self.due_date.url = self.learning_content.get_frontend_url()
self.due_date.title = self.learning_content.title
self.due_date.page = self.learning_content.page_ptr
self.due_date.assignment_type_translation_key = (
"learningContentTypes.attendanceCourse"
)
self.due_date.save()
self.due_date = DueDate.objects.create(
url=url,
title=f"{title}",
learning_content_description=f"{_('Präsenzkurs')}",
description="",
course_session=self.course_session,
page=page,
)
super().save(*args, **kwargs) super().save(*args, **kwargs)
def __str__(self): def __str__(self):
@ -106,47 +104,57 @@ class CourseSessionAssignment(models.Model):
) )
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.pk: if self.learning_content_id:
title = "" title = self.learning_content.title
url = "" page = self.learning_content.page_ptr
page = None url = self.learning_content.get_frontend_url()
assignment_type_description = "" assignment_type = self.learning_content.assignment_type
if self.learning_content_id: assignment_type_translation_keys = {
title = self.learning_content.title AssignmentType.CASEWORK.value: "learningContentTypes.casework",
page = self.learning_content.page_ptr AssignmentType.PREP_ASSIGNMENT.value: "learningContentTypes.prepAssignment",
url = self.learning_content.get_frontend_url() AssignmentType.REFLECTION.value: "learningContentTypes.reflection",
assignment_type = self.learning_content.assignment_type }
assignment_type_descriptions = {
AssignmentType.CASEWORK.name: _("Geleitete Fallarbeit"),
AssignmentType.PREP_ASSIGNMENT.name: _("Vorbereitungsauftrag"),
AssignmentType.REFLECTION.name: _("Reflexion"),
}
assignment_type_description = assignment_type_descriptions.get(
assignment_type, ""
)
if assignment_type in { if assignment_type in (
AssignmentType.CASEWORK.value, AssignmentType.CASEWORK.value,
AssignmentType.PREP_ASSIGNMENT.value, AssignmentType.PREP_ASSIGNMENT.value,
}: # Reflexion ):
self.submission_deadline = DueDate.objects.create( if not self.submission_deadline_id:
url=url, self.submission_deadline = DueDate.objects.create(
title=f"{title}", course_session=self.course_session,
learning_content_description=assignment_type_description, )
description=f"{_('Abgabe Termin')}",
course_session=self.course_session, if not self.submission_deadline.manual_override_fields:
page=page, self.submission_deadline.url = url
) self.submission_deadline.title = title
self.submission_deadline.assignment_type_translation_key = (
assignment_type_translation_keys[assignment_type]
)
self.submission_deadline.date_type_translation_key = (
"assignment.dueDateSubmission"
)
self.submission_deadline.page = page
self.submission_deadline.save()
if assignment_type == AssignmentType.CASEWORK.value: if assignment_type == AssignmentType.CASEWORK.value:
self.evaluation_deadline = DueDate.objects.create( if not self.evaluation_deadline_id:
url=url, self.evaluation_deadline = DueDate.objects.create(
title=f"{title}", course_session=self.course_session,
learning_content_description=assignment_type_description, )
description=f"{_('Freigabe Termin Bewertungen')}",
course_session=self.course_session, if not self.evaluation_deadline.manual_override_fields:
page=page, self.evaluation_deadline.url = url
) self.evaluation_deadline.title = title
self.evaluation_deadline.assignment_type_translation_key = (
assignment_type_translation_keys[assignment_type]
)
self.evaluation_deadline.date_type_translation_key = (
"assignment.dueDateEvaluation"
)
self.evaluation_deadline.page = page
self.evaluation_deadline.save()
super().save(*args, **kwargs) super().save(*args, **kwargs)
@ -174,23 +182,21 @@ class CourseSessionEdoniqTest(models.Model):
return f"{self.course_session} - {self.learning_content}" return f"{self.course_session} - {self.learning_content}"
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.pk: if self.learning_content_id:
title = "" if not self.deadline_id:
url = "" self.deadline = DueDate.objects.create(
page = None course_session=self.course_session,
edoniq_test_type_description = _("Wissens und Verständnisfragen") )
if self.learning_content_id:
title = self.learning_content.title
page = self.learning_content.page_ptr
url = self.learning_content.get_frontend_url()
self.deadline = DueDate.objects.create( if not self.deadline.manual_override_fields:
url=url, self.deadline.url = self.learning_content.get_frontend_url()
title=f"{title}", self.deadline.title = self.learning_content.title
learning_content_description=edoniq_test_type_description, self.deadline.page = self.learning_content.page_ptr
description=f"{_('Abgabe Termin')}", self.deadline.assignment_type_translation_key = (
course_session=self.course_session, "learningContentTypes.edoniqTest"
page=page, )
) self.deadline.date_type_translation_key = "assignment.dueDateSubmission"
self.deadline.save()
super().save(*args, **kwargs) super().save(*args, **kwargs)

View File

@ -11,18 +11,34 @@ from vbv_lernwelt.learnpath.models import (
# Register your models here. # Register your models here.
@admin.register(DueDate) @admin.register(DueDate)
class DueDateAdmin(admin.ModelAdmin): class DueDateAdmin(admin.ModelAdmin):
date_hierarchy = "end" date_hierarchy = "start"
list_display = [ list_display = [
"title",
"course_session", "course_session",
"learning_content_description", "title",
"display_subtitle",
"start", "start",
"end", "end",
"is_undefined",
] ]
list_filter = ["course_session"] list_filter = ["course_session"]
readonly_fields = ["course_session", "page"] readonly_fields = ["course_session", "page"]
def get_readonly_fields(self, request, obj=None):
default_readonly = super(DueDateAdmin, self).get_readonly_fields(request, obj)
if obj is None:
return default_readonly
if not obj.manual_override_fields:
return default_readonly + [
"title",
"subtitle",
"assignment_type_translation_key",
"date_type_translation_key",
"url",
]
return default_readonly
def formfield_for_foreignkey(self, db_field, request, **kwargs): def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "page": if db_field.name == "page":
if request.resolver_match.kwargs.get("object_id"): if request.resolver_match.kwargs.get("object_id"):

View File

@ -0,0 +1,65 @@
# Generated by Django 3.2.20 on 2023-08-23 09:26
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('duedate', '0002_alter_duedate_start'),
]
operations = [
migrations.AlterModelOptions(
name='duedate',
options={'ordering': ['start', 'end']},
),
migrations.RemoveField(
model_name='duedate',
name='description',
),
migrations.RemoveField(
model_name='duedate',
name='learning_content_description',
),
migrations.AddField(
model_name='duedate',
name='assignment_type_translation_key',
field=models.CharField(blank=True, default='', help_text='Translation Key aus dem Frontend', max_length=1024),
),
migrations.AddField(
model_name='duedate',
name='date_type_translation_key',
field=models.CharField(blank=True, default='', help_text='Translation Key aus dem Frontend', max_length=1024),
),
migrations.AddField(
model_name='duedate',
name='manual_override_fields',
field=models.BooleanField(default=False, help_text='Nur aktivieren, wenn man die Felder manuell überschreiben will'),
),
migrations.AddField(
model_name='duedate',
name='subtitle',
field=models.TextField(blank=True, default='', help_text='Überschreibt den Untertitel bei `assignment_type_translation_key` und `date_type_translation_key`'),
),
migrations.AlterField(
model_name='duedate',
name='end',
field=models.DateTimeField(blank=True, db_index=True, help_text='Enddatum ist optional', null=True),
),
migrations.AlterField(
model_name='duedate',
name='start',
field=models.DateTimeField(blank=True, db_index=True, help_text='Startdatum ist Pflicht', null=True),
),
migrations.AlterField(
model_name='duedate',
name='title',
field=models.CharField(default='', help_text='Title wird standarmässig vom LearningContent übernommen', max_length=1024),
),
migrations.AlterField(
model_name='duedate',
name='url',
field=models.CharField(blank=True, default='', help_text='URL wird vom LearningContent übernommen', max_length=1024),
),
]

View File

@ -10,14 +10,44 @@ from vbv_lernwelt.course.models import CourseSession
class DueDate(models.Model): class DueDate(models.Model):
start = models.DateTimeField(null=True, db_index=True, blank=True) start = models.DateTimeField(
end = models.DateTimeField(null=True, blank=True, db_index=True) null=True, blank=True, db_index=True, help_text="Startdatum ist Pflicht"
title = models.CharField(default="", max_length=1024) )
learning_content_description = models.CharField( end = models.DateTimeField(
default="", blank=True, max_length=1024 null=True, blank=True, db_index=True, help_text="Enddatum ist optional"
)
manual_override_fields = models.BooleanField(
default=False,
help_text="Nur aktivieren, wenn man die Felder manuell überschreiben will",
)
title = models.CharField(
default="",
max_length=1024,
help_text="Title wird standarmässig vom LearningContent übernommen",
)
assignment_type_translation_key = models.CharField(
default="",
blank=True,
max_length=1024,
help_text="Translation Key aus dem Frontend",
)
date_type_translation_key = models.CharField(
default="",
blank=True,
max_length=1024,
help_text="Translation Key aus dem Frontend",
)
subtitle = models.TextField(
default="",
blank=True,
help_text="Überschreibt den Untertitel bei `assignment_type_translation_key` und `date_type_translation_key`",
)
url = models.CharField(
default="",
blank=True,
max_length=1024,
help_text="URL wird vom LearningContent übernommen",
) )
description = models.CharField(default="", blank=True, max_length=1024)
url = models.CharField(default="", blank=True, max_length=1024)
course_session = models.ForeignKey( course_session = models.ForeignKey(
"course.CourseSession", "course.CourseSession",
on_delete=models.CASCADE, on_delete=models.CASCADE,
@ -26,10 +56,8 @@ class DueDate(models.Model):
page = models.ForeignKey(Page, on_delete=models.SET_NULL, null=True, blank=True) page = models.ForeignKey(Page, on_delete=models.SET_NULL, null=True, blank=True)
def Meta(self): class Meta:
ordering = ["start", "end"] ordering = ["start", "end"]
verbose_name = _("Termin")
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): def __str__(self):
if self.is_undefined: if self.is_undefined:
@ -43,6 +71,19 @@ class DueDate(models.Model):
return result return result
@property
def display_subtitle(self):
result = ""
if self.subtitle and self.manual_override_fields:
result = self.subtitle
result = self.assignment_type_translation_key
if self.date_type_translation_key:
result += ": " + self.date_type_translation_key
return result
@property @property
def is_undefined(self): def is_undefined(self):
return self.start is None return self.start is None