Changelog
3.1.0 (2026-07-1X)
🚀 Neuerungen
- Einführung der
Repository[T]-Architektur für Listen-Attribute wieklassen,lehrerundräumein Modellen, um Redundanzen beim Mergen automatisch zu vermeiden und eine saubere Mutierbarkeit bei gleichzeitiger Sortierung zu gewährleisten - Implementierung von dynamischen Views (
SelectionProxy,GroupedSelectionProxy) für abgeleitete Modelleigenschaften, die sich automatisch mit demVertretungsplansynchronisieren - Feld
parserzuVertretungsplanZuganghinzugefügt.VertretungsplanZugang.get()übernimmt dessen Wert standardmäßig für den Parameterparser
🔧 Änderungen
- Die Export-Methodik via
saveasfile(insbesondere bei YAML-Dateien) übernimmt nun durchgehend die natürliche Sortierung von Kürzeln, um die Navigierbarkeit zu verbessern - Feld
Klausur.lehrerhat nun den TypRepository[str]stattstr | None
3.0.2 (2026-07-02)
🔧 Änderungen
~.stundenvonKlasse,LehrerundRaumwerden nun korrekt nach Unterrichtsperiode sortiert- Paket
pdfplumberist nun keine strenge Voraussetzung mehr, um Geräte ohne C++-Distribution nicht einzuschränken. Es kann durch Angabe des Installationsparameterspdfswie inpip install vpmobil[pdfs]mitinstalliert werden - Formatierungssicherheit der Darstellungen von
Vertretungsplan-,Stunde-,Kurs-,Aufsicht- undKlausur-Objekten verbessert Stunde,Kurs,Aufsicht,Klausurspeichernklassen,lehrer,räumeundkursenun alstuple[str, ...]anstatt alsset[str], um die Sortierung der Kürzel beizubehalten- Kürzel von Klassen, Lehrern und Räumen in Stunden, Kursen, Aufsichten, Klausuren,
freieRäumeundabwesendeLehrerwerden nun natürlich sortiert (z.B. "5a" vor "10a")
🪲 Fehlerbehebungen
- Parameter
parservonVertretungsplan.fromfile()erhält als StandardwertParser, nicht aberParser() - Die Erweiterungsmodule
exensions.~fehlen - Behebung eines Fehlers (
TypeError: mappingproxy() argument must be a mapping, not list), der auftrat, wenn die generierten Eigenschaften~.stundenvonKlasse,LehrerundRaumaufgerufen wurden - Behebung einer Endlosschleife bzw. falscher Zuordnung beim Auswerten von Klausuren für die Eigenschaft
Vertretungsplan.klassen - Behebung der verschachtelten Methodendefinition von
VpMobilPyModell.__copy__, die immerNonezurückgab
3.0.1 (2026-05-05)
🔧 Änderungen
- Parsing von
~.datuminVertretungsplan.from_xml()weniger anfällig für Lokalitätsprobleme gemacht
3.0.0 (2026-05-05)
Warning
Diese Version enthält viele weitere Änderungen, die hier nicht alle aufgelistet werden können. Es wird empfohlen, sich Zeit zu nehmen, alte Programme mit der neuen Version durchzutesten und da Anpassungen vorzunehmen, wo sie benötigt werden. Die Docstrings der geänderten Funktionen sind ziemlich umfangreichlich und sollten bei der Umstellung helfen.
🚀 Neuerungen
Question
Einige Namen haben sich geändert. Es ist zu empfehlen, zuvor den Abschnitt Umbenennungen zu lesen.
- Klarwert-Konstruktoren für
Vertretungsplan,Stunde,Klausur,Aufsicht,Klasse,LehrerundRaumhinzugefügt - Kompatibilität für
copyunddeepcopyaus demcopy-Modul fürVertretungsplan,Stunde,Klausur,Aufsicht,Klasse,LehrerundRaumhinzugefügt - Methode
~.copyfürVertretungsplan,Stunde,Klausur,Aufsicht,Klasse,LehrerundRaumhinzugefügt - Methode
~.to_xml()fürVertretungsplan,Stunde,Klausur,Aufsicht,Klasse,LehrerundRaumhinzugefügt - Methode
VertretungsplanZugang.getall()hinzugefügt - Eigenschaft
Vertretungsplan.zeitplanhinzugefügt - Methode
Vertretungsplan.saveasfile()hinzugefügt - Feld
Stunde.fachmetahinzugefügt, das die Information aus demKu2-Tag der Quelldaten abbildet - Modul
extensions.parser_presets(und Alias~.pp) hinzugefügt - Klasse
Parserhinzugefügt, die nun anstatt des ModulconfigParameter für das Parsing enthält
🏷️ Namensänderungen
VertretungsplaninVertretungsplanZugangumbenanntVertretungsplanZugang.serverdomainin~.domainumbenanntVertretungsplanZugang.fetch()in~.get()umbenanntStundenplan24PfadeinStandardpfadeumbenanntVertretungsplan.saveasfile()in~.save_xmlumbenanntVertretungsplan.dateiin~.dateinameumbenanntVertretungsplan.lehrerKrankinabwesendeLehrerumbenanntKlassenVertretungsTag,LehrerVertretungsTagundRaumVertretungsTagfinden sich alsVertretungsplan-Klasse wieder (siehe Änderungen)
🗑️ Entfernungen
extensions.config_presetsentfernt (durchparser_presetsersetzt)~.stundenInPeriode()vonKlasse,LehrerundRaumentfernt
🔧 Änderungen
Vertretungsplan,Stunde,Klausur,Aufsicht,Klasse,LehrerundRaumspeichern Daten nicht mehr als XML-Element, sondern in Klarwerten, beziehungsweise Instanzen der jeweils anderen Klassen- Ihre Konstruktoren nehmen kein
Elementmehr entgegen. Instantiierung ausElement-Objekten kann mit~.from_xml()vorgenommen werden
- Ihre Konstruktoren nehmen kein
- Vertretungspläne jeder Art werden nur noch durch die
Vertretungsplan-Klasse abgebildet Klasse,RaumundLehrersind nur noch Proxies, die bis auf das Kürzel nur immutable Objekte mit Referenzen auf Objekte in den Feldern vonVertretungsplanenthaltenVertretungsplan.abwesendeLehrergibt nicht nur die Kürzel aller Lehrer zurück, die unplanmäßig keinen Unterricht haben, sondern die aller Lehrer, die keine Stunden habenStunde.lehrergeändert,~.raumgeändertund.~klassegeändertkönnen beim entsprechenden Plantypen nun nicht mehrNonesein. Stattdessen wird~.geändertweitergegeben- Das Typing der Felder von
Klasse,RaumundLehrerenthält nun oftMapping, stehend für eineMappingProxyType-Instanz undCollection, stehend für eine Tupel - Alle Docstrings wurden überarbeitet
- Das Modul
extensions.einzpläneund seine Funktionen verwenden nun die Bibliothekpdfplumberan Stelle vonPyPDF2
2.1.0.1 (2026-03-27)
🪲 Bug Fixes
- Auf manchen Maschinen wird ein Fehler geworfen, weil
Stunde.__repr__eine Quote-Kollision hat
2.1.0 (2026-03-27)
🚀 Neue Funktionen
- Funktion
VertretungsTag.freieRäume()zum Finden in einem bestimmten Zeitraum freier Räume
🔧 Änderungen
IndiwareFetchingErrorwurde inVpMobilPyErrorumbenanntconfig.set_configkann nun auch Keyword-Argumente entgegennehmen- Typing für Funktionen in der
reparser-Extension wurde verallgemeinert
🪲 Bug Fixes
- Regex-Muster in Presets werden fälschlicherweise kompilliert
- Das Dekodieren von Zeitstrings funktioniert auf manchen Geräten nicht
- Syntax im Tip von
Stunde.fachkorrigiert - Typ-Annotation von
Klasse.kursekorrigiert - Auf manchen Maschinen wird ein Fehler geworfen, weil
VertretungsTag.__new__eine Quote-Kollision hat
2.0.0 (2025-11-10)
🚀 Neue Funktionen
- Vollumfänglicher Support für Lehrer- und Raumpläne hinzugefügt, Support für Klassenpläne vervollständigt
- Parameter
portzuVertretungsplanhinzugefügt - Enumerator
Stundenplan24Pfadehinzugefügt, der die Standardpfade auf stundenplan24.de enthält - Submodul
confighinzugefügt, das Parameter für das Parsing enthält - Datenmodelle können mit
.as_dict()in ein sauberes JSON-kompatibles Dictionary umgewandelt werden - Konversionsfunktionen zwischen
VertretungsTag-Datenmodellen inextensions.reparserhinzugefügt
Lehrer- & Raumpläne
Im Rahmen der Einführung neuer Vertretungsplantypen wurden einige Datenmodelle in Basis- und Unterklassen aufgeteilt. Die drei Vertretungsplanklassen KlassenVertretungsTag, LehrerVertretungsTag und RaumVertretungsTag erben von einer neuen Basisklasse, die grundlegendes Verhalten für Pläne enthält. Die einzelnen Planklassen bringen dann noch weitere Funktionen mit.
Neue Klassen sind:
VertretungsTag- Basisklasse für Vertretungspläne
- Erzeugt beim Instanzierungsversuch eine Instanz einer ihrer Subklassen
- Kann mit
isinstance()als Protokoll für alle Vertretungspläne genutzt werden
LehrerVertretungsTag- Subklasse von
VertretungsTag - Hat
.lehrerund.get_lehrer()
- Subklasse von
RaumVertretungsTag- Subklasse von
VertretungsTag - Hat
.räumeund.raum()
- Subklasse von
Lehrer- Das Lehrerplan-Äquivalent zu
Klasse - Wird von
LehrerVertretungsTag.lehrererzeugt
- Das Lehrerplan-Äquivalent zu
Raum- Das Raumplan-Äquivalent zu
Klasse - Wird von
RaumVertretungsTag.räumeerzeugt
- Das Raumplan-Äquivalent zu
Aufsicht- Ein primitives Datenmodell, ähnlich zu
Stunde, das Informationen über eine Lehreraufsicht enthält - Hat
.vorStunde,.uhrzeit,.zeitund.ort - Wird von
Lehrer.aufsichtenerzeugt
- Ein primitives Datenmodell, ähnlich zu
Klausur- Ein primitives Datenmodell, ähnlich zu
Aufsicht, das Informationen über eine Klausur enthält - Wird von
Klasse.klausurenerzeugt
- Ein primitives Datenmodell, ähnlich zu
🔧 Änderungen
Vertretungsplanund.fetch()wurden angepasst, um die neuen Vertretungsplanarten verarbeiten zu könnenVertretungsplan.bulkfetch()wurde entferntInvalidCredentialsErrorwurde inUnauthorizedumbenanntVertretungsTag.freieTagegibt stattNonenun[]zurückVertretungsTag.datumparst jetzt nicht mehr den Dateinamen sondern den XML-TagDatumPlanVertretungsTag.klassen,.lehrerund.räumegeben nun ein Dictionary zurück. Die Schlüssel sind die jeweiligen Kürzel, die Werte sind die jeweiligen KlasseninstanzenVertretungsTag.klasse(),.get_lehrer()und.raum()wurden entferntKlasse.stundenHeutewurde in.stundenund.stundenHeuteInPeriodein.stundenInPeriodeumbenanntKlasse.stundenInPeriode()gibt nun[]stattNonezurückKlasse.kursegibt nun ein Dictionary zurück. Die Schlüssel sind die jeweiligen Kürzel, die Werte sind die jeweiligen KursinstanzenStunde.raumwurde durchStunde.räumeersetzt, das nun eine Liste von Strings zurückgibt. StattNonewird[]zurückgegebenStunde.lehrergibt nun eine Liste von Strings zurück. StattNonewird[]zurückgegebenStunde.ausfallist nun auchTrue, wenn die Stundeninfo"selbst"enthält und Lehrer und Räume nicht vorhanden sindKurs.gruppewurde in.kürzelumbenannt. Es gibt jetzt als Fallback.fachzurück- Alle Properties, die Klassen, Lehrer oder Räume zurückgeben, verwenden nun das Trennzeichen, das in
config.SEPARATORfestgelegt werden kann, um Mehrfachnennungen zu trennen - Alle Properties wurden
None-sicher gemacht, sodass sie nun keine Fehler mehr werfen können, sollte ein Tag in der Quelldatei unerwarteter Weise nicht vorhanden sein - Aufzählungen von Klassen können nun auch Bereiche (z.B.
"5a-7c") enthalten und werden aufgelöst. Das Format einer Klassenbezeichnung kann inconfigdurch ein Pattern konfiguriert werden. Die Capturing Groupsstufeundsuffixmüssen enthalten sein
Vertretungsplan und .fetch()
Vertretungsplan ist nun so konzipiert, dass es ein Standardpfadschema für Dateiabrufe gibt. Andere Dateien können in .fetch() dennoch weiterhin abgerufen werden.
- Parameter
vezeichnisunddateinamenschemavon.fetch()wurden indateipfadschemazusammengeführt - Wenn
.fetch()mit dem Parameterdateiangegeben wird, ersetzt das den Standarddateipfad.dateikann, wieVertretungsplan.dateipfadschemamit Platzhaltern des datetime-Moduls und dem Platzhalterschulnummerverwendet werden
🪲 Bug Fixes
VertretungsTag.lehrerKrankwirft einen Fehler, wenn es einen Kurs gibt, der keinen Lehrer hat
1.1.0 (2025-08-27)
🚀 Neue Funktionen
- Weitere Funktionalität zum verarbeiten von von Indiware-Software bereitgestellter Daten ist nun im Submodul
extensionsverfügbar - Kurse und deren Schüler einer Klasse können nun mit
vpmobil.extensions.einzpläne.kurse()aus EinzPläne-PDF-Dateien gelesen werden - Tutoren und deren Schüler einer Klasse können nun mit
vpmobil.extensions.einzpläne.tutoren()aus EinzPläne-PDF-Dateien gelesen werden
🔧 Änderungen
VpDaywurde inVertretungsTagumbenanntvpmobil.parsefromfile()wurde nachvpmobil.VertretungsTag.fromfile()verschoben und kann nun nicht mehr direkt importiert werden- Das Projekt ist nun unter European Union Public License 1.2 lizensiert
- Ein paar Docstrings wurden konkretisiert oder weisen nun auf mögliche Inkonsistenzen hin
Vertretungsplan.fetchall()wurde inVertretungsplan.bulkfetch()umbenannt
🪲 Bug Fixes
Vertretungsplan.fetchall()raised nichtResourceNotFoundsondernIndiwareFetchingError, wenn keine Pläne gefunden wurden
1.0.1 (2025-08-03)
🪲 Bug Fixes
from vpmobil import *importiert nichts
1.0.0 (2025-08-03)
🚀 Neue Funktionen
- Ein bestimmter Kurs kann per Kursnummer mit
Klasse.kurs()erhalten werden
🔧 Änderungen
- Neustrukturierung der gesammten Kernfunktionalität durch die Verwendung modernerer Syntax
- Die Werkzeugklasse
workflowwurde aufgelöst. Alle Klassen, Funktionen und Exceptions können einfach ausvpmobilimportiert werden - Die meisten Funktionen und Eigenschaften gegeben nun
Nonezurück statt einen Fehler zu werfen, wenn in den XML-Daten nichts gefunden wird - Einige unhandliche und unnötige Methoden von
Klassewurden entfernt - Ein paar Exceptions wurden umbenannt, entfernt oder durch built-ins ersetzt
- Einige Module wurden zusammengeführt und umbenannt
🪲 Bug Fixes
- In der Nachricht des
FetchingErrors, der beiVertretungsplan.fetch()geworfen wird, wird die Datei, die nicht abgerufen werden konnte, nicht richtig benannt
⚠️ Bekannte Probleme
VpDay.lehrerKrankbehandelt mehrere in einem Kurs oder einer Stunde angeführte Lehrer nicht mehr separat
0.4.2 (2024-12-28)
🔧 Änderungen
- Werkzeugsammlungsklasse von
vpmobil.VpMobilinvpmobil.workflowumbenannt