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

Merge branch '72-cancel-all-lessons-on-group-absences' into 'master'

Resolve "Cancel all lessons on group absences"

Closes #72

See merge request !191
parents 230084da 57569eca
No related branches found
No related tags found
1 merge request!191Resolve "Cancel all lessons on group absences"
Pipeline #193866 failed
import logging
from enum import Enum
from django.db.models import Count
from django.utils.translation import gettext as _
from reversion import create_revision, set_comment
from tqdm import tqdm
from aleksis.apps.chronos.models import LessonEvent
from aleksis.apps.kolego import models as kolego_models
from aleksis.apps.lesrooster.models import ValidityRange
from aleksis.core.models import Group
from .... import models as mysql_models
from ..util import (
......@@ -125,6 +128,42 @@ def import_absences(
existing_absences.append(import_ref)
ref[import_ref] = new_absence
# Cancel all lessons of this group
if group:
# Search parent groups with match
group_qs = Group.objects.annotate(parent_groups_count=Count("parent_groups")).filter(
parent_groups_count=1, parent_groups=group
)
# Search lesson events with exact groups or parent groups match
qs = LessonEvent.objects.filter(
amends__isnull=True, extended_data__event_untis__isnull=True
).filter(
pk__in=LessonEvent.objects.annotate(groups_count=Count("groups"))
.filter(groups_count=1, groups=group)
.values_list("id", flat=True)
.union(LessonEvent.objects.filter(groups__in=group_qs).values_list("id", flat=True))
)
affected_events = LessonEvent.get_single_events(
datetime_start, datetime_end, request=None, with_reference_object=True, queryset=qs
)
for affected_event in affected_events:
ref_object = affected_event["REFERENCE_OBJECT"]
amending_event, __ = LessonEvent.objects.update_or_create(
amends=ref_object,
datetime_start=affected_event["DTSTART"].dt,
datetime_end=affected_event["DTEND"].dt,
defaults=dict(cancelled=True),
)
amending_event.extended_data["cancelled_by_absence_untis"] = import_ref
amending_event.save()
logging.info(
f" Cancel lesson event {ref_object.id} from {affected_event['DTSTART'].dt} "
f"to {affected_event['DTEND'].dt} with event {amending_event.id}"
)
# Delete all no longer existing absences
for a in kolego_models.Absence.objects.filter(
extended_data__import_ref_untis__isnull=False,
......
......@@ -47,8 +47,6 @@ def import_events(
for event in tqdm(events, desc="Import events", **TQDM_DEFAULTS):
import_ref = event.event_id
logger.info(f"Import event {import_ref}")
# Build values
comment = event.text or ""
......@@ -59,6 +57,11 @@ def import_events(
weekday_from = datetime_start.weekday()
weekday_to = datetime_end.weekday()
logger.info(
f"Import event {import_ref} ({datetime_start}-{datetime_end}, "
f"{slot_start}-{slot_end}, {comment})"
)
# Check min/max weekdays
weekday_from = move_weekday_to_range(slots_ref, weekday_from)
weekday_to = move_weekday_to_range(slots_ref, weekday_to)
......@@ -102,7 +105,10 @@ def import_events(
datetime_start = slot_start.get_datetime_start(datetime_start)
datetime_end = slot_end.get_datetime_end(datetime_end)
new_event, created = LessonEvent.objects.update_or_create(
new_event, created = LessonEvent.objects.filter(
datetime_start__date__lte=validity_range.date_end,
datetime_end__date__gte=validity_range.date_start,
).update_or_create(
extended_data__event_untis=import_ref,
defaults={
"datetime_start": datetime_start,
......@@ -110,6 +116,7 @@ def import_events(
"title": comment,
"slot_number_start": slot_start.period,
"slot_number_end": slot_end.period,
"cancelled": False,
},
)
......
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