Heute freue ich mich, dass wir das ECMind blue Studio in Version 1.0.0 auf PyPI.org veröffentlichen konnten:
ECMind blue Studio auf pypi.org
Das ECMind blue Studio ist eine Weboberfläche, die wir primär für unsere tägliche Arbeit in der Administration und Entwicklung mit für enaio®, sozusagen „für uns selbst“ entwickelt haben. Da dies aber auch für andere nützlich sein könnte, haben wir es kostenlos veröffentlicht.
Bitte beachtet aber unbedingt, dass die Verwendung von enaio® selbst, inklusive API, von jedem Unternehmen bzw. User in Abstimmung mit OPTIMAL SYSTEMS oder dem enaio®-Vertriebspartner selbstständig zu klären und entsprechend gegenüber OPTIMAL SYSTEMS zu vergüten ist.
ECMind blue Studio setzt auf den ecmind-blue-client auf, bringt alle unten gezeigten Frontend-Bestandteile mit und benötigt keine Internetverbindung. Die Anmeldung erfolgt mit einem DMS-User: Jede Anweisung läuft mit den Rechten dieses Users, nicht mit denen des technischen Kontos.
pip install ecmind-blue-studio
# .env mit Servern, technischem Konto und Session-Secret füllen
ecmind-blue-studio
Voraussetzung sind Python >= 3.13 und ein technisches Konto mit der Systemrolle „Kontextwechsel“. Der Quellcode liegt unter MIT auf https://gitlab.ecmind.ch/open/ecmind_blue_studio.
Abfragen und Schreiben in einer eigenen Sprache
Jeder Tab ist ein Monaco-Editor mit Vervollständigung, Hover und Diagnose über die echte Objektdefinition, Ctrl+Enter führt aus. Interne Feldnamen werden ohne Klammern geschrieben, Unterabfragen gehen über die Objekthierarchie, Schreibanweisungen lesen ihr Ergebnis zurück und zeigen es als Tabelle:
select document Invoice where Status = 'open' and InvoiceDate >= #DATE#-3m order by InvoiceDate desc limit 50
select folder Customer contains (document Invoice where Status = 'overdue')
update document Invoice 4711 set Status = 'paid'
insert document Invoice into 5693 set InvoiceNo = 'R-9', Amount = 12.5 file 'scan.pdf'
Ergebnisse gibt es als Tabelle, JSON, JSONL, XML, CSV oder TSV – pro Zeile mit den Icons Detailansicht, Historie, Dokumentenvorschau und Download. Ein Objekttyp, den der angemeldete Benutzer nicht sehen darf, wird vor dem Ausführen markiert, weil das DMS eine solche Abfrage mit einem leeren Ergebnis und ohne jeden Fehler beantwortet.
Objektdefinition zum Nachschauen
Der erste feste Tab zeigt, was der Server über sein eigenes Datenmodell weiss: Schränke mit Ordnern, Registern und Dokumenten, jedes Indexfeld mit Datentyp, Datenbankspalte und den Namen in allen konfigurierten Sprachen. Das Filterfeld sucht über alles gleichzeitig, pro Objekttyp öffnen sechs Schaltflächen eine vorbefüllte select-, count-, insert-, update-, upsert- oder delete-Anweisung in einem neuen Tab und die native asobjdef.xml gibt es als Download.
Live-Ansicht von Jobaufrufen
Der zweite feste Tab hört auf den Jobaufruf-Strom der konfigurierten Server, also auf denselben Feed, den der Enterprise Manager anzeigt. Gefiltert wird nach Server, Job, Computer, Anwendung und Benutzer oder auf Fehler reduziert. Ein Klick auf eine Zeile zeigt den Aufruf so, wie ihn der Enterprise Manager schreibt, aber mit dekodierten Base64-Nutzlasten und eingerücktem XML. Jeder Wert im Kopf ist ein Filter auf sich selbst. Der letzte Link öffnet den Aufruf als fertige execute-Anweisung in einem neuen Tab.
Jeder Serverjob aus dem Editor
execute ruft jeden Serverjob direkt auf, mit typisierter Parameterliste. Der Typ kommt aus dem Literal, ein Base64-Parameter wird als Klartext zwischen ''' geschrieben, damit eine XML-Nutzlast im Editor lesbar bleibt. Eingabedateien kommen aus den Anhängen des Tabs, Antwortdateien stehen mit Vorschau und Download unter dem Ergebnis. Ein Rückgabewert ungleich null ist kein Fehler, sondern die Antwort:
execute krn.GetServerInfo set Flags = 0, Info = 6
execute dms.GetResultList set Flags = 16, XML = '''<DMSQuery/>''', Encoding = 'UTF-8' as res;
print @res.Count, @res.TotalHits
Die Vervollständigung kennt die Jobs, die der Server tatsächlich anbietet, und ergänzt Parameternamen, Typen und Beschreibungen aus der öffentlichen API-Referenz des DMS.
Registry und Threads über alle Server
Die Registry gehört einer Servermaschine und zwei Applikationsserver eines Pools können sich über eine Einstellung uneinig sein. Genau das macht diese Anweisungsfamilie sichtbar: Der Server ist eine Spalte jeder Zeile und ohne on-Klausel wird jeder konfigurierte Server gefragt. Einträge, deren Name auf Pwd, Password oder Secret enden, zeigen *** in Ergebnis, Export und Log gleichermassen. Eine Schreibanweisung ist erst persistent, wenn sie auf save endet. Dieselbe Logik gilt für select threads und select queues, dort typisiert mit abgeleiteten Spalten wie der mittleren Jobdauer, und mit break thread für einen hängenden Job.
select registry where name = 'HelpURL'
update registry set 'Security\HelpURL' = 'https://help.example' save
select threads where running = true order by avgjob desc
Und sonst
- Sicherheitssystem:
select user,insert user,add user to group,export security group ..., mitreload security, weil eine Rechteänderung erst nach dem Neulesen des Modells wirkt und das System bis dahin keinen Fehler meldet. - Freies SQL mit DMS-Namen:
sql SELECT {original_filename} FROM {PostDoc} WHERE {Status} = 'done'geht alsSELECT feld1 FROM object48 WHERE feld4 = 'done'an die Datenbank. Ersetzt wird nur der Text in den Klammern - und nur durch einen Identifier aus der Definition. - Konfiguration pro Anmeldung im DMS: Theme, Sprache und gespeicherte Abfragen folgen dem Benutzer in jeden Browser.
- Deutsch und Englisch mit automatischer Erkennung, Dark- und Light-Mode ebenfalls automatisch.
Ein Hinweis: Der Jobaufruf-Monitor, execute, die Registry- und die Thread-Anweisungen laufen auf der technischen Verbindung, weil die dahinterliegenden Jobs kein eigenes Rechtemodell haben (können). Der Zugang hängt deshalb an den Systemrollen „DMS: Supervisor“ oder „Administrator: Starten“, serverseitig geprüft, und die Jobparameter werden unmaskiert angezeigt. Dies ist also auch weiterhin besonders zu schützen, wenn das ECMind blue Studio eingesetzt werden soll.
Zu den einzelnen Bereichen folgen in den nächsten Wochen eigene Beiträge, hier ging es erst einmal um den Überblick.
Wie praktisch jede Software steht auch diese auf den Schultern vieler anderer Projekte. Unser Dank geht deshalb unter anderem an FastAPI, Uvicorn, Jinja, Pydantic, HTMX, Bootstrap, Monaco Editor, Phosphor Icons, Open Sans, JetBrains Mono, Python und natürlich insbesondere OPTIMAL SYSTEMS.
Für Rückfragen stehe ich hier im Forum gerne zur Verfügung.




