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