39 lines
1.6 KiB
Python
39 lines
1.6 KiB
Python
"""Index the cached submission limit independently of Alpha quality checks."""
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision = "0020"
|
|
down_revision = "0019"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
op.add_column("alphas", sa.Column("submission_blocked", sa.Boolean(), nullable=False, server_default=sa.false()))
|
|
table = sa.table("alphas", sa.column("id", sa.String()), sa.column("checks", sa.JSON()),
|
|
sa.column("submission_blocked", sa.Boolean()))
|
|
connection = op.get_bind()
|
|
last_id = None
|
|
while True:
|
|
query = sa.select(table.c.id, table.c.checks).order_by(table.c.id).limit(500)
|
|
if last_id is not None:
|
|
query = query.where(table.c.id > last_id)
|
|
rows = connection.execute(query).mappings().all()
|
|
if not rows:
|
|
break
|
|
# Frozen snapshot interpretation; never depend on future application code.
|
|
blocked = [row["id"] for row in rows if isinstance(row["checks"], list) and any(
|
|
isinstance(check, dict) and check.get("name") == "REGULAR_SUBMISSION"
|
|
and isinstance(check.get("result"), str) and check["result"].upper() == "FAIL"
|
|
for check in row["checks"])]
|
|
if blocked:
|
|
connection.execute(table.update().where(table.c.id.in_(blocked)).values(submission_blocked=True))
|
|
last_id = rows[-1]["id"]
|
|
op.create_index("ix_alphas_submission_blocked", "alphas", ["submission_blocked"])
|
|
|
|
|
|
def downgrade():
|
|
op.drop_index("ix_alphas_submission_blocked", table_name="alphas")
|
|
op.drop_column("alphas", "submission_blocked")
|