From d54ba71dd07bf07efd59283374862c88037053a6 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Sun, 25 Jul 2021 21:28:11 +0200 Subject: [PATCH] Wrap the complete import in an atomic revision --- CHANGELOG.rst | 8 +++ aleksis/apps/untis/util/mysql/main.py | 89 +++++++++++++++------------ 2 files changed, 57 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index dcfd0ee..7008efb 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,14 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog`_, and this project adheres to `Semantic Versioning`_. +Unreleased +---------- + +Changed +~~~~~~~ + +* Wrap all imports in complete revisions to make it possible to undo them completely and to track changes correctly. + `2.0rc1`_ - 2021-06-23 ---------------------- diff --git a/aleksis/apps/untis/util/mysql/main.py b/aleksis/apps/untis/util/mysql/main.py index f77c872..67474a5 100644 --- a/aleksis/apps/untis/util/mysql/main.py +++ b/aleksis/apps/untis/util/mysql/main.py @@ -1,8 +1,8 @@ from typing import Optional -from django.db import transaction from django.db.models import QuerySet +import reversion from tqdm import tqdm from aleksis.apps.untis.util.mysql.importers.terms import import_terms @@ -25,7 +25,6 @@ from .importers.lessons import import_lessons from .importers.substitutions import import_substitutions -@transaction.atomic def untis_import_mysql(terms: Optional[QuerySet] = None): # School terms and validity ranges validity_ref = import_terms(terms) @@ -33,48 +32,58 @@ def untis_import_mysql(terms: Optional[QuerySet] = None): for validity_range in tqdm( validity_ref.values(), desc="Import data for terms", **TQDM_DEFAULTS ): - # Common data for Chronos - subjects_ref = import_subjects(validity_range) - rooms_ref = import_rooms(validity_range) - absence_reasons_ref = import_absence_reasons(validity_range) + with reversion.create_revision(atomic=True): + reversion.set_comment(f"UNTIS import for validity range {validity_range}") - # Common data for core - teachers_ref = import_teachers(validity_range) - classes_ref = import_classes(validity_range, teachers_ref) + # Common data for Chronos + subjects_ref = import_subjects(validity_range) + rooms_ref = import_rooms(validity_range) + absence_reasons_ref = import_absence_reasons(validity_range) - # Time periods - time_periods_ref = import_time_periods(validity_range) - breaks_ref = import_breaks(validity_range, time_periods_ref) + # Common data for core + teachers_ref = import_teachers(validity_range) + classes_ref = import_classes(validity_range, teachers_ref) - # Holidays - holidays_ref = import_holidays(validity_range) + # Time periods + time_periods_ref = import_time_periods(validity_range) + breaks_ref = import_breaks(validity_range, time_periods_ref) - # Supervisions - supervision_areas_ref = import_supervision_areas(validity_range, breaks_ref, teachers_ref) + # Holidays + holidays_ref = import_holidays(validity_range) - # Lessons - import_lessons( - validity_range, time_periods_ref, rooms_ref, subjects_ref, teachers_ref, classes_ref, - ) + # Supervisions + supervision_areas_ref = import_supervision_areas( + validity_range, breaks_ref, teachers_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, - ) + # Lessons + import_lessons( + validity_range, + time_periods_ref, + rooms_ref, + subjects_ref, + teachers_ref, + classes_ref, + ) - # Events - import_events(validity_range, time_periods_ref, teachers_ref, classes_ref, rooms_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(validity_range, time_periods_ref, teachers_ref, classes_ref, rooms_ref) -- GitLab