From 72480a2eebf86fec9f7b584154e119118d4c15b1 Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Thu, 4 Apr 2024 21:44:58 +0200
Subject: [PATCH] Add check for allowed time range preference when creating
 docs from dummy

---
 aleksis/apps/alsijil/schema/documentation.py | 64 +++++++++++++-------
 1 file changed, 42 insertions(+), 22 deletions(-)

diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py
index 0c9082e01..9a3319aea 100644
--- a/aleksis/apps/alsijil/schema/documentation.py
+++ b/aleksis/apps/alsijil/schema/documentation.py
@@ -1,6 +1,7 @@
 from datetime import datetime, timezone
 
 from django.core.exceptions import PermissionDenied
+from django.utils.timezone import localdate, localtime
 
 import graphene
 from graphene_django.types import DjangoObjectType
@@ -22,6 +23,7 @@ from aleksis.core.schema.base import (
     PermissionBatchPatchMixin,
     PermissionsTypeMixin,
 )
+from aleksis.core.util.core_helpers import get_site_preferences
 
 from ..models import Documentation
 
@@ -170,32 +172,50 @@ class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation):
         # Sadly, we can't use the update_or_create method since create_defaults
         # is only introduced in Django 5.0
         if _id.startswith("DUMMY"):
-            dummy, lesson_event_id, datetime_start, datetime_end = _id.split(";")
+            dummy, lesson_event_id, datetime_start_iso, datetime_end_iso = _id.split(";")
             lesson_event = LessonEvent.objects.get(id=lesson_event_id)
 
-            if not info.context.user.has_perm(
+            datetime_start = datetime.fromisoformat(datetime_start_iso).astimezone(
+                lesson_event.timezone
+            )
+            datetime_end = datetime.fromisoformat(datetime_end_iso).astimezone(
+                lesson_event.timezone
+            )
+
+            if info.context.user.has_perm(
                 "alsijil.add_documentation_for_lesson_event_rule", lesson_event
+            ) and (
+                get_site_preferences()["alsijil__allow_edit_future_documentations"] == "all"
+                or (
+                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
+                    == "current_day"
+                    and datetime_start.date() <= localdate()
+                )
+                or (
+                    get_site_preferences()["alsijil__allow_edit_future_documentations"]
+                    == "current_time"
+                    and datetime_start <= localtime()
+                )
             ):
-                raise PermissionDenied()
-
-            # Timezone removal is necessary due to ISO style offsets are no valid timezones.
-            # Instead, we take the timezone from the lesson_event and save it in a dedicated field.
-            obj = Documentation.objects.create(
-                datetime_start=datetime.fromisoformat(datetime_start).astimezone(lesson_event.timezone),
-                datetime_end=datetime.fromisoformat(datetime_end).astimezone(lesson_event.timezone),
-                lesson_event=lesson_event,
-                course=lesson_event.course,
-                subject=lesson_event.subject,
-                topic=doc.topic or "",
-                homework=doc.homework or "",
-                group_note=doc.group_note or "",
-            )
-            if doc.teachers is not None:
-                obj.teachers.add(*doc.teachers)
-            else:
-                obj.teachers.set(lesson_event.teachers.all())
-            obj.save()
-            return obj
+                # Timezone removal is necessary due to ISO style offsets are no valid timezones.
+                # Instead, we take the timezone from the lesson_event and save it in a dedicated field.
+                obj = Documentation.objects.create(
+                    datetime_start=datetime_start,
+                    datetime_end=datetime_end,
+                    lesson_event=lesson_event,
+                    course=lesson_event.course,
+                    subject=lesson_event.subject,
+                    topic=doc.topic or "",
+                    homework=doc.homework or "",
+                    group_note=doc.group_note or "",
+                )
+                if doc.teachers is not None:
+                    obj.teachers.add(*doc.teachers)
+                else:
+                    obj.teachers.set(lesson_event.teachers.all())
+                obj.save()
+                return obj
+            raise PermissionDenied()
         else:
             obj = Documentation.objects.get(id=_id)
 
-- 
GitLab