"""Add dellupdatesjson to endpointstates. Stores the pending Dell Command | Update summary reported by the shopdb-dellupdates agent utility. MEDIUMTEXT for consistency with the other snapshot columns on this table. Nullable with no backfill. Null means the endpoint has never reported a Dell scan result, which is deliberately distinct from a stored payload whose status is 'ok' with an empty list (scanned, nothing pending). The status card renders those two states differently, so defaulting this to an empty summary would assert every pre-existing endpoint had been scanned and found clean. Idempotent: the column-add checks the live schema first, so a re-run and a db.create_all() site both stay clean on strict MySQL 8. """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = 'endpoints0016dellupdates' down_revision = 'endpoints0015systemtelemetry' branch_labels = None depends_on = None TABLE_NAME = 'endpointstates' COLUMN_NAME = 'dellupdatesjson' def _has_column(table_name, column_name): from sqlalchemy import inspect inspector = inspect(op.get_bind()) if not inspector.has_table(table_name): return False return any(col['name'] == column_name for col in inspector.get_columns(table_name)) def upgrade(): if not _has_column(TABLE_NAME, COLUMN_NAME): op.add_column( TABLE_NAME, sa.Column(COLUMN_NAME, sa.Text(length=16777215), nullable=True)) def downgrade(): if _has_column(TABLE_NAME, COLUMN_NAME): op.drop_column(TABLE_NAME, COLUMN_NAME)