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

Merge branch '327-absence-dialog-doesn-t-work' into 'master'

Resolve "Absence dialog doesn't work"

Closes #327

See merge request !436
parents d93b2f6f c92b8ef8
No related branches found
No related tags found
1 merge request!436Resolve "Absence dialog doesn't work"
Pipeline #194177 canceled
...@@ -69,12 +69,9 @@ ...@@ -69,12 +69,9 @@
<DocumentationLoader /> <DocumentationLoader />
</template> </template>
</infinite-scrolling-date-sorted-c-r-u-d-iterator> </infinite-scrolling-date-sorted-c-r-u-d-iterator>
<v-scale-transition> <absence-creation-dialog
<absence-creation-dialog :absence-reasons="absenceReasons"
v-if="pageType === 'absences'" />
:absence-reasons="absenceReasons"
/>
</v-scale-transition>
</div> </div>
</template> </template>
......
...@@ -161,14 +161,17 @@ export default { ...@@ -161,14 +161,17 @@ export default {
reason: this.absenceReason, reason: this.absenceReason,
}, },
(storedDocumentations, incomingStatuses) => { (storedDocumentations, incomingStatuses) => {
const documentation = storedDocumentations.find(
(doc) => doc.id === this.documentation.id,
);
incomingStatuses.forEach((newStatus) => { incomingStatuses.forEach((newStatus) => {
const documentation = storedDocumentations.find(
(doc) => doc.id === newStatus.relatedDocumentation.id,
);
if (!documentation) {
return;
}
const participationStatus = documentation.participations.find( const participationStatus = documentation.participations.find(
(part) => part.id === newStatus.id, (part) => part.id === newStatus.id,
); );
participationStatus.absenceReason = newStatus.absenceReason; participationStatus.absenceReason = newStatus.absenceReason;
participationStatus.isOptimistic = newStatus.isOptimistic; participationStatus.isOptimistic = newStatus.isOptimistic;
}); });
......
...@@ -129,15 +129,18 @@ export default { ...@@ -129,15 +129,18 @@ export default {
input: this.markAsAbsentDay.participationIDs, input: this.markAsAbsentDay.participationIDs,
}, },
(storedDocumentations, incomingStatuses) => { (storedDocumentations, incomingStatuses) => {
const documentation = storedDocumentations.find(
(doc) => doc.id === this.documentation.id,
);
incomingStatuses.forEach((newStatus) => { incomingStatuses.forEach((newStatus) => {
const documentation = storedDocumentations.find(
(doc) => doc.id === newStatus.relatedDocumentation.id,
);
if (!documentation) {
return;
}
const participationStatus = documentation.participations.find( const participationStatus = documentation.participations.find(
(part) => part.id === newStatus.id, (part) => part.id === newStatus.id,
); );
participationStatus.baseAbsence = newStatus.baseAbsence;
participationStatus.absenceReason = newStatus.absenceReason;
participationStatus.isOptimistic = newStatus.isOptimistic; participationStatus.isOptimistic = newStatus.isOptimistic;
}); });
......
...@@ -69,6 +69,15 @@ mutation extendParticipationStatuses($input: [ID]!) { ...@@ -69,6 +69,15 @@ mutation extendParticipationStatuses($input: [ID]!) {
extendParticipationStatuses(input: $input) { extendParticipationStatuses(input: $input) {
items: participations { items: participations {
id id
relatedDocumentation {
id
}
absenceReason {
id
name
shortName
colour
}
} }
absences { absences {
id id
......
...@@ -472,6 +472,29 @@ class ParticipationStatus(CalendarEvent): ...@@ -472,6 +472,29 @@ class ParticipationStatus(CalendarEvent):
"""Return the title of the calendar event.""" """Return the title of the calendar event."""
return "" return ""
@classmethod
def set_from_kolego_by_datetimes(
cls, kolego_absence: KolegoAbsence, 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 = kolego_absence.reason
participation_status.base_absence = kolego_absence
participation_status.save()
participation_statuses.append(participation_status)
return participation_statuses
def fill_from_kolego(self, kolego_absence: KolegoAbsence): def fill_from_kolego(self, kolego_absence: KolegoAbsence):
"""Take over data from a Kolego absence.""" """Take over data from a Kolego absence."""
self.base_absence = kolego_absence self.base_absence = kolego_absence
......
...@@ -2,7 +2,6 @@ import datetime ...@@ -2,7 +2,6 @@ import datetime
from typing import List from typing import List
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import Q
import graphene import graphene
...@@ -43,41 +42,18 @@ class AbsencesForPersonsCreateMutation(graphene.Mutation): ...@@ -43,41 +42,18 @@ class AbsencesForPersonsCreateMutation(graphene.Mutation):
if not info.context.user.has_perm("alsijil.register_absence_rule", person): if not info.context.user.has_perm("alsijil.register_absence_rule", person):
raise PermissionDenied() raise PermissionDenied()
# Check if there is an existing absence with overlapping datetime kolego_absence = Absence.get_for_person_by_datetimes(
absences = Absence.objects.filter( datetime_start=start,
Q(datetime_start__lte=start) | Q(date_start__lte=start.date()), datetime_end=end,
Q(datetime_end__gte=end) | Q(date_end__gte=end.date()),
reason_id=reason, reason_id=reason,
person=person, person=person,
defaults={"comment": comment},
) )
if len(absences) > 0: participation_statuses += ParticipationStatus.set_from_kolego_by_datetimes(
kolego_absence = absences.first() kolego_absence=kolego_absence, person=person, start=start, end=end
else:
# Check for same times and create otherwise
kolego_absence, __ = Absence.objects.get_or_create(
datetime_start=start,
datetime_end=end,
reason_id=reason,
person=person,
defaults={"comment": comment},
)
events = ParticipationStatus.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_id = reason
participation_status.base_absence = kolego_absence
participation_status.save()
participation_statuses.append(participation_status)
return AbsencesForPersonsCreateMutation( return AbsencesForPersonsCreateMutation(
ok=True, participation_statuses=participation_statuses ok=True, participation_statuses=participation_statuses
) )
import datetime import datetime
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.utils.formats import date_format
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
import graphene import graphene
...@@ -105,60 +106,57 @@ class ExtendParticipationStatusToAbsenceBatchMutation(graphene.Mutation): ...@@ -105,60 +106,57 @@ class ExtendParticipationStatusToAbsenceBatchMutation(graphene.Mutation):
if participation.date_end: if participation.date_end:
end_date = participation.date_end end_date = participation.date_end
else: else:
end_date = ParticipationStatus.value_end_datetime(participation).date() end_date = participation.datetime_end.date()
end_datetime = datetime.datetime.combine( end_datetime = datetime.datetime.combine(
end_date, datetime.time.max, participation.timezone end_date, datetime.time.max, participation.timezone
) )
if participation.base_absence: data = dict(
# Update the base absence to increase length if needed reason=participation.absence_reason if participation.absence_reason else None,
absence = participation.base_absence person=participation.person,
)
if absence.date_end:
if absence.date_end < end_date:
absence.date_end = end_date
absence.save()
return participation, absence
# Absence uses a datetime
if absence.datetime_end.astimezone(absence.timezone) < end_datetime:
# The end date ends after the previous absence end
absence.datetime_end = end_datetime
absence.save()
return participation, absence
if participation.date_start:
data["date_start"] = participation.date_start
data["date_end"] = end_date
start_datetime = datetime.datetime.combine(
participation.date_start, datetime.time.min, participation.timezone
)
else: else:
# No base absence, simply create one if absence reason is given data["datetime_start"] = participation.datetime_start
data = dict( data["datetime_end"] = end_datetime
reason_id=participation.absence_reason.id if participation.absence_reason else None, start_datetime = participation.datetime_start
person=participation.person,
defaults = dict(
comment=_("Extended by {full_name} on {datetime}").format(
full_name=info.context.user.person.full_name,
datetime=date_format(participation.date_start or participation.datetime_start),
) )
)
if participation.date_start: absence = Absence.get_for_person_by_datetimes(**data, defaults=defaults)
data["date_start"] = participation.date_start
data["date_end"] = end_date
else:
data["datetime_start"] = ParticipationStatus.value_start_datetime(participation)
data["datetime_end"] = end_datetime
absence, __ = Absence.objects.get_or_create(**data)
participation.base_absence = absence participations = ParticipationStatus.set_from_kolego_by_datetimes(
participation.save() kolego_absence=absence,
person=participation.person,
start=start_datetime,
end=end_datetime,
)
return participation, absence return participations, absence
@classmethod @classmethod
def mutate(cls, root, info, input): # noqa def mutate(cls, root, info, input): # noqa
with create_revision(): with create_revision():
set_user(info.context.user) set_user(info.context.user)
set_comment(_("Extended absence reason from coursebook.")) set_comment(_("Extended absence reason from coursebook."))
participations, absences = zip( participations = []
*[cls.create_absence(info, participation_id) for participation_id in input] absences = []
) for participation_id in input:
p, a = cls.create_absence(info, participation_id)
participations += p
absences.append(a)
return ExtendParticipationStatusToAbsenceBatchMutation( return ExtendParticipationStatusToAbsenceBatchMutation(
participations=participations, absences=absences participations=participations, absences=absences
......
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