fsi.ims_import

Dateien:

  • Kurse: Die Liste der Kurse

  • Personen -> importiert aus ldap

  • Teilnehmer: repräsentiert die Anmeldungen mit referenz zu Personen und Durchführungen

  • Ausführungen: die Listen der Durchführungen.

Verlinkungen

  • Teilnehmer.TEILNEHMER_ID is ForeignKey für Personen.OBJ_ID

Im folgenden eine Beschreibung der Beobachtungen zu den Files

Personen.txt:

(Daten sind sortiert nach Nachname/Vorname)

  • Es gibt Email-Adressen wie user@sg.ch.local, und dann in den Anmeldungen ohne .local.

  • Was bedeutet das Feld P_VALID_TILL? Relevant?

  • es gibt viele Einträge ohne email und/oder Kürzel (P_USERID), z.B. Zeilen

  • es gibt viele fehlende Vornamen/Nachnamen (evtl auffindbar in Teilnehmer.txt)

  • Neu erstellte Einträge mit gleicher Email und sonst gleichen Informationen: Beispiel Zeilen 2215/2216. Wie vorgehen, wenn es alte Anmeldungen zu Kursen gibt, die auf den alten Eintrag zeigen?

Fragen:

  • Sind in Personen.txt auch externe Benutzer erfasst?

  • Kann ich externe Benutzer über den Eintrag P_VERWALTUNG identifizieren? Hier gibt es

    • [spezielle/ungültige/fehlerhafte]

    • Dritte

    • Gemeinde

    • Kantonale Verwaltung Zug

    • Staatskanzlei

    Welche von denen sind in unserem LDAP? Das sollte ich in etwa wissen.

  • Was ist zu tun mit ‘alten’ Benutzern? Und wie definieren wir alte Benutzer?

  • Ist ein alter Benutzer, der sich nicht mehr einloggen kann?

  • Inwieweit sollen ‘alte’ Benutzer noch in die Datenbank rein?

  • Sollen damit Anmeldungen von ‘alten’ Benutzern nicht importiert werden?

Ausführungen.txt:

  • Wir haben Start und/oder Ende einer Durchführung fehlend, bei verschiedenen manchmal mit BUCHUNGSTATUS = Keine Buchung, kann aber auch Erfasst oder Abgesagt sein, ein Datum muss in der neuen Datenbank eingetragen werden.

  • Fehlende Namen der Kursleitung: Entweder ‘Unbekannter Referent’ als default oder Datenbank abändern (in Formularen weiterhin Pflichtfeld).

Teilnehmer.txt

  • Field ANWESEND oft leer, soll Ja oder Nein gewählt werden?

  • Einträge ohne TEILNEHMER_ID (Link zu Personen.txt) sind externe Benutzer z.B.

FAZIT

Vorgeschlagenes Vorgehen:

Die “single source of truth” bildet das bereits umegesetzte Verzeichnis der gültigen Benutzer aus dem LDAP kombiniert mit den weiteren Verzeichnissen. Es sollen nur Anmeldungen von mittels LDAP identifizierbaren Personen importiert werden.

Es werden nicht importiert:

  • Personen, ohne Kürzel und Email sowie deren alte Anmeldungen

  • Durchführungen mit BUCHUNGS_STATUS = Keine Buchung and Start/Ende fehlend werden auch nicht mehr importiert.

  • Durchführungen ohne Start UND Ende unabhängig von Status

Vervollständigungen

  • .local in Email-Adressen wird herausgenommen

  • Fehlender Wert für ANWESEND bei alten Anmeldungen wird mit JA gefüllt.

  • Referent Kurs: Standard-Wert einfügen “Unbekannter Referent” sofern fehlend

Gemäss dem code (src/onegov/fsi/ims_import.py:368) gibt es keine Benutzer in Personen.txt die weder email noch code haben und von den Teilnehmer.txt her aus vervollständigt werden müssten.

Anmeldungen in Teilnehmer.txt die keine Referenz zu Personen.txt haben, wurden berücksichtigt, sofern eine Email vorlag.

Attributes

T

Ts

Exceptions

InconsistencyError

Common base class for all exceptions

