Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/official/AlekSIS-App-Untis
  • sunweaver/AlekSIS-App-Untis
  • cocguPpenda/AlekSIS-App-Untis
  • 0inraMfauri/AlekSIS-App-Untis
4 results
Show changes
Showing
with 4087 additions and 4272 deletions
import logging
from django.utils.translation import gettext as _
from reversion import create_revision, set_comment
from tqdm import tqdm
from aleksis.apps.chronos import models as chronos_models
from aleksis.apps.chronos.models import ValidityRange
from aleksis.apps.chronos.models import LessonEvent, SupervisionEvent
from aleksis.apps.lesrooster.models import ValidityRange
from .... import models as mysql_models
from ..util import (
......@@ -15,13 +18,18 @@ from ..util import (
move_weekday_to_range,
run_default_filter,
untis_date_to_date,
untis_split_second,
)
logger = logging.getLogger(__name__)
def import_events(
validity_range: ValidityRange, time_periods_ref, teachers_ref, classes_ref, rooms_ref,
validity_range: ValidityRange,
slots_ref,
teachers_ref,
classes_ref,
rooms_ref,
):
ref = {}
......@@ -39,33 +47,36 @@ def import_events(
for event in tqdm(events, desc="Import events", **TQDM_DEFAULTS):
import_ref = event.event_id
logger.info("Import event {}".format(import_ref))
# Build values
comment = event.text
date_from = untis_date_to_date(event.datefrom)
date_to = untis_date_to_date(event.dateto)
period_from = event.lessonfrom
period_to = event.lessonto
weekday_from = date_from.weekday()
weekday_to = date_to.weekday()
comment = event.text or ""
datetime_start = untis_date_to_date(event.datefrom)
datetime_end = untis_date_to_date(event.dateto)
slot_start = event.lessonfrom
slot_end = event.lessonto
weekday_from = datetime_start.weekday()
weekday_to = datetime_end.weekday()
logger.info(
f"Import event {import_ref} ({datetime_start}-{datetime_end}, "
f"{slot_start}-{slot_end}, {comment})"
)
# Check min/max weekdays
weekday_from = move_weekday_to_range(time_periods_ref, weekday_from)
weekday_to = move_weekday_to_range(time_periods_ref, weekday_to)
weekday_from = move_weekday_to_range(slots_ref, weekday_from)
weekday_to = move_weekday_to_range(slots_ref, weekday_to)
# Check min/max periods
first_period = get_first_period(time_periods_ref, weekday_from)
last_period = get_last_period(time_periods_ref, weekday_from)
first_slot = get_first_period(slots_ref, weekday_from)
last_slot = get_last_period(slots_ref, weekday_from)
if period_from == 0:
period_from = first_period
if period_to == 0:
period_to = last_period
if slot_start == 0:
slot_start = first_slot
if slot_end == 0:
slot_end = last_slot
time_period_from = time_periods_ref[weekday_from][period_from]
time_period_to = time_periods_ref[weekday_to][period_to]
slot_start = slots_ref[weekday_from][slot_start]
slot_end = slots_ref[weekday_to][slot_end]
groups = []
teachers = []
......@@ -74,7 +85,7 @@ def import_events(
# Get groups, teachers and rooms
raw_events = connect_untis_fields(event, "eventelement", 10)
for raw_event in raw_events:
el = raw_event.split("~")
el = untis_split_second(raw_event, remove_empty=False)
# Group
if el[0] != "0" and el[0] != "":
......@@ -91,39 +102,31 @@ def import_events(
room = rooms_ref[int(el[3])]
rooms.append(room)
new_event, created = chronos_models.Event.objects.get_or_create(
import_ref_untis=import_ref,
datetime_start = slot_start.get_datetime_start(datetime_start)
datetime_end = slot_end.get_datetime_end(datetime_end)
new_event, created = LessonEvent.objects.filter(
datetime_start__date__lte=validity_range.date_end,
datetime_end__date__gte=validity_range.date_start,
).update_or_create(
extended_data__event_untis=import_ref,
defaults={
"date_start": date_from,
"date_end": date_to,
"period_from": time_period_from,
"period_to": time_period_to,
"datetime_start": datetime_start,
"datetime_end": datetime_end,
"title": comment,
"school_term": validity_range.school_term,
"slot_number_start": slot_start.period,
"slot_number_end": slot_end.period,
"cancelled": False,
"current_change": True,
},
)
new_event.extended_data["event_untis"] = import_ref
new_event.save()
if created:
logger.info(" New event created")
# Sync simple fields
if (
new_event.date_start != date_from
or new_event.date_end != date_to
or new_event.period_from != time_period_from
or new_event.period_to != time_period_to
or new_event.title != comment
or new_event.school_term != validity_range.school_term
):
new_event.date_start = date_from
new_event.date_end = date_to
new_event.period_from = time_period_from
new_event.period_to = time_period_to
new_event.title = comment
new_event.school_term = validity_range.school_term
new_event.save()
logger.info(" Time range and title updated")
# Sync m2m-fields
new_event.groups.set(groups)
new_event.teachers.set(teachers)
......@@ -132,10 +135,14 @@ def import_events(
existing_events.append(import_ref)
ref[import_ref] = new_event
# Delete all no longer existing events
for e in chronos_models.Event.objects.filter(
date_start__lte=validity_range.date_start, date_end__gte=validity_range.date_end,
):
if e.import_ref_untis and e.import_ref_untis not in existing_events:
logger.info("Event {} deleted".format(e.id))
# Delete all no longer existing events
for e in LessonEvent.objects.filter(
extended_data__event_untis__isnull=False,
datetime_start__date__lte=validity_range.date_end,
datetime_end__date__gte=validity_range.date_start,
).not_instance_of(SupervisionEvent):
if e.extended_data["event_untis"] not in existing_events:
logger.info(f"Event {e.id} deleted")
with create_revision():
set_comment(_("Deleted by Untis import"))
e.delete()
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from rules.contrib.views import permission_required
from .forms import UntisUploadForm
from .util.xml.xml import untis_import_xml
@permission_required("untis.do_xml_import")
def xml_import(request: HttpRequest) -> HttpResponse:
context = {}
upload_form = UntisUploadForm()
if request.method == "POST":
upload_form = UntisUploadForm(request.POST, request.FILES)
if upload_form.is_valid():
untis_import_xml(request, request.FILES["untis_xml"])
context["upload_form"] = upload_form
return render(request, "untis/xml_import.html", context)
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.