Assign printers to a MACHINE and let whichever PC controls it install them, with the observed half kept strictly apart from the assigned half: a collector report can never write an assignment row. Adoption is explicit. Adds a singular relationship type so defaultprinter can mean exactly one, client scripts that converge a bay's queues and correct a drifted one in place, and a wave gate so a fleet-wide driver rollout cannot stampede its own share. On the container side: the compose stack never persisted the instance directory, so a rebuild discarded plugins.json and every upload. It is a volume now, the image ships instance/ owned by the app user so the mountpoint is writable, and the database moves to MySQL 8.4 LTS, which the Windows runbook has recommended since 8.0 went end of life. The image also could not build at all: the frontend stage never copied the plugin staging script it runs. Adds a topology migration guide covering IIS to Docker and back.
44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
"""Add drivername to printerdrivers (exact INF driver name).
|
|
|
|
`location` points at the driver package; `name` is what a human calls it.
|
|
Add-PrinterDriver needs neither - it needs the driver name exactly as the INF
|
|
declares it ('HP Universal Printing PCL 6'), which nothing in the row carried.
|
|
Nullable: existing rows have no INF name until someone types it in.
|
|
|
|
Guarded/idempotent: skips when the table is absent (plugin disabled) or the
|
|
column already exists (e.g. a test DB built by db.create_all() from the model).
|
|
|
|
Revision ID: printers0003drivername
|
|
Revises: printers0002supplyalerts
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision = 'printers0003drivername'
|
|
down_revision = 'printers0002supplyalerts'
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
bind = op.get_bind()
|
|
inspector = sa.inspect(bind)
|
|
if 'printerdrivers' not in inspector.get_table_names():
|
|
return
|
|
columns = {column['name'] for column in inspector.get_columns('printerdrivers')}
|
|
if 'drivername' not in columns:
|
|
op.add_column('printerdrivers',
|
|
sa.Column('drivername', sa.String(length=255), nullable=True))
|
|
|
|
|
|
def downgrade():
|
|
bind = op.get_bind()
|
|
inspector = sa.inspect(bind)
|
|
if 'printerdrivers' not in inspector.get_table_names():
|
|
return
|
|
columns = {column['name'] for column in inspector.get_columns('printerdrivers')}
|
|
if 'drivername' in columns:
|
|
op.drop_column('printerdrivers', 'drivername')
|