Gerne wollen wir euch informieren, dass wir die Version 1.0.0rc1 für eure Tests freigegeben haben. Wir würden uns sehr über Rückmeldungen wie Bug-Reports, Änderungswünsche und natürlich hauch Feature-Requests von euch freuen.
Installation
Um die neue Version zu verwenden, müsst ihr explizit die Pre-Release-Version anfordern:
## uv
# In ein Projekt aufnehmen (exakte Version)
uv add "ecmind_blue_client==1.0.0rc1"
# Pre-Releases generell erlauben und neuesten RC ziehen
uv add --prerelease=allow ecmind_blue_client
Kompatibilität
Die Version 1.0.0rc1 sollte vollständig mit der aktuellen 0.9.2 kompatibel sein. Wir empfehlen aber, schrittweise vom bisherigen TCPClient bzw. TCPPoolClient auf die neue ECM-Abstraktion zu wechseln.
Die Mindestanforderung an Python ist von 3.11 auf 3.12 angehoben worden.
Mit der Version 1.0.0 (aktuell Release Candidate 1.0.0rc1) erhält der ecmind_blue_client eine grundlegend erweiterte, moderne API. Die bisherige Low-Level-Schnittstelle bleibt erhalten - neu hinzugekommen ist eine vollständige, typsichere Abstraktionsschicht.
Zentrale Neuerungen
Neue High-Level-API ecm.* - eine moderne, typsichere Abstraktion über das enaio®-Protokoll, gegliedert in fachliche Namespaces: ecm.dms, ecm.system, ecm.security, ecm.db und ecm.workflow.
Synchron und asynchron - sämtliche Operationen stehen wahlweise als synchrone oder asynchrone Variante zur Verfügung (SyncPoolClient / AsyncPoolClient), inklusive Verbindungs-Pooling mit Statistiken.
Typisiertes Modell-System (ORM-ähnlich) - Ordner, Register und Dokumente lassen sich als typisierte Modellklassen anlegen, lesen, aktualisieren und löschen (insert / update / upsert), inkl. Pflichtfeld-Prüfung, Tabellenfeldern, schreibgeschützten Feldern und Dokumentvarianten.
DMS-Abfragen - komfortabler Query-Builder und -Parser für DMS-Suchen, kombinierte Abfragen, LOL-/HOL-Unterstützung sowie Volltextsuche direkt am typisierten Modell.
Workflow-Funktionen - Organisationen, Vertretungen und Abwesenheiten verwalten, Vorgangslisten je Benutzer abrufen sowie Workflows per API starten (start_process) inkl. typisierter Workflow-Variablen-Modelle.
Weitere Operationen - Dokument-Historie, Check-out/Check-in, Berechtigungsprüfung, Lizenz- und Modulinformationen, Benutzer-/Gruppen-/Rollenverwaltung, Export des Sicherheitssystems und freie SQL-Ausführung.
Code-Generatoren - ecm-generate-models erzeugt typisierte Modellklassen aus der enaio®-Objektdefinition; ecm-generate-workflow-models erzeugt typisierte Workflow-Variablen-Modelle.
Wir haben gerade die Version 1.0.0rc2 hinzugefügt.
Änderungen
Explizite Funktion replace_table_fields() für die Methoden ecm.dms.update und ecm.dms.upsert um die Option REPLACE_TABLE_FIELDS explizit setzen zu können.
in der Methode ecm.dms.upsert Tag Reihenfolge im XML der Tags <Fields> und <Search> explizit festgelegt, da Search niemals nach Fields kommen darf.
Unterstützung von PageControls ohne interne Namen. In diesem Fall werden nun die page_ids (GUID des PageControls) verwendet.
Installation
Um die neue Version zu verwenden, müsst ihr explizit die Pre-Release-Version anfordern:
Wir haben gerade die Version 1.0.0rc3 hinzugefügt.
Änderungen
ecm.dms.search unterstützt nun auch die Suche anhand der Tabellen Felder. Optional mit Zeilenbezug.
Enum Felder sind jetzt in Where Clauses angenehmer zu verwenden. Bisher musste jeweils MeinFeld == MeinEnum.Wert1.value geschrieben werden. Nun ist auch einfach MeinFeld == MeinEnum.Wert1 möglich.
Einige Bugfixes in der Generierung von Workflow Modellen sind nun behoben
Zwei neue Release Candidates der 1.0.0-Reihe (für RC4 gab es hier noch keinen Eintrag). Die öffentliche API bleibt gegenüber 1.0.0rc3 unverändert, abgesehen von den neuen Funktionen unten.
Änderungen
1.0.0rc4
Neu: Model.system.<Feld> auf Klassenebene als abfragbares Feld, z. B. select(Doc).where(Folder.system.id == folder.system.id).
Neu: Gruppenverwaltung auf ecm.security: create_group(), update_group(), delete_group(), empty_group().
Fix: Lizenz-Jobs (check_license(), module_info()) funktionieren wieder auf enaio 12+; ein unbekanntes Modul liefert sauber ECMNotFoundException.
Fix (#15434): Felder lassen sich per update() wieder leeren. Ein auf None gesetztes Feld wird jetzt als field_function="NULL" an den Server gesendet.
Fix (#15431): ecm.db.select() brach bei führendem Zeilenumbruch im SQL mit IndexError ab; das Statement wird nun links getrimmt.
1.0.0rc5
Fix: ecm-generate-models ließ datentragende Felder mit GROUP-Control aus (z. B. PostDoc: hash, group, user). Diese werden jetzt als ECMField erzeugt; rein visuelle Gruppen bleiben ausgeschlossen. Modelldateien bitte neu generieren.
Installation
pip:
# A) genaue Version
pip install -U ecmind_blue_client==1.0.0rc5
# B) neueste Version inkl. Pre-Releases
pip install -U --pre ecmind_blue_client
uv:
# A) genaue Version
uv add ecmind_blue_client==1.0.0rc5
# B) Pre-Releases erlauben
uv add --prerelease=allow ecmind_blue_client
Hallo zusammen, hier die nachträglichen Infos zu den vier neuen Release Candidates der 1.0.0-Reihe. 1.0.0rc9 ist soeben veröffentlicht und wird gerade auf PyPI bereitgestellt. Die öffentliche API bleibt gegenüber 1.0.0rc5 unverändert, abgesehen von den neuen Funktionen unten.
Änderungen
1.0.0rc6
Neu (#14491): Dokumente lassen sich nach OBJECT_SEARCHFLAGS-Status abfragen. Dokumentmodelle bieten dafür boolesche Flag-Properties im system-Namespace (Model.system.in_register, .signed_current, .without_pages, .archivable, …), direkt nutzbar in where(), z. B. ecm.dms.select(Document).where(Document.system.in_register == True).execute(). Mehrere Flag-Bedingungen werden zu einer korrekten FieldCondition mit system="1" zusammengefasst.
Neu (#14491): Archiv- und Sperrstatus auf geladenen Dokumentinstanzen. OBJECT_FLAGS und OBJECT_LOCKUSER gehören jetzt zu den Standard-Systemfeldern, dadurch stehen ohne zusätzliche Abfrage-Flags dekodierte Properties bereit: obj.system.archived, .archivable, .not_archivable, .page_error, .without_pages, .reference, .external_archived, .locked sowie das rohe .flags.
Neu: ecm.system.get_icons() lädt Objekt- bzw. Typ-Icons per ID (Wrapper um cnv.GetIcons) und liefert ein dict[int, bytes] mit den GIF-Daten. Mehrere IDs werden in einem einzigen Roundtrip geholt.
Neu (#15467): ecm.check_connections() prüft jeden konfigurierten Pool-Server einzeln (TCP/TLS, Login, Serverinfo). Probe-Verbindungen landen nie im Pool; ein nicht erreichbarer Server bricht die übrigen Prüfungen nicht ab.
Neu: ecm.system.jobs() listet alle Server-Jobs gruppiert nach Namespace als dict[str, list[str]] (sync und async).
1.0.0rc7
Neu (#15486): ecm.dms.files_streaming() für gechunkten Attachment-Download ohne lokale Pufferung.
Neu (#15561): Modernes AES-Login-Passwortschema, das 62-Zeichen-Limit für Passwörter entfällt.
Neu: OsEvent-Verwaltung auf ecm.system: get_os_events(), create_os_event(), update_os_event(), delete_os_event() sowie refresh_server_events() zum Neuladen des OsEvent-Caches (#15555).
Neu: execute_and_get() auf dem Upsert-Builder.
Fix (#15561): password_encrypt() lief bei Passwörtern über 62 Zeichen in einen RecursionError.
Fix (#15486): document_stream() begrenzt Offset/Length nicht mehr auf 2 GiB.
Fix: ecm-generate-models entfernt Flat-List-Anzeigetexte aus Enum-Werten.
1.0.0rc8
Neu: ecm.notification-Namespace für typisierte Server-Push-Benachrichtigungen (job_calls, messages, listen, send_message).
Neu: Notification-Callback-Kanal im Low-Level-RPC-Layer (sync/async open_callback + callback_next, Protokoll v50 mit SHA-1-Digest).
Neu: Konsolenskript ecm-callback-listen, um den Push-Stream des Servers direkt aus der Shell mitzulesen.
Neu: connection_for(hostname, port) auf den Pool-Clients, um gezielt eine Verbindung zu einem bestimmten Server auszuleihen.
Geändert: Der Connection-Pool hält jetzt eine gemeinsame Session pro Server (Attach statt wiederholtem Login).
Geändert: create_os_event() / update_os_event() senden den Skriptcode als UTF-8 mit BOM statt cp1252.
Fix: ecm-generate-models schreibt den gespeicherten Schlüssel (statt des Anzeigetexts) in Flat-List-Katalog-Enums.
Fix: ecm-generate-models bereinigt Listeneintrag-Schlüssel zu gültigen Python-Bezeichnern. Modelldateien bitte neu generieren.
1.0.0rc9
Fix (#15650): Ergebnisfeldlisten setzen system="1" für Systemfeldnamen, die als einfache Strings übergeben werden. Damit funktionieren order_by(Model.system.id.DESC) und fields(Model.system.id) auf HOL- und LOL-Buildern (sync und async), statt mit Serverfehler -1031 abzubrechen. Das ermöglicht z. B. Keyset-Pagination über die Objekt-ID.
Fix (#15650): DmsQueryFields.field() fasst wiederholte Aufrufe für dasselbe Feld zu einem einzigen Field-Element zusammen, statt Duplikate zu erzeugen (z. B. wenn ein Feld gleichzeitig selektiert und sortiert wird).
Installation
pip:
# A) genaue Version
pip install -U ecmind_blue_client==1.0.0rc9
# B) neueste Version inkl. Pre-Releases
pip install -U --pre ecmind_blue_client
uv:
# A) genaue Version
uv add ecmind_blue_client==1.0.0rc9
# B) Pre-Releases erlauben
uv add --prerelease=allow ecmind_blue_client