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