Retire the legacy Machine model (ADR-001 cutover)
The asset/computer model is now the single source of truth. Remove the Machine instance layer end to end: - Delete models Machine, MachineStatus, PCType, MachineRelationship, InstalledApp, PrinterData; keep MachineType (models.machinetypeid still references it). - Delete the /api/machines, /api/statuses, /api/pctypes blueprints and the legacy /api/printers/legacy (PrinterData) blueprint. - Drop the deprecated communications.machineid column and its FK. - Migration 7c01 drops tables machines, machinestatuses, pctypes, machinerelationships, installedapps, printerdata (idempotent). - Fix remaining readers (applications install counts) to ComputerInstalledApp. - Frontend: remove dead machinesApi/statusesApi/pctypesApi wrappers; repoint the PC Types settings page at computer types. 143 tests pass; all asset/computer/dashboard/report/collector endpoints 200. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
47
migrations/versions/7c01_drop_legacy_machine.py
Normal file
47
migrations/versions/7c01_drop_legacy_machine.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""Drop the legacy Machine instance layer
|
||||
|
||||
Retires the Machine model (ADR-001): the asset/computer model is now the
|
||||
single source of truth. Drops machines + its PC/status lookups + the legacy
|
||||
relationship and installed-app tables + the legacy printer extension, and
|
||||
removes the deprecated communications.machineid column. machinetypes is kept
|
||||
(still referenced by models.machinetypeid).
|
||||
|
||||
Idempotent (IF EXISTS) so it is safe even though the live drop was applied
|
||||
directly during the cutover.
|
||||
|
||||
Revision ID: 7c01_drop_legacy_machine
|
||||
Revises: 7b02_gaugelabref
|
||||
Create Date: 2026-06-26
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
revision = '7c01_drop_legacy_machine'
|
||||
down_revision = '7b02_gaugelabref'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
_TABLES = ['printerdata', 'installedapps', 'machinerelationships',
|
||||
'machines', 'pctypes', 'machinestatuses']
|
||||
|
||||
|
||||
def upgrade():
|
||||
bind = op.get_bind()
|
||||
bind.exec_driver_sql("SET FOREIGN_KEY_CHECKS=0")
|
||||
insp = sa.inspect(bind)
|
||||
if 'machineid' in [c['name'] for c in insp.get_columns('communications')]:
|
||||
for fk in insp.get_foreign_keys('communications'):
|
||||
if 'machineid' in fk['constrained_columns'] and fk.get('name'):
|
||||
bind.exec_driver_sql(
|
||||
f"ALTER TABLE communications DROP FOREIGN KEY {fk['name']}")
|
||||
op.drop_column('communications', 'machineid')
|
||||
for t in _TABLES:
|
||||
bind.exec_driver_sql(f"DROP TABLE IF EXISTS {t}")
|
||||
bind.exec_driver_sql("SET FOREIGN_KEY_CHECKS=1")
|
||||
|
||||
|
||||
def downgrade():
|
||||
# The Machine layer is retired; recreating it is out of scope.
|
||||
raise NotImplementedError("Legacy Machine layer cannot be restored")
|
||||
Reference in New Issue
Block a user