Standardize name `duedates` to `due_dates`

This commit is contained in:
Daniel Egger 2023-07-12 09:15:21 +02:00
parent ba7533614d
commit c4d10badf6
11 changed files with 203 additions and 50 deletions

View File

@ -10,11 +10,11 @@
</li> </li>
</ul> </ul>
<div v-if="allDueDates.length > props.maxCount" class="flex items-center pt-6"> <div v-if="allDueDates.length > props.maxCount" class="flex items-center pt-6">
<a href="">{{ $t("duedates.showAllDueDates") }}</a> <a href="">{{ $t("dueDates.showAllDueDates") }}</a>
<it-icon-arrow-right /> <it-icon-arrow-right />
</div> </div>
<div v-if="allDueDates.length === 0">{{ $t("duedates.noDueDatesAvailable") }}</div> <div v-if="allDueDates.length === 0">{{ $t("dueDates.noDueDatesAvailable") }}</div>
</div> </div>
</template> </template>

View File

@ -18,5 +18,5 @@ const props = defineProps<{
}>(); }>();
const courseSession = useCurrentCourseSession(); const courseSession = useCurrentCourseSession();
const allDueDates = courseSession.value.duedates; const allDueDates = courseSession.value.due_dates;
</script> </script>

View File

@ -90,9 +90,7 @@
"welcome": "Willkommen, {{name}}" "welcome": "Willkommen, {{name}}"
}, },
"dueDates": { "dueDates": {
"nextDueDates": "Nächste Termine" "nextDueDates": "Nächste Termine",
},
"duedates": {
"noDueDatesAvailable": "Keine Termine vorhanden", "noDueDatesAvailable": "Keine Termine vorhanden",
"showAllDueDates": "Alle Termine anzeigen" "showAllDueDates": "Alle Termine anzeigen"
}, },

View File

@ -40,7 +40,7 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
reload: reload, reload: reload,
})) as CourseSessionUser[]; })) as CourseSessionUser[];
cs.users = users; cs.users = users;
cs.duedates.forEach((dueDate) => { cs.due_dates.forEach((dueDate) => {
dueDate.start = dayjs(dueDate.start); dueDate.start = dayjs(dueDate.start);
dueDate.end = dayjs(dueDate.end); dueDate.end = dayjs(dueDate.end);
}); });
@ -199,7 +199,7 @@ export const useCourseSessionsStore = defineStore("courseSessions", () => {
const allDueDatesReturn: DueDate[] = []; const allDueDatesReturn: DueDate[] = [];
allCourseSessions.value?.forEach((cs) => { allCourseSessions.value?.forEach((cs) => {
allDueDatesReturn.push(...cs.duedates); allDueDatesReturn.push(...cs.due_dates);
}); });
allDueDatesReturn.sort((a, b) => dayjs(a.end).diff(dayjs(b.end))); allDueDatesReturn.sort((a, b) => dayjs(a.end).diff(dayjs(b.end)));
return allDueDatesReturn; return allDueDatesReturn;

View File

@ -450,7 +450,7 @@ export interface CourseSession {
assignments: CourseSessionAssignment[]; assignments: CourseSessionAssignment[];
documents: CircleDocument[]; documents: CircleDocument[];
users: CourseSessionUser[]; users: CourseSessionUser[];
duedates: DueDate[]; due_dates: DueDate[];
} }
export type Role = "MEMBER" | "EXPERT" | "TUTOR"; export type Role = "MEMBER" | "EXPERT" | "TUTOR";

View File

@ -29,4 +29,3 @@ def command():
call_command("migrate") call_command("migrate")
call_command("create_default_users") call_command("create_default_users")
call_command("create_default_courses") call_command("create_default_courses")
# call_command("create_default_duedates")

View File

@ -62,7 +62,7 @@ class CourseSessionSerializer(serializers.ModelSerializer):
documents = serializers.SerializerMethodField() documents = serializers.SerializerMethodField()
attendance_courses = serializers.SerializerMethodField() attendance_courses = serializers.SerializerMethodField()
assignments = serializers.SerializerMethodField() assignments = serializers.SerializerMethodField()
duedates = serializers.SerializerMethodField() due_dates = serializers.SerializerMethodField()
def get_course(self, obj): def get_course(self, obj):
return CourseSerializer(obj.course).data return CourseSerializer(obj.course).data
@ -98,10 +98,9 @@ class CourseSessionSerializer(serializers.ModelSerializer):
CourseSessionAssignment.objects.filter(course_session=obj), many=True CourseSessionAssignment.objects.filter(course_session=obj), many=True
).data ).data
def get_duedates(self, obj): def get_due_dates(self, obj):
# TODO: Filter by user / userrole due_dates = DueDate.objects.filter(course_session=obj)
duedates = DueDate.objects.filter(course_session=obj) return DueDateSerializer(due_dates, many=True).data
return DueDateSerializer(duedates, many=True).data
class Meta: class Meta:
model = CourseSession model = CourseSession
@ -122,7 +121,7 @@ class CourseSessionSerializer(serializers.ModelSerializer):
"media_library_url", "media_library_url",
"course_url", "course_url",
"documents", "documents",
"duedates", "due_dates",
] ]

