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): id = graphene.ID(required=True) 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 DocumentationBatchCreateOrUpdateMutation(graphene.Mutation): class Arguments: input = graphene.List(DocumentationInputType) documentations = graphene.List(DocumentationType) @classmethod def create_or_update(cls, info, doc): id = doc.id # 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() return 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=doc.topic or "", homework=doc.homework or "", group_note=doc.group_note or "", ) # 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 = doc.topic or "" obj.homework = doc.homework or "" obj.group_note = doc.group_note or "" obj.save() return obj @classmethod def mutate(cls, root, info, input): objs = [cls.create_or_update(info, doc) for doc in input] return DocumentationBatchCreateOrUpdateMutation(documentations=objs)