Skip to content
Snippets Groups Projects

Migrate to Cursus/Lesrooster

Merged Jonathan Weth requested to merge migrate-to-cursus-lesrooster into master
Compare and
16 files
+ 556
754
Compare changes
  • Side-by-side
  • Inline
Files
16
import logging
from datetime import timedelta
from enum import Enum
from calendarweek import CalendarWeek
from django.utils.translation import gettext as _
from reversion import create_revision, set_comment
from tqdm import tqdm
from aleksis.apps.chronos import models as chronos_models
from aleksis.apps.chronos.models import TimePeriod, ValidityRange
from aleksis.apps.kolego import models as kolego_models
from aleksis.apps.lesrooster.models import ValidityRange
from .... import models as mysql_models
from ..util import (
@@ -20,7 +21,7 @@ from ..util import (
)
logger = logging.getLogger(__name__)
unknown_reason, _ = chronos_models.AbsenceReason.objects.get_or_create(short_name="?")
unknown_reason, __ = kolego_models.AbsenceReason.objects.get_or_create(short_name="?")
class AbsenceType(Enum):
@@ -32,7 +33,7 @@ class AbsenceType(Enum):
def import_absences(
validity_range: ValidityRange,
absence_reasons_ref,
time_periods_ref,
slots_ref,
teachers_ref,
classes_ref,
rooms_ref,
@@ -72,116 +73,68 @@ def import_absences(
weekday_to = date_to.weekday()
# Check min/max weekdays
weekday_from = move_weekday_to_range(time_periods_ref, weekday_from)
weekday_to = move_weekday_to_range(time_periods_ref, weekday_to)
weekday_from = move_weekday_to_range(slots_ref, weekday_from)
weekday_to = move_weekday_to_range(slots_ref, weekday_to)
# Check min/max periods
first_period = get_first_period(time_periods_ref, weekday_from)
last_period = get_last_period(time_periods_ref, weekday_from)
first_period = get_first_period(slots_ref, weekday_from)
last_period = get_last_period(slots_ref, weekday_from)
if period_from == 0:
period_from = first_period
if period_to == 0:
period_to = last_period
time_period_from = time_periods_ref[weekday_from][period_from]
time_period_to = time_periods_ref[weekday_to][period_to]
comment = absence.text
slot_from = slots_ref[weekday_from][period_from]
slot_to = slots_ref[weekday_to][period_to]
comment = absence.text if absence.text else ""
datetime_start = slot_from.get_datetime_start(date_from)
datetime_end = slot_to.get_datetime_end(date_to)
group = None
teacher = None
room = None
if type_ == AbsenceType.GROUP.value:
group = classes_ref[absence.ida]
group = classes_ref[absence.ida] # noqa
elif type_ == AbsenceType.TEACHER.value:
teacher = teachers_ref[absence.ida]
elif type_ == AbsenceType.ROOM.value:
room = rooms_ref[absence.ida]
room = rooms_ref[absence.ida] # noqa
new_absence, created = chronos_models.Absence.objects.get_or_create(
import_ref_untis=import_ref,
defaults={
if teacher:
defaults = {
"reason": reason,
"group": group,
"teacher": teacher,
"room": room,
"date_start": date_from,
"date_end": date_to,
"period_from": time_period_from,
"period_to": time_period_to,
"comment": absence.text,
"school_term": validity_range.school_term,
},
)
if created:
logger.info(" New absence created")
if (
new_absence.reason != reason
or new_absence.group != group
or new_absence.teacher != teacher
or new_absence.room != room
or new_absence.date_start != date_from
or new_absence.date_end != date_to
or new_absence.period_from != time_period_from
or new_absence.period_to != time_period_to
or new_absence.comment != comment
or new_absence.school_term != validity_range.school_term
):
new_absence.reason = reason
new_absence.group = group
new_absence.teacher = teacher
new_absence.room = room
new_absence.date_start = date_from
new_absence.date_end = date_to
new_absence.period_from = time_period_from
new_absence.period_to = time_period_to
new_absence.comment = comment
new_absence.school_term = validity_range.school_term
"person": teacher,
"datetime_start": datetime_start,
"datetime_end": datetime_end,
"comment": comment,
}
new_absence, created = kolego_models.Absence.objects.update_or_create(
extended_data__import_ref_untis=import_ref, defaults=defaults
)
new_absence.extended_data["import_ref_untis"] = import_ref
new_absence.save()
logger.info(" Absence updated")
existing_absences.append(import_ref)
ref[import_ref] = new_absence
if group:
# If a group is absent, all lessons of this group are cancelled.
current_date = date_from
while current_date <= date_to:
current_period_from = (
period_from if current_date == date_from else TimePeriod.period_min
)
current_period_to = period_to if current_date == date_to else TimePeriod.period_max
lesson_periods = (
chronos_models.LessonPeriod.objects.filter_group(group)
.on_day(current_date)
.filter(
period__period__gte=current_period_from,
period__period__lte=current_period_to,
)
)
for lesson_period in lesson_periods:
week = CalendarWeek.from_date(current_date)
sub, __ = chronos_models.LessonSubstitution.objects.get_or_create(
lesson_period=lesson_period,
week=week.week,
year=week.year,
defaults=dict(cancelled=True, absence_ref_untis=import_ref),
)
created_substitutions.append(sub)
current_date += timedelta(days=1)
if created:
logger.info(" New absence created")
existing_absences.append(import_ref)
ref[import_ref] = new_absence
# Delete all no longer existing absences
for a in chronos_models.Absence.objects.filter(
date_start__lte=validity_range.date_end, date_end__gte=validity_range.date_start
for a in kolego_models.Absence.objects.filter(
extended_data__import_ref_untis__isnull=False,
datetime_start__date__lte=validity_range.date_end,
datetime_end__date__gte=validity_range.date_start,
):
if a.import_ref_untis and a.import_ref_untis not in existing_absences:
if a.extended_data["import_ref_untis"] not in existing_absences:
logger.info(f"Absence {a.id} deleted")
a.delete()
with create_revision():
set_comment(_("Deleted by Untis import"))
a.delete()
return ref, created_substitutions
Loading