From 0fb8bd9edb022b6a311b5ea93f92d4e43c399559 Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Thu, 16 Apr 2020 14:58:16 +0200
Subject: [PATCH] Use tqdm for progress bar

---
 .../untis/util/mysql/importers/absences.py    |  7 +++---
 .../untis/util/mysql/importers/common_data.py | 24 ++++++++++---------
 .../apps/untis/util/mysql/importers/events.py |  6 +++--
 .../untis/util/mysql/importers/holidays.py    |  5 ++--
 .../untis/util/mysql/importers/lessons.py     |  5 ++--
 .../util/mysql/importers/substitutions.py     |  5 ++--
 aleksis/apps/untis/util/mysql/util.py         |  5 ++++
 pyproject.toml                                |  1 +
 8 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/aleksis/apps/untis/util/mysql/importers/absences.py b/aleksis/apps/untis/util/mysql/importers/absences.py
index 05de71f..d6b7d45 100644
--- a/aleksis/apps/untis/util/mysql/importers/absences.py
+++ b/aleksis/apps/untis/util/mysql/importers/absences.py
@@ -1,12 +1,14 @@
 import logging
 
+from tqdm import tqdm
+
 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,
+    untis_date_to_date, move_weekday_to_range, get_first_period, get_last_period, TQDM_DEFAULTS,
 )
 
 logger = logging.getLogger(__name__)
@@ -31,13 +33,12 @@ def import_absences(
     )
 
     existing_absences = []
-    for absence in absences:
+    for absence in tqdm(absences, desc="Import absences", **TQDM_DEFAULTS):
         import_ref = absence.absence_id
 
         logger.info("Import absence {}".format(import_ref))
 
         if absence.absence_reason_id == 0:
-            logger.warning("  Absence reason needed")
             reason = unknown_reason
         else:
             reason = absence_reasons_ref[absence.absence_reason_id]
diff --git a/aleksis/apps/untis/util/mysql/importers/common_data.py b/aleksis/apps/untis/util/mysql/importers/common_data.py
index d867f2c..181ce76 100644
--- a/aleksis/apps/untis/util/mysql/importers/common_data.py
+++ b/aleksis/apps/untis/util/mysql/importers/common_data.py
@@ -3,12 +3,14 @@ from datetime import time
 from typing import List, Dict
 
 from constance import config
+from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
 from aleksis.core import models as core_models
 
 from .... import models as mysql_models
-from ..util import run_default_filter, untis_colour_to_hex, untis_split_first, sync_m2m, connect_untis_fields
+from ..util import run_default_filter, untis_colour_to_hex, untis_split_first, sync_m2m, connect_untis_fields, \
+    TQDM_DEFAULTS
 
 logger = logging.getLogger(__name__)
 
@@ -21,7 +23,7 @@ def import_subjects() -> Dict[int, chronos_models.Subject]:
     # Get subjects
     subjects = run_default_filter(mysql_models.Subjects.objects, filter_term=False)
 
