Workflow-Modell

Das Workflow-Modell ist das typisierte Gegenstück für die Eingangsvariablen eines Workflows — konzeptionell analog zum ECM-Modell für DMS-Objekte, aber als eigene, leichtgewichtige Implementierung (kein DMS-Query-/system-Verhalten).

Eine Modellklasse wird zur Laufzeit aus der Workflow-Definition erzeugt (workflow_model_by_name()) oder als .py-Datei generiert (ecm-generate-workflow-models). Eine Instanz hält die gesetzten Variablenwerte und serialisiert sich beim Start selbst in das vom Server erwartete DataFields-Format.

Das Workflow-Modell ist optional — ein reiner Komfort-Layer für typisierten, entdeckbaren Zugriff. Ein Prozess lässt sich auch ganz ohne Modell starten: start_process() akzeptiert variables ebenso als einfaches Mapping[str, str] (oder ganz ohne Variablen). Beispiel:

ecm.workflow.start_process(
    user=user, workflow="test", client_type="#OSECM_Client#",
    variables={"StringVar": "Hallo"},   # einfaches Mapping, kein Modell nötig
)

Für nicht-String-Variablen (Zahlen, Datum, Listen, Records) ohne Modell siehe RawWorkflowVariable in start_process().

1. Modellklassen

ECMWorkflowModel

Basisklasse eines generierten Workflow-Modells. Die Eingangsvariablen sind typisierte Attribute; eine Instanz wird mit ihnen als Keyword-Argumenten erzeugt.

ECMWorkflowRecordModel

Basisklasse für ein verschachteltes Record-Modell. Record-Variablen werden als eigene, vollständig typisierte Subklassen abgebildet (rekursiv, inkl. Record-in-Record und Listen von Records).

from ecmind_blue_client.ecm import ECM

ecm = ECM(client)
user = ecm.workflow.organisation_user_by_login("admin")

Model = ecm.workflow.workflow_model_by_name("test", user, "#OSECM_Client#")

record = Model.record_model("TestRecordVar")(
    StringField="x", IntegerField=1, StringListField=["a"],
)
instance = Model(StringVar="Hallo", IntegerVar=42, TestRecordVar=record)

Standardmäßig werden nur die Eingangsvariablen (INOUT) exponiert. include_internal=True (bei workflow_model_by_name / make_workflow_model) zeigt auch interne Felder.

2. Typ-Mapping

Jede Variable wird auf einen nativen Python-Typ abgebildet:

Server-Typ Python-Typ

STRING

str

INTEGER_SAFE

int

FLOAT_SAFE

float

DATE_SAFE

date

DATETIME_SAFE

datetime

TIME_SAFE

time

ListType

list[…]

RecordType

typisierte ECMWorkflowRecordModel-Nested-Klasse

Der _SAFE-Suffix ist ein enaio-Varianten-Tag und wird auf den Basistyp abgebildet. Unbekannte Basistypen fallen auf str zurück.

3. Instanzen verwenden

Model(**werte)

Erzeugt eine Instanz mit den Eingangsvariablen als Keyword-Argumente. Unbekannte Namen lösen TypeError aus.

Attributzugriff

Werte werden als Attribute gelesen und gesetzt (instance.StringVar = "x"). Nur deklarierte Eingangsvariablen sind setzbar.

Model.record_model("<name>")

Liefert die typisierte ECMWorkflowRecordModel-Klasse für eine Record-Variable, mit der Record-Werte erzeugt werden.

instance.to_variables()

Serialisiert die gesetzten Werte in das start_process(variables=…)-Mapping. Nicht gesetzte Variablen werden ausgelassen. Wird intern von start_process() aufgerufen, wenn eine Modellinstanz übergeben wird.

Gegen den enaio®-Server verifizierte Wertformate: Skalare (auch Integer/Float/Date/Time) werden als <WFVar><String>WERT</String></WFVar> gesendet — der Server konvertiert. Datetime erwartet einen Unix-Epoch-Timestamp. Listen werden als <List><ListItem Id="…" Selection="0"><STRING>…</STRING></ListItem></List> gerendert, Records als <Record><Member Name="…">…</Member></Record> (alle Member). Diese Details kapselt das Modell — sie müssen nicht von Hand erzeugt werden.

4. Datenmodell des Schemas

Das von workflow_model_by_name() intern geparste Schema ist auch direkt zugänglich (z. B. über Model.schema) und besteht aus eingefrorenen Dataclasses:

ECMWorkflowVariableSchema
  • variables (tuple[ECMWorkflowVariable, …]) — alle Variablen in Dokumentreihenfolge

  • inputs() — nur die Start-Eingangsvariablen (INOUT)

ECMWorkflowVariable
  • name (str) — Variablenname (zugleich DataField-Id beim Start)

  • type (ECMWorkflowVariableType) — Skalar-Basistyp (für Records Platzhalter STRING)

  • is_list (bool) — Liste ihres Elementtyps

  • is_record (bool) — Elementtyp ist ein Record

  • record_members (tuple[ECMWorkflowRecordMember, …]) — Record-Member, wenn is_record

  • is_input (bool) — Start-Eingangsvariable (INOUT)

ECMWorkflowRecordMember
  • name, type, is_list, is_record, record_members — wie oben; rekursiv

ECMWorkflowVariableType

Enum der Skalar-Basistypen: STRING, INTEGER, FLOAT, DATE, DATETIME, TIME (jeweils mit dem zugehörigen Python-Typ als Wert).

5. Modelle aus einem Schema bauen

make_workflow_model(schema, name="WorkflowModel", *, include_internal=False) erzeugt zur Laufzeit eine ECMWorkflowModel-Subklasse aus einem geparsten ECMWorkflowVariableSchema. workflow_model_by_name() ist der übliche Einstieg darüber; make_workflow_model ist nützlich, wenn das Schema bereits anderweitig vorliegt (z. B. aus eigenem wfm.GetWorkflow-XML über ECMWorkflowModelParser).

6. Siehe auch