Standardize name `duedates` to `due_dates`
This commit is contained in:
parent
ba7533614d
commit
c4d10badf6
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
|
|
||||||
|
|
@ -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")
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
),
|
||||||
|
]
|
||||||
Loading…
Reference in New Issue