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

Correctly return modified objects in mutation

parent f0729721
Branches
Tags
1 merge request!52Resolve "Only allow one absence at any point of time"
Pipeline #194062 failed
...@@ -149,6 +149,7 @@ class Absence(FreeBusy): ...@@ -149,6 +149,7 @@ class Absence(FreeBusy):
def save(self, *args, skip_overlap_handling=False, **kwargs): def save(self, *args, skip_overlap_handling=False, **kwargs):
skip_save = False skip_save = False
modified_absences = []
if not skip_overlap_handling: if not skip_overlap_handling:
events_within = Absence.get_objects( events_within = Absence.get_objects(
...@@ -192,6 +193,7 @@ class Absence(FreeBusy): ...@@ -192,6 +193,7 @@ class Absence(FreeBusy):
) )
event_within.datetime_end = max(new_datetime_end, event_within_datetime_end) event_within.datetime_end = max(new_datetime_end, event_within_datetime_end)
event_within.save(skip_overlap_handling=True) event_within.save(skip_overlap_handling=True)
modified_absences.append(event_within)
else: else:
if ( if (
new_datetime_start > event_within_datetime_start new_datetime_start > event_within_datetime_start
...@@ -201,6 +203,7 @@ class Absence(FreeBusy): ...@@ -201,6 +203,7 @@ class Absence(FreeBusy):
# First, cut end date of existing one # First, cut end date of existing one
event_within.datetime_end = new_datetime_start event_within.datetime_end = new_datetime_start
event_within.save(skip_overlap_handling=True) event_within.save(skip_overlap_handling=True)
modified_absences.append(event_within)
# Then, create new event based on existing one filling up the remaining time # Then, create new event based on existing one filling up the remaining time
end_filler_event = event_within end_filler_event = event_within
end_filler_event.pk = None end_filler_event.pk = None
...@@ -212,11 +215,14 @@ class Absence(FreeBusy): ...@@ -212,11 +215,14 @@ class Absence(FreeBusy):
end_filler_event.datetime_end = event_within_datetime_end end_filler_event.datetime_end = event_within_datetime_end
end_filler_event.save(skip_overlap_handling=True) end_filler_event.save(skip_overlap_handling=True)
modified_absences.append(end_filler_event)
elif ( elif (
new_datetime_start <= event_within_datetime_start new_datetime_start <= event_within_datetime_start
and new_datetime_end >= event_within_datetime_end and new_datetime_end >= event_within_datetime_end
): ):
# Delete existing event # Delete existing event
if event_within in modified_absences:
modified_absences.delete(event_within)
event_within.delete() event_within.delete()
elif ( elif (
new_datetime_start > event_within_datetime_start new_datetime_start > event_within_datetime_start
...@@ -226,6 +232,7 @@ class Absence(FreeBusy): ...@@ -226,6 +232,7 @@ class Absence(FreeBusy):
# Cut end of existing event # Cut end of existing event
event_within.datetime_end = new_datetime_start event_within.datetime_end = new_datetime_start
event_within.save(skip_overlap_handling=True) event_within.save(skip_overlap_handling=True)
modified_absences.append(event_within)
elif ( elif (
new_datetime_start <= event_within_datetime_start new_datetime_start <= event_within_datetime_start
and new_datetime_end < event_within_datetime_end and new_datetime_end < event_within_datetime_end
...@@ -234,9 +241,13 @@ class Absence(FreeBusy): ...@@ -234,9 +241,13 @@ class Absence(FreeBusy):
# Cut start of existing event # Cut start of existing event
event_within.datetime_start = new_datetime_end event_within.datetime_start = new_datetime_end
event_within.save(skip_overlap_handling=True) event_within.save(skip_overlap_handling=True)
modified_absences.append(event_within)
modified_absences.append(self)
if not skip_save: if not skip_save:
super().save(*args, **kwargs) super().save(*args, **kwargs)
self._modified_absences = modified_absences
class Meta: class Meta:
verbose_name = _("Absence") verbose_name = _("Absence")
......
...@@ -89,70 +89,13 @@ class AbsenceBatchCreateMutation(BaseBatchCreateMutation): ...@@ -89,70 +89,13 @@ class AbsenceBatchCreateMutation(BaseBatchCreateMutation):
permissions = ("kolego.create_absence_rule",) permissions = ("kolego.create_absence_rule",)
@classmethod @classmethod
def before_save(cls, root, info, input, created_objects): # noqa def before_save(cls, root, info, input, created_objs): # noqa
modified_created_objects = [] modified_absences = []
for obj in created_objects: for absence in created_objs:
events_within = ( modified_absences += getattr(absence, "_modified_absences", [])
Absence.get_objects(
None,
{"person": obj.person.pk},
start=obj.datetime_start or obj.date_start,
end=obj.datetime_end or obj.date_end,
)
.order_by("pk")
.filter(reason=obj.reason)
)
if events_within.exists(): return modified_absences
# Convert dates of new event to datetimes in case dates are used
new_datetime_start = (
obj.datetime_start
if obj.datetime_start
else datetime.combine(obj.date_start, time())
).astimezone(obj.timezone)
new_datetime_end = (
obj.datetime_end
if obj.datetime_end
else datetime.combine(obj.date_end, datetime.max.time())
).astimezone(obj.timezone)
events_within_datetime_start_list = [
(
Absence.value_start_datetime(event_within)
if event_within.datetime_start
else datetime.combine(Absence.value_start_datetime(event_within), time())
)
for event_within in events_within
]
events_within_datetime_end_list = [
(
Absence.value_end_datetime(event_within)
if event_within.datetime_end
else datetime.combine(
Absence.value_end_datetime(event_within), datetime.max.time()
)
).astimezone(event_within.timezone)
for event_within in events_within
]
# Extend overlapping lesson with same reason
last_event_within = events_within.last()
last_event_within.datetime_start = min(
new_datetime_start, *events_within_datetime_start_list
)
last_event_within.datetime_end = max(
new_datetime_end, *events_within_datetime_end_list
)
events_within.exclude(pk=last_event_within.pk).delete()
modified_created_objects.append(last_event_within)
else:
modified_created_objects.append(obj)
return modified_created_objects
class AbsenceBatchDeleteMutation(BaseBatchDeleteMutation): class AbsenceBatchDeleteMutation(BaseBatchDeleteMutation):
...@@ -176,6 +119,16 @@ class AbsenceBatchPatchMutation(BaseBatchPatchMutation): ...@@ -176,6 +119,16 @@ class AbsenceBatchPatchMutation(BaseBatchPatchMutation):
) )
permissions = ("kolego.edit_absence_rule",) permissions = ("kolego.edit_absence_rule",)
@classmethod
def after_mutate(cls, root, info, input, updated_objs, return_data): # noqa
modified_absences = []
for absence in updated_objs:
modified_absences += getattr(absence, "_modified_absences", [])
return_data[cls._meta.return_field_name] = modified_absences
return return_data
class AbsenceReasonBatchCreateMutation(BaseBatchCreateMutation): class AbsenceReasonBatchCreateMutation(BaseBatchCreateMutation):
class Meta: class Meta:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment