From bd0dd0a2a8d7c3466f2863af162e207e16f8f8c8 Mon Sep 17 00:00:00 2001 From: Michael Bauer <michael-bauer@posteo.de> Date: Sat, 25 Jan 2025 15:55:07 +0100 Subject: [PATCH 1/3] Constrain CalendarEvent to start before it ends --- ...n_calendar_event_starting_before_ending.py | 23 +++++++++++++++++++ aleksis/core/models.py | 10 +++++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 aleksis/core/migrations/0071_constrain_calendar_event_starting_before_ending.py diff --git a/aleksis/core/migrations/0071_constrain_calendar_event_starting_before_ending.py b/aleksis/core/migrations/0071_constrain_calendar_event_starting_before_ending.py new file mode 100644 index 000000000..cd1620e7d --- /dev/null +++ b/aleksis/core/migrations/0071_constrain_calendar_event_starting_before_ending.py @@ -0,0 +1,23 @@ +from django.db import migrations, models +from django.db.models import F, Q + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0070_oauth_token_checksum'), + ] + + operations = [ + migrations.AddConstraint( + model_name='calendarevent', + constraint=models.CheckConstraint(check=Q(datetime_end__gt=F('datetime_start')), + name="datetime_start_before_end" + ), + ), + migrations.AddConstraint( + model_name='calendarevent', + constraint=models.CheckConstraint(check=Q(date_end__gt=F('date_start')), + name="date_start_before_end" + ), + ), + ] diff --git a/aleksis/core/models.py b/aleksis/core/models.py index 6a813fa84..a5473893a 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -15,7 +15,7 @@ from django.contrib.postgres.fields import ArrayField from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator from django.db import models -from django.db.models import Q, QuerySet +from django.db.models import F, Q, QuerySet from django.dispatch import receiver from django.forms.widgets import Media from django.http import HttpRequest @@ -1709,6 +1709,14 @@ class CalendarEvent(CalendarEventMixin, ExtensiblePolymorphicModel, RecurrenceMo check=~Q(datetime_end__isnull=True, date_end__isnull=True), name="datetime_end_or_date_end", ), + models.CheckConstraint( + check=Q(datetime_end__gt=F('datetime_start')), + name="datetime_start_before_end" + ), + models.CheckConstraint( + check=Q(date_end__gt=F('date_start')), + name="date_start_before_end" + ), models.CheckConstraint( check=~(Q(datetime_start__isnull=False, timezone="") & ~Q(recurrences="")), name="timezone_if_datetime_start_and_recurring", -- GitLab From 6fe07ff1894d43b48e5a9adb1d87ed6f2e64d106 Mon Sep 17 00:00:00 2001 From: Michael Bauer <michael-bauer@posteo.de> Date: Thu, 23 Jan 2025 17:58:17 +0100 Subject: [PATCH 2/3] Set allowed min and max datetime in PersonalEventDialog --- .../calendar/personal_event/PersonalEventDialog.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue b/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue index 33bd0b128..b73a7ec30 100644 --- a/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue +++ b/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue @@ -60,7 +60,7 @@ import CollapseTriggerButton from "../../generic/buttons/CollapseTriggerButton.v </template> <!-- eslint-disable-next-line vue/valid-v-slot --> - <template #datetimeStart.field="{ attrs, on }"> + <template #datetimeStart.field="{ attrs, on, item }"> <v-slide-y-transition appear> <div aria-required="true"> <date-time-field @@ -69,13 +69,14 @@ import CollapseTriggerButton from "../../generic/buttons/CollapseTriggerButton.v v-bind="attrs" v-on="on" required + :max="item.datetimeEnd" /> </div> </v-slide-y-transition> </template> <!-- eslint-disable-next-line vue/valid-v-slot --> - <template #datetimeEnd.field="{ attrs, on }"> + <template #datetimeEnd.field="{ attrs, on, item }"> <v-slide-y-transition appear> <div aria-required="true"> <date-time-field @@ -84,6 +85,7 @@ import CollapseTriggerButton from "../../generic/buttons/CollapseTriggerButton.v v-bind="attrs" v-on="on" required + :min="$parseISODate(item.datetimeStart).plus({minutes: 1}).toISO()" /> </div> </v-slide-y-transition> -- GitLab From 07c7c989ceae26f5197afc2a04371de06055f180 Mon Sep 17 00:00:00 2001 From: Michael Bauer <michael-bauer@posteo.de> Date: Sat, 25 Jan 2025 16:18:08 +0100 Subject: [PATCH 3/3] Reformat --- .../calendar/personal_event/PersonalEventDialog.vue | 4 +++- aleksis/core/models.py | 6 ++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue b/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue index b73a7ec30..4b084f7d9 100644 --- a/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue +++ b/aleksis/core/frontend/components/calendar/personal_event/PersonalEventDialog.vue @@ -85,7 +85,9 @@ import CollapseTriggerButton from "../../generic/buttons/CollapseTriggerButton.v v-bind="attrs" v-on="on" required - :min="$parseISODate(item.datetimeStart).plus({minutes: 1}).toISO()" + :min=" + $parseISODate(item.datetimeStart).plus({ minutes: 1 }).toISO() + " /> </div> </v-slide-y-transition> diff --git a/aleksis/core/models.py b/aleksis/core/models.py index a5473893a..c02ec1548 100644 --- a/aleksis/core/models.py +++ b/aleksis/core/models.py @@ -1710,12 +1710,10 @@ class CalendarEvent(CalendarEventMixin, ExtensiblePolymorphicModel, RecurrenceMo name="datetime_end_or_date_end", ), models.CheckConstraint( - check=Q(datetime_end__gt=F('datetime_start')), - name="datetime_start_before_end" + check=Q(datetime_end__gt=F("datetime_start")), name="datetime_start_before_end" ), models.CheckConstraint( - check=Q(date_end__gt=F('date_start')), - name="date_start_before_end" + check=Q(date_end__gt=F("date_start")), name="date_start_before_end" ), models.CheckConstraint( check=~(Q(datetime_start__isnull=False, timezone="") & ~Q(recurrences="")), -- GitLab