Skip to content
Snippets Groups Projects
absences.py 2.91 KiB
import graphene
from datetime import datetime

from aleksis.apps.kolego.models import Absence

from .documentation import DocumentationType
from ..models import Documentation, ParticipationStatus

class LessonsForPersonType(graphene.ObjectType):
    id = graphene.ID()  # noqa
    lessons = graphene.List(DocumentationType)

class AbsencesBatchCreateMutation(graphene.Mutation):
    class Arguments:
        persons = graphene.List(graphene.ID)
        start = graphene.Date(),
        end = graphene.Date(),
        comment  = graphene.String(),
        reason = graphene.ID()

    ok = graphene.Boolean()

    @classmethod
    def mutate(cls, root, info, persons, start, end, comment, reason):  # noqa
        # TODO: Check permissions for ParticipationStatus & KolegoAbsence
        #       See MR 356

        # DocumentationBatchCreateOrUpdateMutation.create_or_update
        # at least already checks permissions.

        for person in persons:
            # Get all documentations for this person between start & end
            docs, dummies = Documentation.get_documentations_for_person(
                person,
                datetime.combine(start, datetime.min.time()),
                datetime.combine(end, datetime.max.time()),
            )

            # Create doc for dummies that are already in the past
            future = false
            for dummy in dummies:
                lesson_event, dummy_start, dummy_end = Documentation.parse_dummy(dummy.id)

                if dummy_start < datetime.now():
                    # In the past -> Create a Documentation
                    docs.append(
                        Documentation.create_from_lesson_event(
                            info.context.user,
                            lesson_event,
                            dummy_start,
                            dummy_end,
                        )
                    )
                else:
                    future = true

            # Create a ParticipationStatus for each documentation
            for doc in docs:
                # Set person & absence_reason directly from id
                ParticipationStatus.objects.create(
                    person_id=person,
                    related_documentation=doc,
                    absence_reason_id=reason,
                )

            # If there are still dummy documentations in the future
            # create a Kolego Absence
            if future:
                # TODO: Are date_start & date_end from CalendarEvent enough
                #       or more needed?
                # Set reason & person directly from id
                Absence.objects.create(
                    date_start=datetime.now().date(),
                    date_end=end,
                    reason_id=reason,
                    person_id=person,
                    comment=comment,
                )

        # Return ok=True if everything went well.
        return AbsencesBatchCreateMutation(ok=True)