Files
shopdb-flask/migrations/versions/7d32_displayrole_kiosk_vocabulary.py

68 lines
2.3 KiB
Python

"""Move dashboarddefaults.displayrole onto the kiosk's own role vocabulary
Core named the roles dashboard / lobby / partskiosk. The kiosks name them
Dashboard / Lobby / 3DPrintRoom - the literal values a person types into
C:\\Enrollment\\display-type.txt, which the GE-Enforce dispatcher reads to pick
a target. Two vocabularies meant a display could report a role core could not
store, and core could store 'partskiosk', a value no kiosk would ever match.
The machine's own file wins, so the stored values move to it. 'partskiosk'
becomes '3DPrintRoom'; the other two are a case change only. Anything else is
left alone - an unrecognised value is somebody's data, not ours to guess at.
Idempotent and reversible: matching is case-insensitive, so a re-run is a no-op
rather than a second rewrite, and downgrade puts the old spellings back.
Revision ID: 7d32_displayrole_kiosk_vocabulary
Revises: 7d31_dashboarddefault_fqdn
Create Date: 2026-08-13
"""
from alembic import op
import sqlalchemy as sa
revision = '7d32_displayrole_kiosk_vocabulary'
down_revision = '7d31_dashboarddefault_fqdn'
branch_labels = None
depends_on = None
# old spelling -> new spelling
FORWARD = {
'dashboard': 'Dashboard',
'lobby': 'Lobby',
'partskiosk': '3DPrintRoom',
}
BACKWARD = {new: old for old, new in FORWARD.items()}
def _rewrite(mapping, newdefault):
connection = op.get_bind()
inspector = sa.inspect(connection)
if 'dashboarddefaults' not in inspector.get_table_names():
return
columns = {col['name'] for col in inspector.get_columns('dashboarddefaults')}
if 'displayrole' not in columns:
return
for source, target in mapping.items():
connection.execute(
sa.text('UPDATE dashboarddefaults SET displayrole = :target'
' WHERE LOWER(displayrole) = :source'),
{'target': target, 'source': source.lower()})
# 7d28 created the column with server_default='dashboard'; keep the default
# spelled the same way as the values.
op.alter_column('dashboarddefaults', 'displayrole',
existing_type=sa.String(length=20),
existing_nullable=False,
server_default=newdefault)
def upgrade():
_rewrite(FORWARD, 'Dashboard')
def downgrade():
_rewrite(BACKWARD, 'dashboard')