Functions

parse_email(→ str | None)

parse_date(→ datetime | DefaultT)

parse_status(...)

validate_integer(→ int)

with_open(→ Callable[[str, *Ts], T])

import_teacher_data(→ None)

parse_completed(→ bool)

parse_persons(→ dict[str, PersonDict])

Pure extracting information

parse_courses(→ tuple[dict[int, str], dict[str, ...)

parse_events(→ tuple[dict[int, str], dict[str, ...)

parse_subscriptions(→ tuple[dict[int, str], dict[str, ...)

map_persons_to_known_ldap_user(→ CourseAttendee | None)

Since the exported persons table contains records without email

parse_ims_data(→ tuple[dict[str, dict[int, str]], ...)

import_ims_data(→ dict[str, int])

Module Contents

fsi.ims_import.T[source]
fsi.ims_import.Ts[source]
exception fsi.ims_import.InconsistencyError(msg: str, file: str, rownumber: int | None = None)[source]

Bases: BaseException

Common base class for all exceptions

msg[source]
file[source]
rownumber = None[source]
__str__() str[source]

Return str(self).

fsi.ims_import.parse_email(email: str) str | None[source]
fsi.ims_import.parse_date(val: str | None, default: DefaultT = None) datetime | DefaultT[source]
fsi.ims_import.parse_status(val: str) onegov.fsi.models.course_event.EventStatusType[source]
fsi.ims_import.validate_integer(val: str | None, treat_none_as_default: bool = True, default: int = 0) int[source]
fsi.ims_import.with_open(func: Callable[[CSVFile[DefaultRow], *Ts], T]) Callable[[str, *Ts], T][source]
fsi.ims_import.import_teacher_data(csvfile: onegov.core.csv.CSVFile[onegov.core.csv.DefaultRow], request: onegov.fsi.request.FsiRequest, clean: bool = False) None[source]
fsi.ims_import.parse_completed(val: str | None) bool[source]
fsi.ims_import.parse_persons(csvfile: onegov.core.csv.CSVFile[onegov.core.csv.DefaultRow]) dict[str, PersonDict][source]

Pure extracting information

fsi.ims_import.parse_courses(csvfile: onegov.core.csv.CSVFile[onegov.core.csv.DefaultRow]) tuple[dict[int, str], dict[str, onegov.fsi.models.Course]][source]
fsi.ims_import.parse_events(csvfile: onegov.core.csv.CSVFile[onegov.core.csv.DefaultRow], courses: dict[str, onegov.fsi.models.Course]) tuple[dict[int, str], dict[str, onegov.fsi.models.CourseEvent]][source]
fsi.ims_import.parse_subscriptions(csvfile: onegov.core.csv.CSVFile[onegov.core.csv.DefaultRow], persons: dict[str, PersonDict], events: dict[str, onegov.fsi.models.CourseEvent]) tuple[dict[int, str], dict[str, PersonDict], dict[str, UserDict]][source]
Parameters:
  • csvfile

  • persons – dict of dicts of person records

  • events – dict of CourseEvent classes

Returns:

subscriptions within persons and within maybe_external_in_ldap

fsi.ims_import.map_persons_to_known_ldap_user(person_record: PersonDict | UserDict, session: sqlalchemy.orm.Session) CourseAttendee | None[source]

Since the exported persons table contains records without email from various sources, we have to try to map it to an existing record or create a new one.

The ldap fetched users have an attendee created with first_name, last_name and email set on the attendee as well.

Returns an attendee or None

fsi.ims_import.parse_ims_data(subscriptions_file: str, events_file: str, courses_file: str, persons_file: str) tuple[dict[str, dict[int, str]], dict[str, PersonDict] | None, dict[str, onegov.fsi.models.Course] | None, dict[str, onegov.fsi.models.CourseEvent] | None, dict[str, UserDict] | None][source]
fsi.ims_import.import_ims_data(session: sqlalchemy.orm.Session, persons: dict[str, PersonDict], courses: dict[str, onegov.fsi.models.Course], events: dict[str, onegov.fsi.models.CourseEvent], possible_ldap_users: dict[str, UserDict]) dict[str, int][source]