diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py index fecd602689bba92928b9c3811fae642bb7d26a6e..bf639c33979131509fd63946c0bc3b7ec6f7ad2e 100644 --- a/aleksis/apps/untis/model_extensions.py +++ b/aleksis/apps/untis/model_extensions.py @@ -82,3 +82,8 @@ chronos_models.Absence.field( verbose_name=_("UNTIS import reference"), null=True, blank=True ) ) +chronos_models.Event.field( + import_ref_untis=IntegerField( + verbose_name=_("UNTIS import reference"), null=True, blank=True + ) +) diff --git a/aleksis/apps/untis/util/mysql/importers/events.py b/aleksis/apps/untis/util/mysql/importers/events.py new file mode 100644 index 0000000000000000000000000000000000000000..9c0dccc2a836ede548396d112437c404401afff8 --- /dev/null +++ b/aleksis/apps/untis/util/mysql/importers/events.py @@ -0,0 +1,134 @@ +import logging + +from aleksis.apps.chronos import models as chronos_models + +from .... import models as mysql_models +from ..util import ( + run_default_filter, + get_term, + untis_date_to_date, + move_weekday_to_range, + get_first_period, + get_last_period, + connect_untis_fields, sync_m2m, +) + +logger = logging.getLogger(__name__) + + +def import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref): + ref = {} + + # Get term + term = get_term() + term_date_start = untis_date_to_date(term.datefrom) + term_date_end = untis_date_to_date(term.dateto) + + # Get absences + events = ( + run_default_filter(mysql_models.Event.objects, filter_term=False) + .filter(datefrom__lte=term.dateto, dateto__gte=term.datefrom) + .order_by("event_id") + ) + + existing_events = [] + for event in events: + import_ref = event.event_id + + logger.info("Import event {}".format(import_ref)) + + # Build values + comment = event.text + + date_from = untis_date_to_date(event.datefrom) + date_to = untis_date_to_date(event.dateto) + period_from = event.lessonfrom + period_to = event.lessonto + weekday_from = date_from.weekday() + 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) + + # Check min/max periods + first_period = get_first_period(time_periods_ref, weekday_from) + last_period = get_last_period(time_periods_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] + + groups = [] + teachers = [] + rooms = [] + + # Get groups, teachers and rooms + raw_events = connect_untis_fields(event, "eventelement", 10) + for raw_event in raw_events: + el = raw_event.split("~") + + # Group + if el[0] != "0" and el[0] != "": + group = classes_ref[int(el[0])] + groups.append(group) + + # Teacher + if el[2] != "0" and el[2] != "": + teacher = teachers_ref[int(el[2])] + teachers.append(teacher) + + # Room + if el[3] != "0" and el[3] != "": + room = rooms_ref[int(el[3])] + rooms.append(room) + + new_event, created = chronos_models.Event.objects.get_or_create( + import_ref_untis=import_ref, + defaults={ + "date_start": date_from, + "date_end": date_to, + "period_from": time_period_from, + "period_to": time_period_to, + "title": comment, + }, + ) + + if created: + logger.info(" New event created") + + # Sync simple fields + if ( + new_event.date_start != date_from + or new_event.date_end != date_to + or new_event.period_from != time_period_from + or new_event.period_to != time_period_to + or new_event.title != comment + ): + new_event.date_start = date_from + new_event.date_end = date_to + new_event.period_from = time_period_from + new_event.period_to = time_period_to + new_event.title = comment + new_event.save() + logger.info(" Time range and title updated") + + # Sync m2m-fields + sync_m2m(groups, new_event.groups) + sync_m2m(teachers, new_event.teachers) + sync_m2m(rooms, new_event.rooms) + + existing_events.append(import_ref) + ref[import_ref] = new_event + + # Delete all no longer existing events + for e in chronos_models.Event.objects.filter( + date_start__lte=term_date_start, date_end__gte=term_date_end + ): + if e.import_ref_untis and e.import_ref_untis not in existing_events: + logger.info("Event {} deleted".format(e.id)) + e.delete() diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py index b004de24ea86a220c2bf95c4eadf81279e4dc142..15f7230151e0b241cf1e81544e57cc83a4d932ff 100644 --- a/aleksis/apps/untis/util/mysql/main.py +++ b/aleksis/apps/untis/util/mysql/main.py @@ -9,6 +9,7 @@ from .importers.common_data import ( import_breaks, import_absence_reasons, ) +from .importers.events import import_events from .importers.lessons import import_lessons from .importers.substitutions import import_substitutions @@ -36,3 +37,6 @@ def untis_import_mysql(): # Substitutions import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref) import_substitutions(teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref) + + # Events + import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref)