diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f6162fac619ddd09347f009f2a777cad9807fc32..8e558fb1956617ff36280768b3fefdef47089f47 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -29,6 +29,7 @@ Fixed * Search course groups not only by parent groups and subject, but also take the teachers (group owners) into account * Don't recreate lesson periods if they change, but just update them. +* Import failed if there were multiple versions for a term in the future. `2.1.3`_ - 2022-02-06 --------------------- diff --git a/aleksis/apps/untis/commands.py b/aleksis/apps/untis/commands.py index ae85233596d18b6f63f6c1f9e4434e6709e6ffd6..515c7f8cc4c3d8979f9372d5e807ed48c69b69bf 100644 --- a/aleksis/apps/untis/commands.py +++ b/aleksis/apps/untis/commands.py @@ -1,10 +1,11 @@ from typing import Optional -from django.db.models import QuerySet +from django.db.models import Q, QuerySet from django.utils.functional import classproperty from aleksis.apps.untis.util.mysql.importers.terms import ( get_future_terms_for_date, + get_terms, get_terms_for_date, ) @@ -72,7 +73,12 @@ class CurrentNextImportCommand(ImportCommand): terms = get_terms_for_date() future_terms = get_future_terms_for_date() if future_terms.exists(): - terms = terms.union(future_terms[0:1]) + future_term = future_terms.first() + terms = ( + get_terms() + .filter(Q(pk__in=terms.values_list("pk", flat=True)) | Q(pk=future_term.pk)) + .distinct() + ) return terms @@ -85,7 +91,14 @@ class CurrentFutureImportCommand(ImportCommand): def get_terms(cls) -> Optional[QuerySet]: terms = get_terms_for_date() future_terms = get_future_terms_for_date() - terms = terms.union(future_terms) + terms = ( + get_terms() + .filter( + Q(pk__in=terms.values_list("pk", flat=True)) + | Q(pk__in=future_terms.values_list("pk", flat=True)) + ) + .distinct() + ) return terms diff --git a/aleksis/apps/untis/util/mysql/importers/terms.py b/aleksis/apps/untis/util/mysql/importers/terms.py index 092a9f9d990e7056461257afc74cb3c8560ad66b..99f1dd1375ecf66082d3e4c44504053e501bbcd5 100644 --- a/aleksis/apps/untis/util/mysql/importers/terms.py +++ b/aleksis/apps/untis/util/mysql/importers/terms.py @@ -19,12 +19,17 @@ from aleksis.core import models as core_models from .... import models as mysql_models +def get_terms() -> QuerySet: + """Get all terms.""" + return run_using(mysql_models.Terms.objects).order_by("datefrom") + + def get_terms_for_date(for_date: Optional[date] = None) -> QuerySet: """Get term queryset with term valid for the provided date.""" if not for_date: for_date = timezone.now().date() - qs = run_using(mysql_models.Terms.objects).filter( + qs = get_terms().filter( datefrom__lte=date_to_untis_date(for_date), dateto__gte=date_to_untis_date(for_date), ) @@ -37,7 +42,7 @@ def get_future_terms_for_date(for_date: Optional[date] = None) -> QuerySet: if not for_date: for_date = timezone.now().date() - qs = run_using(mysql_models.Terms.objects).filter( + qs = get_terms().filter( datefrom__gt=date_to_untis_date(for_date), )