from datetime import datetime import graphene from graphene_django.types import DjangoObjectType from graphene_django_cud.mutations import ( DjangoBatchCreateMutation, DjangoBatchPatchMutation, DjangoCreateMutation, ) from guardian.shortcuts import get_objects_for_user from django.core.exceptions import PermissionDenied from aleksis.apps.chronos.models import LessonEvent from aleksis.core.schema.base import ( DeleteMutation, DjangoFilterMixin, PermissionBatchPatchMixin, PermissionsTypeMixin, ) from ..models import Documentation class DocumentationType(PermissionsTypeMixin, DjangoFilterMixin, DjangoObjectType): class Meta: model = Documentation fields = ( "id", "course", "lesson_event", "subject", "topic", "homework", "group_note", "datetime_start", "datetime_end", "date_start", "date_end", ) filter_fields = { "id": ["exact", "lte", "gte"], "course__name": ["exact"], } @classmethod def get_queryset(cls, queryset, info): return get_objects_for_user(info.context.user, "alsijil.view_documentation", queryset) class DocumentationCreateMutation(DjangoCreateMutation): class Meta: model = Documentation only_fields = ( "course", "lesson_event", "subject", "topic", "homework", "group_note", "datetime_start", "datetime_end", "date_start", "date_end", ) optional_fields = ( "course", "lesson_event", "subject", "topic", "homework", "group_note", "datetime_start", "datetime_end", "date_start", "date_end", ) permissions = ("alsijil.add_documentation",) # FIXME class DocumentationBatchCreateMutation(DjangoBatchCreateMutation): class Meta: model = Documentation only_fields = ( "id", "course", "lesson_event", "subject", "topic", "homework", "group_note", "datetime_start", "datetime_end", "date_start", "date_end", ) permissions = ("alsijil.add_documentation",) # FIXME class DocumentationDeleteMutation(DeleteMutation): klass = Documentation permission_required = "alsijil.delete_documentation_rule" # FIXME class DocumentationBatchPatchMutation(PermissionBatchPatchMixin, DjangoBatchPatchMutation): class Meta: model = Documentation only_fields = ( "id", "course", "lesson_event", "subject", "topic", "homework", "group_note", "datetime_start", "datetime_end", "date_start", "date_end", ) permissions = ("alsijil.edit_documentation_rule",) # FIXME class DocumentationInputType(graphene.InputObjectType): course = graphene.ID(required=False) subject = graphene.ID(required=False) topic = graphene.String(required=False) homework = graphene.String(required=False) group_note = graphene.String(required=False) class DocumentationCreateOrUpdateMutation(graphene.Mutation): class Arguments: id = graphene.ID(required=True) input = DocumentationInputType(required=False) documentation = graphene.Field(DocumentationType) @classmethod def mutate(cls, root, info, id, input): # 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(";") lesson_event = LessonEvent.objects.get(id=lesson_event_id) if not info.context.user.has_perm( "alsijil.add_documentation_for_lesson_event_rule", lesson_event ): raise PermissionDenied() obj = Documentation.objects.create( datetime_start=datetime.fromisoformat(datetime_start), datetime_end=datetime.fromisoformat(datetime_end), lesson_event=lesson_event, course=lesson_event.course, subject=lesson_event.subject, topic=input.topic, homework=input.homework, group_note=input.group_note, ) # TODO: Add course & subject else: obj = Documentation.objects.get(id=id) if not info.context.user.has_perm("alsijil.edit_documentation_rule", obj): raise PermissionDenied() obj.topic = input.topic obj.homework = input.homework obj.group_note = input.group_note obj.save() return DocumentationCreateOrUpdateMutation(documentation=obj)