Skip to content
Snippets Groups Projects
Commit 179d0aac authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch '349-add-present-option-to-absence-creation-form' into 'master'

Resolve "Add present option to absence creation form"

Closes #349

See merge request !461
parents b7ff3602 290fefb6
No related branches found
No related tags found
1 merge request!461Resolve "Add present option to absence creation form"
Pipeline #194984 canceled
......@@ -69,7 +69,10 @@
<DocumentationLoader />
</template>
</infinite-scrolling-date-sorted-c-r-u-d-iterator>
<absence-creation-dialog :absence-reasons="absenceReasons" />
<absence-creation-dialog
:absence-reasons="absenceReasons"
:affected-query="lastQuery"
/>
</div>
</template>
......
......@@ -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,23 @@ mutation createAbsencesForPersons(
}
}
}
mutation clearAbsencesForPersons(
$persons: [ID]!
$start: DateTime!
$end: DateTime!
) {
clearAbsencesForPersons(persons: $persons, start: $start, end: $end) {
ok
items: participationStatuses {
id
isOptimistic
relatedDocumentation {
id
}
absenceReason {
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