diff --git a/aleksis/apps/untis/model_extensions.py b/aleksis/apps/untis/model_extensions.py index 58f050277550a168645ae260d7874fe8c97417e1..b9a3eef0f95f75276ae745cc3f59c96ead640126 100644 --- a/aleksis/apps/untis/model_extensions.py +++ b/aleksis/apps/untis/model_extensions.py @@ -70,3 +70,7 @@ chronos_models.Event.field( chronos_models.Holiday.field( import_ref_untis=IntegerField(verbose_name=_("UNTIS import reference"), null=True, blank=True) ) +chronos_models.ExtraLesson.field( + import_ref_untis=IntegerField(verbose_name=_("UNTIS import reference"), null=True, blank=True) +) + diff --git a/aleksis/apps/untis/util/mysql/importers/substitutions.py b/aleksis/apps/untis/util/mysql/importers/substitutions.py index 33f6214c444735f705498d7731f187f1268c8e62..c25e65b537290db9d3d778e3e0a9656b2c3f89da 100644 --- a/aleksis/apps/untis/util/mysql/importers/substitutions.py +++ b/aleksis/apps/untis/util/mysql/importers/substitutions.py @@ -25,7 +25,14 @@ class SubstitutionFlag(Enum): CANCELLED_FOR_TEACHERS = "F" -def import_substitutions(teachers_ref, subjects_ref, rooms_ref, classes_ref, supervision_areas_ref): +def import_substitutions( + teachers_ref, + subjects_ref, + rooms_ref, + classes_ref, + supervision_areas_ref, + time_periods_ref, +): """ Import substitutions """ term = get_term() @@ -161,8 +168,34 @@ def import_substitutions(teachers_ref, subjects_ref, rooms_ref, classes_ref, sup logger.info(" Substitution updated") else: - pass - # TODO: Special assignment, no existing lesson period for that substitution + logger.info(" Extra lesson detected") + time_period = time_periods_ref[date.weekday()][period] + + groups = [ + classes_ref[pk] for pk in untis_split_first(sub.classids, int) + ] + + room = room_old if not room_new and room_old else room_new + subject = subject_old if not subject_new else subject_new + ( + extra_lesson, + created, + ) = chronos_models.ExtraLesson.objects.update_or_create( + import_ref_untis=sub_id, + defaults={ + "week": week.week, + "period": time_period, + "subject": subject, + "room": room, + "comment": comment, + }, + ) + + if created: + logger.info(" Extra lesson created") + + extra_lesson.teachers.set(teachers) + extra_lesson.groups.set(groups) else: if teacher_new: logger.info(" Supervision substitution detected") @@ -197,10 +230,20 @@ def import_substitutions(teachers_ref, subjects_ref, rooms_ref, classes_ref, sup logger.info(" Supervision substitution updated") # Delete all no longer existing substitutions - chronos_models.LessonSubstitution.objects.within_dates(date_start, date_end).exclude( - import_ref_untis__in=existing_subs - ).delete() - chronos_models.SupervisionSubstitution.objects.filter( - date__gte=date_start, date__lte=date_end - ).exclude(existing_subs__in=existing_subs).delete() - logger.info("Left-over substitutions deleted") + for s in chronos_models.LessonSubstitution.objects.within_dates(date_start, 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): + 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): + if s.import_ref_untis and s.import_ref_untis not in existing_subs: + logger.info("Supervision substitution {} deleted".format(s.id)) + s.delete() + diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py index b28aae4bb7089f0a96621441a1094bf2772de1d2..7fd537e5629c7f8790d5f421839a924a7b3d3808 100644 --- a/aleksis/apps/untis/util/mysql/main.py +++ b/aleksis/apps/untis/util/mysql/main.py @@ -43,7 +43,7 @@ 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) + import_substitutions(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)