From 959db2922b4b6d95f3f738ef80bac1807a549e92 Mon Sep 17 00:00:00 2001 From: cproudlock Date: Wed, 5 Aug 2026 14:50:06 -0400 Subject: [PATCH] Release 0.8.1 The installer on the share was stamped 0.8.0 and contained sixteen commits that were not in the v0.8.0 tag. A build that misreports its own version is exactly what the version check in docs/RELEASING-WINDOWS.md exists to prevent, and it would have left two sites unable to say what they were running. Everything in 0.8.1 landed after v0.8.0 was tagged this morning, driven by two sites entering real data for the first time: the blank-code 500, the two-slide display that never rotated, modals discarding a part-filled form, filters returning an empty page, model photos that could not be saved, and the shared equipment catalog that lets a new site start with vendors, models and printer supply part numbers already present. CHANGELOG gains a 0.8.1 section, and the OpenAPI document follows __version__ rather than being restated. --- CHANGELOG.md | 58 ++++++++++++++++++++++++++++++++++++++++++- docs/openapi.json | 2 +- frontend/package.json | 2 +- shopdb/__init__.py | 2 +- 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27a9de0..5841183 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,61 @@ ADR-007 and ADR-002. ## [Unreleased] +## [0.8.1] - 2026-08-05 + +Everything here shipped after v0.8.0 was tagged the same morning, driven by two +sites putting real data in for the first time. Most of it is defects that only +appear when somebody who did not build the software tries to use it. + +### Fixed + +- A blank optional code could be saved once and never again. A unique nullable + column accepts any number of NULLs but exactly one empty string, so the second + business unit with no code collided with the first and returned 500 from a + field the form correctly showed as optional. Blank now stores as NULL, which + covers every unique nullable column - asset numbers, hostnames, item codes, + subnet names, gage-lab tags - not just the one that was reported. A genuine + duplicate answers 409 with a readable message instead of a bare 500. +- A lobby display with exactly two slides never changed between them. The + slideshow was started twice, and two timer chains advancing one slide each + landed back on the first every cycle. With three or more slides it advanced by + two and merely skipped one, which is why it went unnoticed. The per-slide + duration the feed has always sent was also ignored in favour of a hardcoded + ten seconds. +- Clicking slightly outside a modal discarded a part-filled form, in 35 modals + across 30 files. Confirmation dialogs still dismiss that way, since they hold + nothing to lose. +- Selecting a filter while past page one returned an empty list, because the + filter asked for page five of a result set that now had one page. +- Model photos could not be saved: an uploaded photo sets the field to an + application path, and the input was type="url", which demands an absolute + address. The upload button was also hidden when creating a model. +- An empty bordered box appeared after Notes on the network device form. + +### Added + +- The equipment catalog travels. `flask seed catalog` loads 53 vendors, 128 + models with photos, 146 printer supply part numbers and every type vocabulary, + so a new site can start adding printers immediately instead of retyping a + catalog another site spent a year building. Idempotent and additive; catalog + only, with nothing site-specific. Offered by the installer as a tick-box and + by the operator console. +- `shopdb-admin.ps1 repair` completes an interrupted provisioning, and `check` + now says when a server is not fully provisioned instead of leaving it to be + inferred from 500s on unrelated pages. +- Network devices can be linked to a catalog model, and their map position is + picked on the floor plan rather than typed as coordinates. +- An asset's vendor and type can be derived from its catalog model, by exact + name match only, with a reviewable backfill script. + +### Changed + +- Labels say whose type they mean: Machine Type, PC Type, Printer Type, Device + Type, next to the catalog's Model type. +- The 3D parts kiosk label prefix is a setting rather than one site's initials + hardcoded in the source. +- The operator console menu is grouped by what each action touches. + ## [0.8.0] - 2026-08-05 First release to carry the Windows installer. Everything below shipped after @@ -603,7 +658,8 @@ letting other GE Aerospace sites stand up their own self-hosted instance integration that passed the key as a query parameter. See `docs/COLLECTOR-INTEGRATION.md`. -[Unreleased]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.8.0...HEAD +[Unreleased]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.8.1...HEAD +[0.8.1]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.8.0...v0.8.1 [0.8.0]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.7.0...v0.8.0 [0.7.0]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.6.0...v0.7.0 [0.6.0]: https://gitea.proudtech.net/ge-aerospace/shopdb-flask/compare/v0.5.0...v0.6.0 diff --git a/docs/openapi.json b/docs/openapi.json index 474a11e..5bf29b0 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "ShopDB Flask API", - "version": "0.8.0", + "version": "0.8.1", "description": "Asset-management API (core + plugins). Responses use a `success_response` envelope: `{status, data, meta}`. Auth: Bearer JWT (login or a managed PAT) for `jwt`/`admin`/`permission:*`; `X-API-Key` for collector/managed-token endpoints; public endpoints need neither." }, "servers": [ diff --git a/frontend/package.json b/frontend/package.json index 3ca7bbb..b83df5c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "shopdb-frontend", - "version": "0.8.0", + "version": "0.8.1", "private": true, "type": "module", "scripts": { diff --git a/shopdb/__init__.py b/shopdb/__init__.py index c858280..c428366 100644 --- a/shopdb/__init__.py +++ b/shopdb/__init__.py @@ -42,7 +42,7 @@ __contract_version__ = '0.15.0' # plugin-contract version above are distinct series with independent # bump rules. Not part of the shopdb.api contract surface, so it is # not re-exported there. -__version__ = '0.8.0' +__version__ = '0.8.1' def create_app(config_name: str = None) -> Flask: