Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

ECMind blue Studio

A admin interface for the DMS enaio(r) (OPTIMAL SYSTEMS GmbH), exposing the ecmind-blue-client features. Query folders, registers and documents with a simple query language in a Monaco editor, inspect results and download files. Works fully offline against your DMS infrastructure; all frontend assets are vendored.

Features (work in progress)

  • Browser-like vertical tabs, each with a query editor and a result view
  • Object definition explorer: every cabinet, type and index field with its full configuration, a filter over all of it, prefilled statements per object type and the native asobjdef.xml as download
  • Job call monitor: the live server job stream with filters per server, job, computer, application and user, and the full parameters of a single call with base64 payloads decoded
  • Simple query language for folders, registers and documents with subqueries, Klausel-style conditions, code completion and diagnostics
  • Security statements for users, groups, roles, membership and the rights export
  • Result tables per object type with file download
  • ECMind theme with Green/Yellow/Blue brands, automatic light/dark mode
  • English/German localization with automatic detection

Requirements

  • Python >= 3.13 and uv
  • A DMS application server (default: 127.0.0.1:4000)
  • A technical account with the system role "Kontextwechsel" (switch context)

Setup

uv sync
copy .env.example .env
# edit .env: servers, technical account, session secret

Run

uv run uvicorn ecmind_blue_studio.main:app --reload --host 127.0.0.1 --port 8099

Then open http://127.0.0.1:8099 and log in with a DMS user.

Object definition

The first tab cannot be closed and shows what the DMS server knows about its own data model: cabinets with their folders, registers and documents, the index mask fields of every type with data type, database column and names in the configured languages, and the complete configuration of a single field. The filter box searches all of it at once, six buttons per object type open a prefilled select, count, insert, update, upsert or delete statement in a new tab, and the download button hands out the native asobjdef.xml.

It needs the system role "DMS: Supervisor" (18) or "Editor: Starten" (11); without one of them the tab is not shown.

Job calls

The second fixed tab shows the live job stream of the configured servers, the same feed the Enterprise Manager displays. Press Listen and every finished job appears as one line with its timestamp, computer, user, job name, application and file counts; a green check for success, a red warning for a failure, and optionally a blue play line when the job starts. Filter by server, by job (a popup over every namespace the server offers), by computer, application or user, or reduce the stream to failures only. Clicking a line shows the call the way the Enterprise Manager prints it, with base64 payloads decoded and XML indented.

It needs the system role "DMS: Supervisor" (18) or "Administrator: Starten" (1). The monitor runs on the technical connection, which is why the roles are checked on the server and not only in the browser. Job parameters are shown unmasked.

Query language

Each tab has a Monaco editor with completion, hover and live diagnostics for a simple query language (see SPECS.md section 4). Ctrl+Enter runs the query, Shift+Alt+F formats it, Alt+N opens a tab and Alt+W closes it. Internal field names work without brackets:

select document Invoice, DeliveryNote where Status = 'open' order by InvoiceDate desc limit 100
select document Invoice in (register Correspondence where Subject = 'Dunning*') where InvoiceNo != ''
select document Invoice where Clerk = #USER# and InvoiceDate >= #DATE#-1y6m
select document Invoice columns InvoiceNo, Amount, folder.CompanyName
select document Invoice columns InvoiceNo, {OBJECT_FILESIZE}, {OBJECT_MODIFYTIME}, {OBJECT_DOCPAGECOUNT}
count document Invoice where Status = 'open'

System fields (OBJECT_ID, OBJECT_LINKS, OBJECT_FILESIZE, OBJECT_COUNT, OBJECT_MODIFYUSER and more, see SPECS.md) work in where, order by and columns; document-only fields are rejected on folder and register queries with a live editor marker.

The editor also flags object types the signed-in user cannot see, and completion notes them in its list. The DMS answers a query on such a type with an empty result and no error at all, so the hint is shown before the run. It stays a warning and never blocks the query: a type you can see may return no rows as well.

Data statements update, create and delete objects, always with the rights of the signed-in user:

update document Invoice 4711 set Status = 'paid'
update document Invoice 4711, 4712 set Status = 'paid'
delete document Invoice 6524, 6522 purge
insert document Invoice into 55 set InvoiceNo = 'R-9' file 'scan.pdf'
upsert document Invoice into 55 set InvoiceNo = 'R-9', Amount = 12.5 search InvoiceNo
variant 4711 set Status = 'draft' file 'v2.pdf'
delete document Invoice where Status = 'void' purge
insert document Invoice into 55 set InvoiceNo = 'R-9', Positions = (Article = 'A-100', Qty = 5), (Article = 'B-200', Qty = 3)
update document Invoice 4711 set Positions = (Article = 'A-100', Qty = 7) replacetables

A single insert, update or variant shows what it wrote: the objects are read back from the server and rendered as a result table below the confirmation, with the usual row actions. A large update (more objects than one result page) and statement batches keep the plain confirmation, because reading every object back costs a roundtrip each.

Table fields take a comma separated list of rows, each row a list of Column = value pairs. On update and upsert the statement has to say whether the rows replace the table (replacetables) or extend it (appendtables) - the mode belongs to the whole statement, so replacing one table and appending to another needs two statements. The table popup in a result row carries an "Edit table" button that opens a new tab with exactly such a statement, filled with the rows currently stored.

Files referenced by file '...' are attached to the tab with the paperclip button; file #BROWSE# instead opens the file dialog every time the statement update and delete also take a list of object ids, and every listed object gets its own copy of the file; a failing object does not stop the others, and the result lists what was written and what failed. On an id based update the set clause is optional, so update document Invoice 6523 file 'scan.pdf' replaces only the file and update document Invoice 6523 file #NULL# only removes it. Prefilled document statements (edit button, object definition page) end with file #BROWSE# as a reminder; delete the line for metadata-only changes. File content can also be written inline, with an optional extension after the closing quotes so the DMS knows the file type: file '''<data> </data>'''.xml stores the text, file b64'''iVBOR...'''.png decodes base64 (line breaks and spaces are ignored), and file #NULL# removes the document file on an update. Without an extension, text becomes a txt and base64 a bin file:

insert document Invoice into 5693
  set InvoiceNo = 'R-9'
  file b64'''
iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAYAAADUryzE...
  '''.png;
select document Invoice

Security statements administer the DMS users, groups and roles in the same language, again with the rights of the signed-in user, so the server enforces the role for configuring the security system:

select user where locked = false order by username limit 100
select user where group = 'Sales'
select group where user = #USER#
insert user KOL set display_name = 'Roland Koller', password = 'Start.2026', change_pwd = true
add user KOL to group Sales
export security group Sales, Marketing

select user KOL shows one account with every attribute, count group the number alone, and delete user KOL forward to MEY hands the portfolios and mails over before the account goes. User and group rows carry the same edit button as DMS rows: it opens a new tab with an update user or update group statement holding the current values. The password is never part of it, and never part of a result or a log.

Results render as a table by default or as JSON, JSONL, XML, CSV, TSV or TSV quoted, sql results included. Every text format opens in an editable editor, so the output can be trimmed before copy or download hands it to the next step. TSV sanitizes tabs and line breaks inside values to keep one record per line, TSV quoted keeps them and quotes like CSV instead. Every result row offers details (metadata, variants and versions), an edit button that opens a prefilled update statement, and file download.

Statement batches (separated by ;) stream their results statement by statement, report the executed command and the upsert action per row, and can be cancelled mid run; the stop button in the toolbar also aborts long running queries. A query starting with a comment line names its tab, the question button in the toolbar lists all keyboard shortcuts, the info button next to it opens the about dialog, and the tab rail shows the connected DMS servers above the user menu.

Tests

uv run pytest                            # unit and endpoint tests
$env:EBS_LIVE_TESTS = "1"; uv run pytest -m live   # against a local DMS (PowerShell)

Documentation

License

MIT, see LICENSE. Bundled third-party libraries, fonts, icons and tools are acknowledged in THIRD-PARTY-NOTICES.md.

The MIT license covers this software only and grants no rights to the DMS itself. Operators must make sure their use of the DMS is covered by their own license agreement with the DMS vendor or reseller. See the DMS licensing section of THIRD-PARTY-NOTICES.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ecmind_blue_studio-1.0.0a1.tar.gz (3.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ecmind_blue_studio-1.0.0a1-py3-none-any.whl (3.9 MB view details)

Uploaded Python 3

File details

Details for the file ecmind_blue_studio-1.0.0a1.tar.gz.

File metadata

  • Download URL: ecmind_blue_studio-1.0.0a1.tar.gz
  • Upload date:
  • Size: 3.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.15

File hashes

Hashes for ecmind_blue_studio-1.0.0a1.tar.gz
Algorithm Hash digest
SHA256 1d653880e51331929627cffe6b2529b826bdd24d91c9ee8ea6cffe3b474fae67
MD5 247253fc7e9af6aa0a830abc90ae6a84
BLAKE2b-256 d333fad4dcc5658fa5e10e76f8a77820c6131127c998b39796809d5701a2c1be

See more details on using hashes here.

File details

Details for the file ecmind_blue_studio-1.0.0a1-py3-none-any.whl.

File metadata

File hashes

Hashes for ecmind_blue_studio-1.0.0a1-py3-none-any.whl
Algorithm Hash digest
SHA256 f1d18dfaf92e0d27ae83ccbe5cae05f0ac97e4238d597572384f723f95055285
MD5 77d9cbd577708c3140c4f02e802ff2c6
BLAKE2b-256 950b3c64db863b035cb95d36d9cff60e61ca9df657d14ecd9b354a4ebfabb82d

See more details on using hashes here.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page