View File

@ -2,11 +2,8 @@ import datetime
import structlog import structlog
from django.utils import timezone from django.utils import timezone
from factory import SubFactory
from factory.django import DjangoModelFactory from factory.django import DjangoModelFactory
from ..course_session.factories import CourseSessionFactory
from .models import DueDate from .models import DueDate
logger = structlog.get_logger(__name__) logger = structlog.get_logger(__name__)
@ -25,28 +22,3 @@ class DueDateFactory(DjangoModelFactory):
title = "Prüfung Versicherungsvermittler/-in" title = "Prüfung Versicherungsvermittler/-in"
end = get_date("Jan 01 2021") end = get_date("Jan 01 2021")
def generate_events(start=timezone.now()):
for i in range(20):
DueDateFactory(
title=f"{i}",
start=start + datetime.timedelta(days=i),
end=start + datetime.timedelta(days=i, hours=1),
)
def hour_rounder(t):
# Rounds to nearest hour by adding a timedelta hour if minute >= 30
return t.replace(
second=0, microsecond=0, minute=0, hour=t.hour
) + datetime.timedelta(hours=t.minute // 30)
def set_default_times_for_duedates():
now = hour_rounder(timezone.now())
for i, event in enumerate(DueDate.objects.filter(end__isnull=True)):
event.start = now + datetime.timedelta(days=i)
event.end = event.start + datetime.timedelta(hours=3)
event.save()

View File

@ -0,0 +1,24 @@
# Generated by Django 3.2.13 on 2023-07-12 07:05
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("course", "0006_remove_coursesession_assignment_details_list"),
("duedate", "0008_auto_20230711_1116"),
]
operations = [
migrations.AlterField(
model_name="duedate",
name="course_session",
field=models.ForeignKey(
blank=True,
on_delete=django.db.models.deletion.CASCADE,
to="course.coursesession",
),
),
]

View File

