Skip to content
Snippets Groups Projects
documentation.py 5 KiB
Newer Older
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
Jonathan Weth's avatar
Jonathan Weth committed
        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 = (
Jonathan Weth's avatar
Jonathan Weth committed
            "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 = (
Jonathan Weth's avatar
Jonathan Weth committed
            "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 = (
Jonathan Weth's avatar
Jonathan Weth committed
            "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)

Hangzhi Yu's avatar
Hangzhi Yu committed
            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)