# Ecmind\_blue\_client: Release Notes 1.0.2

**URL:** <https://ecm.community/t/ecmind-blue-client-release-notes-1-0-2/879>\
**Category:** Python/ecmind\_blue\_client\
**Tags:** release\
**Created:** [22. September 2026 um 11:31 UTC](https://ecm.community/t/ecmind-blue-client-release-notes-1-0-2/879 "2026-09-22T11:31:32Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![uw](https://ecm.community/user_avatar/ecm.community/uw/32/695_2.png) [@uw](https://ecm.community/u/uw)\
**Post date:** [22. September 2026 um 11:31 UTC](https://ecm.community/t/ecmind-blue-client-release-notes-1-0-2/879/1 "2026-09-22T11:31:32Z")

</div>

Wir freuen uns, die Version 1.0.2 des ecmind\_blue\_client freigeben zu dürfen.  
Diese Release Notes beinhalten auch die Änderungen der Version 1.0.1.

## ecmind\_blue\_client 1.0.2

### Neu

- `update_os_event(is_js=...)` wechselt die Skriptsprache eines bestehenden Events in beide  
Richtungen. Die Dokumentation hat bisher angegeben, die Sprache sei nach dem Anlegen  
unveränderlich (#16163, 1.0.2).
- `calculate_digest()` und `objects_by_digest()` auf beiden DMS-Namespaces. Ersteres bildet  
den enaio-Dokument-Digest lokal aus den Dateien, letzteres fragt über  
`dms.GetObjectsByDigest`, welche archivierten Dokumente ihn tragen (#16111, 1.0.2a2).
- `with_table_fields()` auf allen vier Query-Buildern fordert die Tabellenfelder des Modells  
mit der Trefferliste an, statt einen Job pro Objekt zu brauchen (#15926, 1.0.2a1).

### Geändert

- Subscript-Zugriff auf Modelle verhält sich wie Attributzugriff, ein unbekannter Name wirft  
`KeyError` (#15929, 1.0.2a1).
- `in_()` und `not_in()` nehmen die Werte als ein Iterable entgegen (#15930, 1.0.2a1).
- Alle ID-Parameter von `ecm.dms` akzeptieren einen numerischen String (#15931, 1.0.2a1).
- LOL-Tabellenzeilen sind typisiert und tragen ihre `row_id` (#15926, 1.0.2a1).

### Entfernt

- `impersonate(user_id=...)`. Der Kontextwechsel über die numerische ID wurde von enaio 12.0  
nie ausgewertet. Der Parameter kommt am Server an, der Job läuft aber ohne Fehler weiter  
unter dem angemeldeten Benutzer, mit dessen Rechten und dessen GUID als Eigentümer neu  
angelegter Objekte. Die Varianten über Name und GUID sind nicht betroffen. Aufrufe mit  
`user_id` werfen jetzt `TypeError` (#16165, 1.0.2).

### Behoben

- Angelegte Serverskript-Events wurden immer als VBScript gespeichert, weil die Bibliothek  
den Parameter `IsJS` von `dms.CreateOsEvent` nicht gesendet hat. Bei Event-Typen, die  
immer JavaScript sind, also Webclient-Events und den Libraries 10005 und 10006, erschien  
das Event in der Administration, kam aus `get_os_events()` zurück und löste nie aus. Neu  
ist der Parameter `is_js` auf `create_os_event()` (#16163, 1.0.2).
- Konten, die enaio nach zu vielen Fehlanmeldungen gesperrt hat, wurden als nicht gesperrt  
gemeldet. Das Serverattribut `locked` ist dreiwertig: 0 nicht gesperrt, 1 administrativ  
gesperrt, 2 nach Fehlanmeldungen gesperrt; geprüft wurde auf Gleichheit mit 1. `locked`  
ist jetzt bei 1 und 2 wahr, das neue `locked_cause` mit dem Enum `ECMUserLockCause` nennt  
die Ursache. `update_user()` schreibt eine vorhandene Ursache unverändert zurück, statt  
sie zu überschreiben (#16166, 1.0.2).
- `refresh_server_events()` schlug bei jedem Aufruf fehl, weil `adm.ServerEventsRefresh`  
einen Parameter `Flags` verlangt, den die Bibliothek nicht gesendet hat. Der Server  
antwortete mit `-1043332470`. Betroffen war der Aufruf, der andere Event-Änderungen ohne  
Serverneustart wirksam macht (#16164, 1.0.2).
- TLS-Verbindungen scheiterten unter Python 3.12 mit `CERTIFICATE_VERIFY_FAILED`, ab 3.13  
nicht. Ursache war ein Stdlib-Default, den es erst ab 3.13 gibt. Der CI-Unittest-Job läuft  
jetzt auf 3.12 (#16117, 1.0.2a2).
- `file_cache_byte_limit` erreicht die RPC-Schicht aus beiden Pool-Clients (#16019, 1.0.2a1).
- Tabellenfelder mit abweichendem `internal_name` behalten ihre Zeilen (#16024, 1.0.2a1).
- `stream_hol_objects` bindet nur an `<Archive>`-Elemente der obersten Ebene  
(#16025, 1.0.2a1).
- Der Workflow-Modellparser liest Variablen nur von der Prozessebene (#16026, 1.0.2a1).
- Direkt konstruierte Tabellenzeilen teilen sich kein gemeinsames Dict mehr  
(#15927, 1.0.2a1).
- Per Annotation deklarierte Modellfelder funktionieren unter Python 3.14 wieder  
(#16014, 1.0.2a1).
- `<Params>` wird vor `<Archive>` geschrieben, parametrisierte Bedingungen greifen wieder  
(#16010, 1.0.2a1).
- Die mitgelieferten XSDs beschreiben, was der Server tatsächlich sendet (#16011, 1.0.2a1).
- Der Async-Pool erkennt einen Verbindungsverlust sofort (#15859, 1.0.2a1).

## ecmind\_blue\_client 1.0.1

Der Changelog der 1.0.1 ist nicht nach Alphas aufgeteilt, deshalb steht hier durchgehend  
1.0.1 und keine feinere Angabe.

### Neu

- Namespace `ecm.portfolio` für enaio-Mappen: `search()`, `get()`, `create()`, `delete()`,  
`add_objects()`, `remove_objects()`. Ersetzt das Zusatzpaket  
`ecmind-blue-client-portfolio`.
- `ecm.security.check_user_account()` prüft über `krn.CheckUserAccount`, ob ein Benutzer  
sich anmelden kann, `check_password_complexity()` prüft ein Passwort gegen die  
Serverregel.
- Verbindungspool: `keepalive_interval` auf beiden Pool-Clients, dazu `close()` bzw.  
`aclose()` und Verwendung als Context-Manager.
- Dokumentvarianten: `ecm.dms.set_active_variant()`, `variants()`, `active_variant()`,  
`obj.system.active_variant`.
- `ecm.system.delete_user_data()` und `get_user_data_names()` (#15865).
- `result_as_file()` auf den Query-Buildern sowie die Streaming-Parser `stream_lol_rows`  
und `stream_hol_objects` für grosse Trefferlisten.

### Geändert

- `ECMUserAttributes.last_modified` heisst `profile_changed` und ist ein `bool`. Das  
XML-Attribut `geaendert` ist ein 0/1-Kennzeichen, kein Zeitstempel.
- `ecm.dms.undo_checkout()` sendet `Flags=1` als Default, hebt einen Checkout also auch von  
einer anderen Station auf. Das alte Verhalten über `allow_other_station=False`.
- `ecm.dms.upsert()`: ein Tabellenfeld zu leeren verlangt `.replace_table_fields(True)` und  
wirft sonst `ValueError`.
- Query-Bedingungen sind gegen den deklarierten Feldtyp typisiert (#15868).
- Zeitstempel hängen nicht mehr von der Zeitzone des Clients ab. Jede Epoch-Umrechnung läuft  
über die Zeitzone der Installation, lesend wie schreibend.

### Behoben

- `obj.system.rights` liefert die tatsächlichen Berechtigungen. Vorher wurden pauschal alle  
Rechte gemeldet (#15860).
- `and`, `or` und `not` auf einer Query-Bedingung werfen, statt einen Operanden still zu  
verwerfen (#15868).
- `ecm.dms.update()` kann ein Tabellenfeld wieder leeren (#15826).
- Ein abgebrochenes `NotificationSubscription.stop()` schliesst den Callback-Kanal wieder  
(#15827).
- `ECMSystemRole` benennt acht bisher undokumentierte Systemrollen.
- `dms.GetResultList` und `dms.GetObjectDetails` werden inline statt über eine Antwortdatei  
aufgerufen, das Paging parst mit `iterparse`. Spitzenspeicher beim Paging 222 MB auf  
1,2 MB.

## Umstieg

Wer `impersonate(user_id=...)` verwendet, muss auf `impersonate(username=...)` oder  
`impersonate(user_guid=...)` wechseln.

Vollständiger Changelog und Migrationshinweise: [https://ecmind-blue-client.docs.ecmind.ch](https://ecmind-blue-client.docs.ecmind.ch)