@ -20,7 +20,6 @@ class DueDate(models.Model):
course_session = models.ForeignKey( course_session = models.ForeignKey(
"course.CourseSession", "course.CourseSession",
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name="duedates",
blank=True, blank=True,
) )
@ -51,12 +50,12 @@ class DueDate(models.Model):
cls, user: User, course_session: CourseSession = None, limit=10 cls, user: User, course_session: CourseSession = None, limit=10
): ):
""" """
Returns a queryset of all duedates that are relevant for the given user. Ordered nearest start date first. Returns a queryset of all due dates that are relevant for the given user.
If course_session is given, only duedates for that course_session are returned. If course_session is given, only due dates for that course_session are returned.
The user is determined by via a course session user of a course_assignment. The user is determined by via a course session user of a course_assignment.
""" """
qs = cls.get_next_duedates_qs() qs = cls.get_next_due_dates_qs()
if course_session: if course_session:
qs = qs.filter( qs = qs.filter(
@ -66,12 +65,12 @@ class DueDate(models.Model):
else: else:
qs = qs.filter(course_session__course_assignment__user=user) qs = qs.filter(course_session__course_assignment__user=user)
qs = qs.order_by("start")[:limit] qs = qs.order_by("end")[:limit]
return qs return qs
@classmethod @classmethod
def get_next_duedates_qs(cls): def get_next_due_dates_qs(cls):
now = timezone.now() now = timezone.now()
qs = cls.objects.filter(end__gte=now) qs = cls.objects.filter(end__gte=now)
return qs return qs

View File

@ -0,0 +1,162 @@
# Generated by Django 3.2.13 on 2023-07-12 07:05
import django.db.models.deletion
import django.utils.timezone
import jsonfield.fields
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("contenttypes", "0002_remove_content_type_name"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("notify", "0001_initial"),
]
operations = [
migrations.AlterModelOptions(
name="notification",
options={
"ordering": ["-timestamp"],
"verbose_name": "Notification",
"verbose_name_plural": "Notifications",
},
),
migrations.AlterField(
model_name="notification",
name="action_object_content_type",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_action_object",
to="contenttypes.contenttype",
verbose_name="action object content type",
),
),
migrations.AlterField(
model_name="notification",
name="action_object_object_id",
field=models.CharField(
blank=True,
max_length=255,
null=True,
verbose_name="action object object id",
),
),
migrations.AlterField(
model_name="notification",
name="actor_content_type",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_actor",
to="contenttypes.contenttype",
verbose_name="actor content type",
),
),
migrations.AlterField(
model_name="notification",
name="actor_object_id",
field=models.CharField(max_length=255, verbose_name="actor object id"),
),
migrations.AlterField(
model_name="notification",
name="data",
field=jsonfield.fields.JSONField(
blank=True, null=True, verbose_name="data"
),
),
migrations.AlterField(
model_name="notification",
name="deleted",
field=models.BooleanField(
db_index=True, default=False, verbose_name="deleted"
),
),
migrations.AlterField(
model_name="notification",
name="description",
field=models.TextField(blank=True, null=True, verbose_name="description"),
),
migrations.AlterField(
model_name="notification",
name="emailed",
field=models.BooleanField(
db_index=True, default=False, verbose_name="emailed"
),
),
migrations.AlterField(
model_name="notification",
name="level",
field=models.CharField(
choices=[
("success", "success"),
("info", "info"),
("warning", "warning"),
("error", "error"),
],
default="info",
max_length=20,
verbose_name="level",
),
),
migrations.AlterField(
model_name="notification",
name="public",
field=models.BooleanField(
db_index=True, default=True, verbose_name="public"
),
),
migrations.AlterField(
model_name="notification",
name="recipient",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="notifications",
to=settings.AUTH_USER_MODEL,
verbose_name="recipient",
),
),
migrations.AlterField(
model_name="notification",
name="target_content_type",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="notify_target",
to="contenttypes.contenttype",
verbose_name="target content type",
),
),
migrations.AlterField(
model_name="notification",
name="target_object_id",
field=models.CharField(
blank=True, max_length=255, null=True, verbose_name="target object id"
),
),
migrations.AlterField(
model_name="notification",
name="timestamp",
field=models.DateTimeField(
db_index=True,
default=django.utils.timezone.now,
verbose_name="timestamp",
),
),
migrations.AlterField(
model_name="notification",
name="unread",
field=models.BooleanField(
db_index=True, default=True, verbose_name="unread"
),
),
migrations.AlterField(
model_name="notification",
name="verb",
field=models.CharField(max_length=255, verbose_name="verb"),
),
]