Standardize name `duedates` to `due_dates`
This commit is contained in:
parent
ba7533614d
commit
c4d10badf6
|
|
@ -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>
|
||||
|
||||
|
|
|
|||
|
|
@ -18,5 +18,5 @@ const props = defineProps<{
|
|||
}>();
|
||||
|
||||
const courseSession = useCurrentCourseSession();
|
||||
const allDueDates = courseSession.value.duedates;
|
||||
const allDueDates = courseSession.value.due_dates;
|
||||
</script>
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -450,7 +450,7 @@ export interface CourseSession {
|
|||
assignments: CourseSessionAssignment[];
|
||||
documents: CircleDocument[];
|
||||
users: CourseSessionUser[];
|
||||
duedates: DueDate[];
|
||||
due_dates: DueDate[];
|
||||
}
|
||||
|
||||
export type Role = "MEMBER" | "EXPERT" | "TUTOR";
|
||||
|
|
|
|||
|
|
@ -29,4 +29,3 @@ def command():
|
|||
call_command("migrate")
|
||||
call_command("create_default_users")
|
||||
call_command("create_default_courses")
|
||||
# call_command("create_default_duedates")
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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.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
|
||||
|
|
|
|||
|
|
@ -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