From e2b081dd7091f1d35d60d4c595e2f8cc9687d56e Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Wed, 1 Jul 2020 16:57:10 +0200 Subject: [PATCH] Import absences and substitutions related to school term and validity range --- .../untis/util/mysql/importers/absences.py | 34 +++++++++++-------- .../util/mysql/importers/substitutions.py | 19 +++++------ aleksis/apps/untis/util/mysql/main.py | 10 +++--- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/aleksis/apps/untis/util/mysql/importers/absences.py b/aleksis/apps/untis/util/mysql/importers/absences.py index 9527e00..d3af5d8 100644 --- a/aleksis/apps/untis/util/mysql/importers/absences.py +++ b/aleksis/apps/untis/util/mysql/importers/absences.py @@ -1,6 +1,7 @@ import logging from enum import Enum +from aleksis.apps.chronos.models import ValidityRange from tqdm import tqdm from aleksis.apps.chronos import models as chronos_models @@ -10,10 +11,10 @@ from ..util import ( TQDM_DEFAULTS, get_first_period, get_last_period, - get_term, move_weekday_to_range, run_default_filter, untis_date_to_date, + date_to_untis_date, ) logger = logging.getLogger(__name__) @@ -26,18 +27,16 @@ class AbsenceType(Enum): ROOM = 102 -def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref): +def import_absences(validity_range: ValidityRange, absence_reasons_ref, 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) + untis_term_start = date_to_untis_date(validity_range.date_start) + untis_term_end = date_to_untis_date(validity_range.date_end) # Get absences absences = ( - run_default_filter(mysql_models.Absence.objects, filter_term=False) - .filter(datefrom__lte=term.dateto, dateto__gte=term.datefrom) + run_default_filter(validity_range, mysql_models.Absence.objects, filter_term=False) + .filter(datefrom__lte=untis_term_end, dateto__gte=untis_term_start) .order_by("absence_id") ) @@ -101,6 +100,7 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes "period_from": time_period_from, "period_to": time_period_to, "comment": absence.text, + "school_term": validity_range.school_term, }, ) @@ -117,6 +117,7 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes 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 @@ -127,16 +128,19 @@ def import_absences(absence_reasons_ref, time_periods_ref, teachers_ref, classes 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 new_absence.save() logger.info(" Absence updated") 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=term_date_start, date_end__gte=term_date_end - ): - if a.import_ref_untis and a.import_ref_untis not in existing_absences: - logger.info("Absence {} deleted".format(a.id)) - a.delete() + # 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 + ): + if a.import_ref_untis and a.import_ref_untis not in existing_absences: + logger.info("Absence {} deleted".format(a.id)) + a.delete() + + return ref diff --git a/aleksis/apps/untis/util/mysql/importers/substitutions.py b/aleksis/apps/untis/util/mysql/importers/substitutions.py index df57a9d..78a85d3 100644 --- a/aleksis/apps/untis/util/mysql/importers/substitutions.py +++ b/aleksis/apps/untis/util/mysql/importers/substitutions.py @@ -1,6 +1,7 @@ import logging from enum import Enum +from aleksis.apps.chronos.models import ValidityRange from django.db.models import Q from calendarweek import CalendarWeek @@ -11,10 +12,10 @@ from aleksis.apps.chronos import models as chronos_models from .... import models as mysql_models from ..util import ( TQDM_DEFAULTS, - get_term, run_default_filter, untis_date_to_date, untis_split_first, + date_to_untis_date, ) logger = logging.getLogger(__name__) @@ -26,16 +27,13 @@ class SubstitutionFlag(Enum): def import_substitutions( - teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref, + validity_range: ValidityRange, teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref, ): """Import substitutions.""" - term = get_term() - date_start = untis_date_to_date(term.datefrom) - date_end = untis_date_to_date(term.dateto) subs = ( - run_default_filter(mysql_models.Substitution.objects, filter_term=False) - .filter(date__gte=term.datefrom, date__lte=term.dateto) + run_default_filter(validity_range, mysql_models.Substitution.objects, filter_term=False) + .filter(date__gte=date_to_untis_date(validity_range.date_start), date__lte=date_to_untis_date(validity_range.date_end)) .exclude( Q(flags__contains="N") | Q(flags__contains="b") @@ -91,6 +89,7 @@ def import_substitutions( if not is_supervision_substitution: lesson_periods = chronos_models.LessonPeriod.objects.filter( + lesson__validity=validity_range, lesson__lesson_id_untis=lesson_id, lesson__teachers=teacher_old, period__period=period, @@ -221,20 +220,20 @@ def import_substitutions( logger.info(" Supervision substitution updated") # Delete all no longer existing substitutions - for s in chronos_models.LessonSubstitution.objects.within_dates(date_start, date_end): + for s in chronos_models.LessonSubstitution.objects.within_dates(validity_range.date_start, validity_range.date_end): if s.import_ref_untis and s.import_ref_untis not in existing_subs: logger.info("Substitution {} deleted".format(s.id)) s.delete() # Delete all no longer existing extra lessons - for s in chronos_models.ExtraLesson.objects.within_dates(date_start, date_end): + for s in chronos_models.ExtraLesson.objects.within_dates(validity_range.date_start, validity_range.date_end): if s.import_ref_untis and s.import_ref_untis not in existing_subs: logger.info("Extra lesson {} deleted".format(s.id)) s.delete() # Delete all no longer existing supervision substitutions for s in chronos_models.SupervisionSubstitution.objects.filter( - date__gte=date_start, date__lte=date_end + date__gte=validity_range.date_start, date__lte=validity_range.date_end ): if s.import_ref_untis and s.import_ref_untis not in existing_subs: logger.info("Supervision substitution {} deleted".format(s.id)) diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py index 7d11bcd..f6276ea 100644 --- a/aleksis/apps/untis/util/mysql/main.py +++ b/aleksis/apps/untis/util/mysql/main.py @@ -49,11 +49,11 @@ def untis_import_mysql(): # Lessons import_lessons(validity_range, time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref) - # 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, time_periods_ref, - ) + # Substitutions + import_absences(validity_range, absence_reasons_ref, time_periods_ref, teachers_ref, classes_ref, rooms_ref) + import_substitutions( + validity_range, teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref, time_periods_ref, + ) # Events import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref) -- GitLab