-    for subject in subjects:
+    for subject in tqdm(subjects, desc="Import subjects", **TQDM_DEFAULTS):
         # Check if needed data are provided
         if not subject.name:
             logger.error(
@@ -90,7 +92,7 @@ def import_teachers() -> Dict[int, core_models.Person]:
     # Get teachers
     teachers = run_default_filter(mysql_models.Teacher.objects)
 
-    for teacher in teachers:
+    for teacher in tqdm(teachers, desc="Import teachers", **TQDM_DEFAULTS):
         # Check if needed data are provided
         if not teacher.name:
             logger.error(
@@ -160,7 +162,7 @@ def import_classes(
     # Get classes
     course_classes = run_default_filter(mysql_models.Class.objects, filter_term=True)
 
-    for class_ in course_classes:
+    for class_ in tqdm(course_classes, desc="Import classes", **TQDM_DEFAULTS):
         # Check if needed data are provided
         if not class_.name:
             logger.error(
@@ -229,7 +231,7 @@ def import_rooms() -> Dict[int, chronos_models.Room]:
     # Get rooms
     rooms = run_default_filter(mysql_models.Room.objects)
 
-    for room in rooms:
+    for room in tqdm(rooms, desc="Import rooms", **TQDM_DEFAULTS):
         if not room.name:
             logger.error(
                 "Room ID {}: Cannot import room without short name.".format(
@@ -283,7 +285,7 @@ def import_supervision_areas(
     # Get supervision areas
     areas = run_default_filter(mysql_models.Corridor.objects, filter_term=False)
 
-    for area in areas:
+    for area in tqdm(areas, desc="Import supervision areas", **TQDM_DEFAULTS):
         if not area.name:
             logger.error(
                 "Supervision area ID {}: Cannot import supervision area without short name.".format(
@@ -403,7 +405,7 @@ def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
     times = run_default_filter(mysql_models.Commondata.objects, filter_term=False).filter(id=30).order_by("number")
 
     times_ref = {}
-    for time_ in times:
+    for time_ in tqdm(times, desc="Import times", **TQDM_DEFAULTS):
         period = time_.number
 
         # Extract time
@@ -419,7 +421,7 @@ def import_time_periods() -> Dict[int, Dict[int, chronos_models.TimePeriod]]:
     )
 
     time_periods_ref = {}
-    for time_period in periods:
+    for time_period in tqdm(periods, desc="Import time periods", **TQDM_DEFAULTS):
         weekday = time_period.number - 1
         period = time_period.number1
         start_time = times_ref[period][0]
@@ -460,12 +462,12 @@ def import_breaks(
 ) -> Dict[int, Dict[int, chronos_models.Break]]:
     # Build breaks for all weekdays
     breaks_ref = {}
-    for weekday, time_periods in time_periods_ref.items():
+    for weekday, time_periods in tqdm(time_periods_ref.items(), desc="Import breaks (weekday)", **TQDM_DEFAULTS):
         breaks_ref[weekday] = {}
 
         # Add None two times in order to create breaks before first lesson and after last lesson
         time_periods_for_breaks = [None] + list(time_periods.values()) + [None]
-        for i, time_period in enumerate(time_periods_for_breaks):
+        for i, time_period in tqdm(enumerate(time_periods_for_breaks), desc="Import breaks (period)", **TQDM_DEFAULTS):
             # If last item (None) is reached, no further break must be created
             if i + 1 == len(time_periods_for_breaks):
                 break
@@ -505,7 +507,7 @@ def import_absence_reasons() -> Dict[int, chronos_models.AbsenceReason]:
     # Get reasons
     reasons = run_default_filter(mysql_models.Absencereason.objects, filter_term=False)
 
-    for reason in reasons:
+    for reason in tqdm(reasons, desc="Import absence reasons", **TQDM_DEFAULTS):
         if not reason.name:
             logger.error(
                 "Absence reason ID {}: Cannot import absence reason without short name.".format(
diff --git a/aleksis/apps/untis/util/mysql/importers/events.py b/aleksis/apps/untis/util/mysql/importers/events.py
index 9c0dccc..51b285b 100644
--- a/aleksis/apps/untis/util/mysql/importers/events.py
+++ b/aleksis/apps/untis/util/mysql/importers/events.py
@@ -1,5 +1,7 @@
 import logging
 
+from tqdm import tqdm
+
 from aleksis.apps.chronos import models as chronos_models
 
 from .... import models as mysql_models
@@ -10,7 +12,7 @@ from ..util import (
     move_weekday_to_range,
     get_first_period,
     get_last_period,
-    connect_untis_fields, sync_m2m,
+    connect_untis_fields, sync_m2m, TQDM_DEFAULTS,
 )
 
 logger = logging.getLogger(__name__)
@@ -32,7 +34,7 @@ def import_events(time_periods_ref, teachers_ref, classes_ref, rooms_ref):
     )
 
     existing_events = []
-    for event in events:
+    for event in tqdm(events, desc="Import events", **TQDM_DEFAULTS):
         import_ref = event.event_id
 
         logger.info("Import event {}".format(import_ref))
diff --git a/aleksis/apps/untis/util/mysql/importers/holidays.py b/aleksis/apps/untis/util/mysql/importers/holidays.py
index fe85b74..004acc2 100644
--- a/aleksis/apps/untis/util/mysql/importers/holidays.py
+++ b/aleksis/apps/untis/util/mysql/importers/holidays.py
@@ -1,11 +1,12 @@
 import logging
 from typing import Dict
 
+from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
 
 from .... import models as mysql_models
-from ..util import run_default_filter, untis_date_to_date
+from ..util import run_default_filter, untis_date_to_date, TQDM_DEFAULTS
 
 logger = logging.getLogger(__name__)
 
@@ -17,7 +18,7 @@ def import_holidays() -> Dict[int, chronos_models.Holiday]:
     # Get holidays
     holidays = run_default_filter(mysql_models.Holiday.objects, filter_term=False)
 
-    for holiday in holidays:
+    for holiday in tqdm(holidays, desc="Import holidays", **TQDM_DEFAULTS):
         import_ref = holiday.holiday_id
 
         # Check if needed data are provided
diff --git a/aleksis/apps/untis/util/mysql/importers/lessons.py b/aleksis/apps/untis/util/mysql/importers/lessons.py
index 5418c01..9e70b97 100644
--- a/aleksis/apps/untis/util/mysql/importers/lessons.py
+++ b/aleksis/apps/untis/util/mysql/importers/lessons.py
@@ -3,6 +3,7 @@ from datetime import timedelta
 
 from constance import config
 from django.utils.translation import gettext as _
+from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
 from aleksis.core import models as core_models
@@ -16,7 +17,7 @@ from ..util import (
     get_term,
     sync_m2m,
     compare_m2m,
-    connect_untis_fields,
+    connect_untis_fields, TQDM_DEFAULTS,
 )
 
 logger = logging.getLogger(__name__)
@@ -44,7 +45,7 @@ def import_lessons(
 
     # Lessons
     lessons = run_default_filter(mysql_models.Lesson.objects)
-    for lesson in lessons:
+    for lesson in tqdm(lessons, desc="Import lessons", **TQDM_DEFAULTS):
         lesson_id = lesson.lesson_id
 
         messages.info(None, message=_("Import lesson {}").format(lesson_id))
diff --git a/aleksis/apps/untis/util/mysql/importers/substitutions.py b/aleksis/apps/untis/util/mysql/importers/substitutions.py
index 351100d..32a9bb9 100644
--- a/aleksis/apps/untis/util/mysql/importers/substitutions.py
+++ b/aleksis/apps/untis/util/mysql/importers/substitutions.py
@@ -2,6 +2,7 @@ import logging
 
 from calendarweek import CalendarWeek
 from django.db.models import Q
+from tqdm import tqdm
 
 from aleksis.apps.chronos import models as chronos_models
 from ..util import (
@@ -9,7 +10,7 @@ from ..util import (
     untis_split_first,
     untis_date_to_date,
     sync_m2m,
-    get_term,
+    get_term, TQDM_DEFAULTS,
 )
 from .... import models as mysql_models
 
@@ -38,7 +39,7 @@ def import_substitutions(
     )
 
     existing_subs = []
-    for sub in subs:
+    for sub in tqdm(subs, desc="Import substitutions", **TQDM_DEFAULTS):
         # IDs
         sub_id = sub.substitution_id
         existing_subs.append(sub_id)
diff --git a/aleksis/apps/untis/util/mysql/util.py b/aleksis/apps/untis/util/mysql/util.py
index 128efa8..ac16e9f 100644
--- a/aleksis/apps/untis/util/mysql/util.py
+++ b/aleksis/apps/untis/util/mysql/util.py
@@ -10,6 +10,11 @@ DB_NAME = "untis"
 
 logger = logging.getLogger(__name__)
 
+TQDM_DEFAULTS = {
+ "disable": None,
+ "unit": "obj",
+ "dynamic_ncols": True,
+}
 
 def run_using(obj: QuerySet) -> QuerySet:
     return obj.using(DB_NAME)
diff --git a/pyproject.toml b/pyproject.toml
index 8fc6c3a..d6beadf 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -23,6 +23,7 @@ python = "^3.7"
 AlekSIS = { path = "../../.." }
 AlekSIS-App-Chronos = { path = "../AlekSIS-App-Chronos" }
 mysqlclient = "^1.4.6"
+tqdm = "^4.44.1"
 
 [build-system]
 requires = ["poetry>=0.12"]
-- 
GitLab