Skip to content
Snippets Groups Projects
Verified Commit 23cb5092 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Introduce option for configuring the creating of course groups

parent 15d41524
No related branches found
No related tags found
1 merge request!120Resolve "Create match failures as data checks"
Pipeline #53490 passed
from django.utils.translation import gettext_lazy as _
from core.data_checks import DataCheck, IgnoreSolveOption
class CreatedNotPrimarySourceDataCheck(DataCheck):
name = "untis_created_not_primary_source"
verbose_name = _("Objects created by Untis import although Untis is not the primary source.")
problem_name = _(
"There is an object created by Untis import although Untis is not the primary source."
)
solve_options = {IgnoreSolveOption.name: IgnoreSolveOption}
class NotCreatedNotPrimarySourceDataCheck(DataCheck):
name = "untis_not_created_not_primary_source"
verbose_name = _(
"Objects were not created by Untis import because Untis is not the primary source."
)
problem_name = _(
"There is an object created by Untis import although Untis is not the primary source."
)
solve_options = {IgnoreSolveOption.name: IgnoreSolveOption}
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _
from dynamic_preferences.preferences import Section
from dynamic_preferences.types import BooleanPreference
from dynamic_preferences.types import BooleanPreference, ModelChoicePreference
from aleksis.core.registries import site_preferences_registry
......@@ -89,3 +90,21 @@ class UseCourseGroups(BooleanPreference):
help_text = _(
"Build or search course groups for every course" " instead of setting classes as groups."
)
@site_preferences_registry.register
class DataTypesForWhichUntisIsPrimarySource(ModelChoicePreference):
section = untis_mysql
name = "data_types_primary_source"
verbose_name = _("Data types for which Untis is primary source")
help_text = _("Currently supported objects: Groups")
default = []
model = ContentType
@site_preferences_registry.register
class CreateObjectsForWhichUntisIsNotPrimarySource(BooleanPreference):
section = untis_mysql
name = "create_objects_untis_not_primary_source"
default = True
verbose_name = _("Create objects for which Untis is not primary source")
......@@ -13,10 +13,12 @@ from aleksis.core import models as core_models
from aleksis.core.util.core_helpers import get_site_preferences
from .... import models as mysql_models
from ....data_checks import CreatedNotPrimarySourceDataCheck
from ..util import (
TQDM_DEFAULTS,
compare_m2m,
connect_untis_fields,
is_untis_primary_source,
run_default_filter,
untis_split_third,
)
......@@ -131,17 +133,21 @@ def import_lessons(
).filter(Q(school_term__isnull=True) | Q(school_term=validity_range.school_term))
# Check if found groups match
match = False
course_group = None
for found_group in qs:
if compare_m2m(course_classes, found_group.parent_groups.all()):
match = True
course_group = found_group
logger.info(
" Course group found by searching by parent groups and subject"
)
changed = False
if not match:
is_primary_source = is_untis_primary_source(core_models.Group)
create_if_not_primary = get_site_preferences()[
"untis_mysql__is_primary_source = is_untis_primary_source(Group)"
]
if not course_group and (is_primary_source or create_if_not_primary):
# No matching group found
# Build names and refs for course groups
......@@ -174,29 +180,36 @@ def import_lessons(
changed = True
# Update owners
course_group.owners.set(teachers)
if created and not is_primary_source:
CreatedNotPrimarySourceDataCheck.register_result(course_group)
# Update import ref
if course_group.import_ref_untis != group_import_ref:
course_group.import_ref_untis = group_import_ref
logger.info(" Import reference of course group updated")
changed = True
if course_group:
# Update owners
course_group.owners.set(teachers)
if course_group.subject != subject:
course_group.subject = subject
logger.info(" Subject reference of course group updated")
changed = True
# Update import ref
if course_group.import_ref_untis != group_import_ref:
course_group.import_ref_untis = group_import_ref
logger.info(" Import reference of course group updated")
changed = True
if course_group.school_term != validity_range.school_term:
course_group.school_term = validity_range.school_term
logger.info(" School term reference of course group updated")
changed = True
if course_group.subject != subject:
course_group.subject = subject
logger.info(" Subject reference of course group updated")
changed = True
if changed:
course_group.save()
if course_group.school_term != validity_range.school_term:
course_group.school_term = validity_range.school_term
logger.info(" School term reference of course group updated")
changed = True
groups = [course_group]
if changed:
course_group.save()
groups = [course_group]
else:
groups = []
else:
groups = course_classes
......@@ -228,7 +241,8 @@ def import_lessons(
logger.info(" New lesson created")
# Sync groups
lesson.groups.set(groups)
if groups:
lesson.groups.set(groups)
# Sync teachers
lesson.teachers.set(teachers)
......
import logging
from datetime import date, datetime
from typing import Any, Callable, Optional, Sequence, Union
from typing import Any, Callable, Optional, Sequence, Type, Union
from django.contrib.contenttypes.models import ContentType
from django.db.models import Model, QuerySet
from aleksis.apps.chronos.models import ValidityRange
from aleksis.core.util.core_helpers import get_site_preferences
DB_NAME = "untis"
UNTIS_DATE_FORMAT = "%Y%m%d"
......@@ -162,3 +164,9 @@ def move_weekday_to_range(time_periods_ref: dict, weekday: int) -> int:
weekday = last_weekday
return weekday
def is_untis_primary_source(model: Type[Model]) -> bool:
"""Check if Untis is primary source for the model."""
allowed_content_types = get_site_preferences()["untis_primary_sources"]
return ContentType.objects.get_for_model(model) in allowed_content_types
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment