Skip to content
Snippets Groups Projects
Commit e19e9046 authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

Add present option to AbsenceCreationDialog

parent 678505d4
No related branches found
No related tags found
1 merge request!461Resolve "Add present option to absence creation form"
Pipeline #194888 failed
......@@ -96,7 +96,10 @@ import permissionsMixin from "aleksis.core/mixins/permissions.js";
import mutateMixin from "aleksis.core/mixins/mutateMixin.js";
import { DateTime } from "luxon";
import { createAbsencesForPersons } from "./absenceCreation.graphql";
import {
clearAbsencesForPersons,
createAbsencesForPersons,
} from "./absenceCreation.graphql";
export default {
name: "AbsenceCreationDialog",
......@@ -152,13 +155,17 @@ export default {
confirm() {
this.handleLoading(true);
this.mutate(
createAbsencesForPersons,
this.absenceReason !== "present"
? createAbsencesForPersons
: clearAbsencesForPersons,
{
persons: this.persons.map((p) => p.id),
start: this.$toUTCISO(this.$parseISODate(this.startDate)),
end: this.$toUTCISO(this.$parseISODate(this.endDate)),
comment: this.comment,
reason: this.absenceReason,
...(this.absenceReason !== "present" && { comment: this.comment }),
...(this.absenceReason !== "present" && {
reason: this.absenceReason,
}),
},
(storedDocumentations, incomingStatuses) => {
incomingStatuses.forEach((newStatus) => {
......@@ -172,7 +179,7 @@ export default {
(part) => part.id === newStatus.id,
);
participationStatus.absenceReason = newStatus.absenceReason;
participationStatus.absenceReason = newStatus?.absenceReason;
participationStatus.isOptimistic = newStatus.isOptimistic;
});
......
......@@ -55,6 +55,7 @@
<v-text-field
:label="$t('forms.labels.comment')"
:value="comment"
:disabled="absenceReason == 'present'"
@input="$emit('comment', $event)"
/>
</v-row>
......@@ -62,6 +63,7 @@
<div aria-required="true">
<absence-reason-group-select
:rules="$rules().required.build()"
allow-empty
:value="absenceReason"
:custom-absence-reasons="absenceReasons"
@input="$emit('absence-reason', $event)"
......
......@@ -59,3 +59,20 @@ mutation createAbsencesForPersons(
}
}
}
mutation clearAbsencesForPersons(
$persons: [ID]!
$start: DateTime!
$end: DateTime!
) {
clearAbsencesForPersons(persons: $persons, start: $start, end: $end) {
ok
items: participationStatuses {
id
isOptimistic
relatedDocumentation {
id
}
}
}
}
......@@ -498,6 +498,29 @@ class ParticipationStatus(CalendarEvent):
return participation_statuses
@classmethod
def clear_absence_by_datetimes(
cls, person: Person, start: datetime, end: datetime
) -> list["ParticipationStatus"]:
participation_statuses = []
events = cls.get_single_events(
start,
end,
None,
{"person": person},
with_reference_object=True,
)
for event in events:
participation_status = event["REFERENCE_OBJECT"]
participation_status.absence_reason = None
participation_status.base_absence = None
participation_status.save()
participation_statuses.append(participation_status)
return participation_statuses
def fill_from_kolego(self, kolego_absence: KolegoAbsence):
"""Take over data from a Kolego absence."""
self.base_absence = kolego_absence
......
......@@ -24,6 +24,7 @@ from aleksis.core.util.core_helpers import (
from ..model_extensions import annotate_person_statistics_for_school_term
from ..models import Documentation, ExtraMark, NewPersonalNote, ParticipationStatus
from .absences import (
AbsencesForPersonsClearMutation,
AbsencesForPersonsCreateMutation,
)
from .documentation import (
......@@ -352,6 +353,7 @@ class Mutation(graphene.ObjectType):
touch_documentation = TouchDocumentationMutation.Field()
update_participation_statuses = ParticipationStatusBatchPatchMutation.Field()
create_absences_for_persons = AbsencesForPersonsCreateMutation.Field()
clear_absences_for_persons = AbsencesForPersonsClearMutation.Field()
extend_participation_statuses = ExtendParticipationStatusToAbsenceBatchMutation.Field()
create_extra_marks = ExtraMarkBatchCreateMutation.Field()
......
......@@ -56,3 +56,44 @@ class AbsencesForPersonsCreateMutation(graphene.Mutation):
return AbsencesForPersonsCreateMutation(
ok=True, participation_statuses=participation_statuses
)
class AbsencesForPersonsClearMutation(graphene.Mutation):
class Arguments:
persons = graphene.List(graphene.ID, required=True)
start = graphene.DateTime(required=True)
end = graphene.DateTime(required=True)
ok = graphene.Boolean()
participation_statuses = graphene.List(ParticipationStatusType)
@classmethod
def mutate(
cls,
root,
info,
persons: list[str | int],
start: datetime.datetime,
end: datetime.datetime,
):
participation_statuses = []
persons = Person.objects.filter(pk__in=persons)
for person in persons:
if not info.context.user.has_perm("alsijil.register_absence_rule", person):
raise PermissionDenied()
participation_statuses += ParticipationStatus.clear_absence_by_datetimes(
person=person, start=start, end=end
)
Absence.clear_or_extend_absences_in_timespan(
person=person,
datetime_start=start,
datetime_end=end,
)
return AbsencesForPersonsClearMutation(
ok=True, participation_statuses=participation_statuses
)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment