diff --git a/frontend/src/composables/identifierSettings.js b/frontend/src/composables/identifierSettings.js new file mode 100644 index 0000000..1e7fd87 --- /dev/null +++ b/frontend/src/composables/identifierSettings.js @@ -0,0 +1,36 @@ +// Global enable/disable flags for optional asset identifiers, read from the +// settings table. Loaded once and shared across components. Defaults to +// enabled when a flag is missing so a fresh install shows the identifiers. +import { reactive } from 'vue' +import { settingsApi } from '../api' + +const identifierflags = reactive({ + gaugelabreference: true, + maintenancereference: true, + fqdn: true, + loaded: false +}) + +let inflight = null + +export function useIdentifierFlags() { + if (!identifierflags.loaded && !inflight) { + inflight = settingsApi.list() + .then(({ data }) => { + const map = {} + ;(data.data || []).forEach(s => { map[s.key] = s.value }) + if ('identifier_gaugelabreference_enabled' in map) { + identifierflags.gaugelabreference = map.identifier_gaugelabreference_enabled !== false + } + if ('identifier_maintenancereference_enabled' in map) { + identifierflags.maintenancereference = map.identifier_maintenancereference_enabled !== false + } + if ('identifier_fqdn_enabled' in map) { + identifierflags.fqdn = map.identifier_fqdn_enabled !== false + } + identifierflags.loaded = true + }) + .catch(() => { identifierflags.loaded = true }) + } + return identifierflags +} diff --git a/frontend/src/views/settings/SystemSettings.vue b/frontend/src/views/settings/SystemSettings.vue index 95c0671..9e0cd03 100644 --- a/frontend/src/views/settings/SystemSettings.vue +++ b/frontend/src/views/settings/SystemSettings.vue @@ -375,6 +375,60 @@ + + +
+

Asset Identifiers

+ +
+

+ Enable or disable optional asset identifiers. When disabled, the identifier + is hidden from asset forms and detail pages across the system. +

+ +
+ +
+ +
+ +
+ +
+ +
+
+
{{ error }}
@@ -409,7 +463,11 @@ const settings = reactive({ saml_acs_url: '', saml_allow_local_login: true, saml_auto_create_users: true, - saml_admin_group: '' + saml_admin_group: '', + // Asset identifiers + identifier_gaugelabreference_enabled: true, + identifier_maintenancereference_enabled: true, + identifier_fqdn_enabled: true }) const loading = ref(true) diff --git a/migrations/versions/7b02_gaugelabreference.py b/migrations/versions/7b02_gaugelabreference.py new file mode 100644 index 0000000..165b98b --- /dev/null +++ b/migrations/versions/7b02_gaugelabreference.py @@ -0,0 +1,44 @@ +"""Add Asset.gaugelabreference and Asset.maintenancereference + +Adds dedicated external-reference columns to assets, distinct from +assetnumber. Equipment commonly carries an authoritative gauge lab reference +and a maintenance system reference; assetnumber stays the generic asset tag +and name the layperson label. + +Revision ID: 7b02_gaugelabref +Revises: 7a01_adr001_position +Create Date: 2026-06-25 + +""" +from alembic import op +import sqlalchemy as sa + + +revision = '7b02_gaugelabref' +down_revision = '7a01_adr001_position' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.batch_alter_table('assets') as batch_op: + batch_op.add_column(sa.Column( + 'gaugelabreference', sa.String(length=50), nullable=True, + comment='Gauge lab asset reference (authoritative tag the gauge ' + 'lab assigns to equipment); distinct from assetnumber')) + batch_op.add_column(sa.Column( + 'maintenancereference', sa.String(length=50), nullable=True, + comment='Maintenance system asset reference; distinct from ' + 'assetnumber')) + batch_op.create_index('ix_assets_gaugelabreference', + ['gaugelabreference']) + batch_op.create_index('ix_assets_maintenancereference', + ['maintenancereference']) + + +def downgrade(): + with op.batch_alter_table('assets') as batch_op: + batch_op.drop_index('ix_assets_maintenancereference') + batch_op.drop_index('ix_assets_gaugelabreference') + batch_op.drop_column('maintenancereference') + batch_op.drop_column('gaugelabreference') diff --git a/shopdb/core/api/settings.py b/shopdb/core/api/settings.py index 8d41844..023246f 100644 --- a/shopdb/core/api/settings.py +++ b/shopdb/core/api/settings.py @@ -134,6 +134,28 @@ def create_setting(): def seed_default_settings(): """Seed default settings if they don't exist.""" defaults = [ + # Asset identifier feature toggles (global, per identifier) + { + 'key': 'identifier_gaugelabreference_enabled', + 'value': 'true', + 'valuetype': 'boolean', + 'category': 'identifiers', + 'description': 'Show the Gauge Lab Reference identifier on assets' + }, + { + 'key': 'identifier_maintenancereference_enabled', + 'value': 'true', + 'valuetype': 'boolean', + 'category': 'identifiers', + 'description': 'Show the Maintenance Reference identifier on assets' + }, + { + 'key': 'identifier_fqdn_enabled', + 'value': 'true', + 'valuetype': 'boolean', + 'category': 'identifiers', + 'description': 'Show the FQDN / hostname identifier on assets' + }, # Zabbix integration { 'key': 'zabbix_enabled', diff --git a/shopdb/core/models/asset.py b/shopdb/core/models/asset.py index c76cf79..4b82ac2 100644 --- a/shopdb/core/models/asset.py +++ b/shopdb/core/models/asset.py @@ -74,6 +74,17 @@ class Asset(BaseModel, SoftDeleteMixin, AuditMixin): db.String(100), comment='Display name/alias' ) + gaugelabreference = db.Column( + db.String(50), + index=True, + comment='Gauge lab asset reference (authoritative tag the gauge lab ' + 'assigns to equipment); distinct from assetnumber' + ) + maintenancereference = db.Column( + db.String(50), + index=True, + comment='Maintenance system asset reference; distinct from assetnumber' + ) serialnumber = db.Column( db.String(100), index=True,