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>
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
"""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")
|