diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue deleted file mode 100644 index f4de6f18e8f84208baf4b1abf1e79b05550c27d2..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationDialog.vue +++ /dev/null @@ -1,69 +0,0 @@ -<template> - <mobile-fullscreen-dialog v-model="popup"> - <template #activator="activator"> - <!-- button +? --> - <!-- -> popup = true --> - </template> - <template #title> - <!-- Abwesenheit/Entschuldigung erfassen --> - <!-- Abwesenheit/Entschuldigung Zusammenfassung --> - </template> - <template #content> - <absence-form v-if="form" /> - <absence-summary v-else /> - </template> - <template #actions> - <!-- secondary --> - <!-- TODO: Return to form on cancel? form=true --> - <cancel-button - @click="popup = false" - disabled="loading" - /> - <!-- primary --> - <save-button - v-if="form" - i18n-key="actions.continue" - @click="form = false" - :loading="loading" - /> - <save-button - v-if="form" - i18n-key="actions.confirm" - @click="confirm" - :loading="loading" - /> - </template> - </mobile-fullscreen-dialog> -</template> - -<script> -import MobileFullscreenDialog from "aleksis.core/components/generic/dialogs/MobileFullscreenDialog.vue"; -import AbsenceForm from "./AbsenceForm.vue"; -import AbsenceSummary from "./AbsenceSummary.vue"; -import CancelButton from "aleksis.core/components/generic/buttons/CancelButton.vue"; -import SaveButton from "aleksis.core/components/generic/buttons/SaveButton.vue"; - -export default { - name: "AbsenceDialog", - components: { - MobileFullscreenDialog, - AbsenceForm, - AbsenceSummary, - CancelButton, - SaveButton, - }, - data() { - return { - popup: false, - form: true, - loading: false, - }; - }, - methods: { - confirm() { - // TODO: Send mutation (shown in absence-summary) - popup = false, - }, - }, -}; -</script> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationForm.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationForm.vue deleted file mode 100644 index 11e226bfb5ed523289a87862fa18d0e7aebbfcf9..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationForm.vue +++ /dev/null @@ -1,50 +0,0 @@ -<template> - <v-container> - <v-row> - <!-- persons --> - <!-- v-autocomplete --> - </v-row> - <v-row> - <!-- Start --> - <v-col - cols="12" - :sm="6" - > - <date-field - :value="value" - @input="$emit('input', $event)" - :label="$t('date_select.label')" - :disabled="loading" - /> - </v-col> - <!-- End --> - <v-col - cols="12" - :sm="6" - > - <date-field - :value="value" - @input="$emit('input', $event)" - :label="$t('date_select.label')" - :disabled="loading" - /> - </v-col> - </v-row> - <v-row> - <!-- comment --> - </v-row> - <v-row> - <!-- TODO: Component from Julian --> - </v-row> - </v-container> -</template> - -<script> -import DateField from "aleksis.core/components/generic/forms/DateField.vue"; -export default { - name: "AbsenceForm", - components: { - DateField, - }, -}; -</script> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue b/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue deleted file mode 100644 index e255df5a069f3135d6dcd5030ab58a9ce2cfefc8..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/AbsenceCreationSummary.vue +++ /dev/null @@ -1,25 +0,0 @@ -<template> - <!-- TODO: Hide header --> - <c-r-u-d-iterator - :gql-query="" - :gql-additional-query-args="FROM FORM" - :enable-create="false" - :enable-edit="false" - :elevated="false" - > - <template #default="{ items }"> - <!-- expandable card per person --> - </template> - </c-r-u-d-iterator> -</template> - -<script> -import CRUDIterator from "aleksis.core/components/generic/CRUDIterator.vue"; - -export default { - name: "AbsenceSummary", - components: { - CRUDIterator, - }, -}; -</script> diff --git a/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceCreation.graphql b/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceCreation.graphql deleted file mode 100644 index 79178bfd835e5c6dbe726d53d6e00b11c7c8f61f..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/frontend/components/coursebook/absences/absenceCreation.graphql +++ /dev/null @@ -1,59 +0,0 @@ -# Uses core persons query -query persons { - persons: persons { - id - firstName - lastName - } -} - -query lessonsForPersons( - $persons: [ID!]! - $start: Date! - $end: Date! -) { - items: lessonsForPersons( - persons: $persons - start: $start - end: $end - ) { - id - lessons { - id - datetimeStart - datetimeEnd - course { - id - name - } - subject { - id - name - shortName - colourFg - colourBg - } - } - } -} - -# Use absencesInputType? -mutation createAbsences( - $persons: [ID!]! - $start: Date! - $end: Date! - $comment: String - $reason: ID! -) { - createAbsences( - person: $persons - start: $start - end: $end - comment: $comment - reason: $reason - ) { - items: absences { - ok - } - } -} diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py index 5871a80b09fa0cc461dda9ff5b05604ddb9475fe..7ed5030b3ba246e9809ffb9dbd88977a4e185e4a 100644 --- a/aleksis/apps/alsijil/schema/__init__.py +++ b/aleksis/apps/alsijil/schema/__init__.py @@ -17,10 +17,7 @@ from ..models import Documentation from .documentation import ( DocumentationBatchCreateOrUpdateMutation, DocumentationType, -) -from .absences import ( LessonsForPersonType, - AbsencesBatchCreateMutation, ) from .participation_status import ParticipationStatusBatchPatchMutation @@ -175,5 +172,4 @@ class Query(graphene.ObjectType): class Mutation(graphene.ObjectType): create_or_update_documentations = DocumentationBatchCreateOrUpdateMutation.Field() - create_absences = AbsencesBatchCreateMutation.Field() update_participation_statuses = ParticipationStatusBatchPatchMutation.Field() diff --git a/aleksis/apps/alsijil/schema/absences.py b/aleksis/apps/alsijil/schema/absences.py deleted file mode 100644 index 663455671de7b8f2c420bb4ab8d332ffda3c61d2..0000000000000000000000000000000000000000 --- a/aleksis/apps/alsijil/schema/absences.py +++ /dev/null @@ -1,81 +0,0 @@ -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) diff --git a/aleksis/apps/alsijil/schema/documentation.py b/aleksis/apps/alsijil/schema/documentation.py index dd79c16952de8edbef3f6b0ab5bc8c14a07e9876..bdc965471a78903a1d547bb25c1cd2c2284ff69f 100644 --- a/aleksis/apps/alsijil/schema/documentation.py +++ b/aleksis/apps/alsijil/schema/documentation.py @@ -1,7 +1,4 @@ -from datetime import datetime - from django.core.exceptions import PermissionDenied -from django.utils.timezone import localdate, localtime import graphene from graphene_django.types import DjangoObjectType @@ -97,6 +94,11 @@ class DocumentationInputType(graphene.InputObjectType): group_note = graphene.String(required=False) +class LessonsForPersonType(graphene.ObjectType): + id = graphene.ID() # noqa + lessons = graphene.List(DocumentationType) + + class DocumentationBatchCreateOrUpdateMutation(graphene.Mutation): class Arguments: input = graphene.List(DocumentationInputType)