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>
</ul>
<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 />
</div>
<div v-if="allDueDates.length === 0">{{ $t("duedates.noDueDatesAvailable") }}</div>
<div v-if="allDueDates.length === 0">{{ $t("dueDates.noDueDatesAvailable") }}</div>
</div>
</template>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,11 +2,8 @@ import datetime
import structlog
from django.utils import timezone
from factory import SubFactory
from factory.django import DjangoModelFactory
from ..course_session.factories import CourseSessionFactory
from .models import DueDate
logger = structlog.get_logger(__name__)
@ -25,28 +22,3 @@ class DueDateFactory(DjangoModelFactory):
title = "Prüfung Versicherungsvermittler/-in"
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.CourseSession",
on_delete=models.CASCADE,
related_name="duedates",
blank=True,
)
@ -51,12 +50,12 @@ class DueDate(models.Model):
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 due dates for that course_session are returned.
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:
qs = qs.filter(
@ -66,12 +65,12 @@ class DueDate(models.Model):
else:
qs = qs.filter(course_session__course_assignment__user=user)
qs = qs.order_by("start")[:limit]
qs = qs.order_by("end")[:limit]
return qs
@classmethod
def get_next_duedates_qs(cls):
def get_next_due_dates_qs(cls):
now = timezone.now()
qs = cls.objects.filter(end__gte=now)
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"),
),
]