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

Add classmethod that gets/creates one absence for given time span

parent 8ced4059
No related branches found
No related tags found
1 merge request!52Resolve "Only allow one absence at any point of time"
from datetime import datetime, time
from datetime import date, datetime, time
from django.db import models
from django.db.models import Q, QuerySet
......@@ -11,7 +11,7 @@ from aleksis.core.managers import (
RecurrencePolymorphicManager,
)
from aleksis.core.mixins import ExtensibleModel
from aleksis.core.models import FreeBusy
from aleksis.core.models import FreeBusy, Person
from ..managers import AbsenceQuerySet
......@@ -148,7 +148,7 @@ class Absence(FreeBusy):
return f"{self.person} ({self.datetime_start} - {self.datetime_end})"
def save(self, *args, skip_overlap_handling=False, **kwargs):
skip_save = False
extended_absence = None
modified_absences = []
if not skip_overlap_handling:
......@@ -187,12 +187,12 @@ class Absence(FreeBusy):
# If overlapping absence has the same reason, just extend it
if event_within.reason == self.reason:
skip_save = True
event_within.datetime_start = min(
new_datetime_start, event_within_datetime_start
)
event_within.datetime_end = max(new_datetime_end, event_within_datetime_end)
event_within.save(skip_overlap_handling=True)
extended_absence = event_within
modified_absences.append(event_within)
else:
if (
......@@ -245,10 +245,40 @@ class Absence(FreeBusy):
modified_absences.append(self)
if not skip_save:
if extended_absence is not None:
self._extended_absence = extended_absence
else:
super().save(*args, **kwargs)
self._modified_absences = modified_absences
@classmethod
def get_for_person_by_datetimes(
cls,
person: Person,
datetime_start: datetime | None = None,
datetime_end: datetime | None = None,
date_start: date | None = None,
date_end: date | None = None,
defaults: dict | None = None,
**kwargs,
) -> "Absence":
data = {"person": person, **kwargs}
if date_start:
data["date_start"] = date_start
data["date_end"] = date_end
else:
data["datetime_start"] = datetime_start
data["datetime_end"] = datetime_end
absence, created = cls.objects.get_or_create(**data, defaults=defaults)
if created:
if hasattr(absence, "_extended_absence"):
return absence._extended_absence
return absence
return absence
class Meta:
verbose_name = _("Absence")
verbose_name_plural = _("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