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.
This commit is contained in:
cproudlock
2026-08-05 14:50:06 -04:00
parent 512d5fafac
commit 0649e1d9eb
4 changed files with 60 additions and 4 deletions

View File

@@ -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

View File

@@ -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": [

View File

@@ -1,6 +1,6 @@
{
"name": "shopdb-frontend",
"version": "0.8.0",
"version": "0.8.1",
"private": true,
"type": "module",
"scripts": {

View File

@@ -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: