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