Ecmind_blue_client: Release Notes 1.0.2

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