annotation/alembic/versions/36bff2d016f7_expand_validationschema.py (206 lines of code) (raw):

"""Expand ValidationSchema Revision ID: 36bff2d016f7 Revises: c06c594c7435 Create Date: 2021-12-28 15:09:23.826747 """ from enum import Enum import sqlalchemy as sa from alembic import op from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision = "36bff2d016f7" down_revision = "c06c594c7435" branch_labels = None depends_on = None DOCS_TASK_ID_FK = "annotated_docs_task_id_fkey" JOB_ANNOTATOR_JOB_ID_FK = "association_job_annotator_job_id_fkey" JOB_ANNOTATOR_USER_ID_FK = "association_job_annotator_user_id_fkey" JOB_OWNER_JOB_ID_FK = "association_job_owner_job_id_fkey" JOB_OWNER_USER_ID_FK = "association_job_owner_user_id_fkey" JOB_VALIDATOR_JOB_ID_FK = "association_job_validator_job_id_fkey" JOB_VALIDATOR_USER_ID_FK = "association_job_validator_user_id_fkey" TASKS_JOB_ID_FK = "tasks_job_id_fkey" def upgrade(): """ Add `cascade` delete option on fk and add new job type - validation_only. """ op.drop_constraint(DOCS_TASK_ID_FK, "annotated_docs", type_="foreignkey") op.create_foreign_key( DOCS_TASK_ID_FK, "annotated_docs", "tasks", ["task_id"], ["id"], ondelete="cascade", ) op.drop_constraint( JOB_ANNOTATOR_USER_ID_FK, "association_job_annotator", type_="foreignkey", ) op.drop_constraint( JOB_ANNOTATOR_JOB_ID_FK, "association_job_annotator", type_="foreignkey", ) op.create_foreign_key( JOB_ANNOTATOR_USER_ID_FK, "association_job_annotator", "jobs", ["job_id"], ["job_id"], ondelete="cascade", ) op.create_foreign_key( JOB_ANNOTATOR_JOB_ID_FK, "association_job_annotator", "users", ["user_id"], ["user_id"], ondelete="cascade", ) op.drop_constraint( JOB_OWNER_JOB_ID_FK, "association_job_owner", type_="foreignkey" ) op.drop_constraint( JOB_OWNER_USER_ID_FK, "association_job_owner", type_="foreignkey" ) op.create_foreign_key( JOB_OWNER_JOB_ID_FK, "association_job_owner", "jobs", ["job_id"], ["job_id"], ondelete="cascade", ) op.create_foreign_key( JOB_OWNER_USER_ID_FK, "association_job_owner", "users", ["user_id"], ["user_id"], ondelete="cascade", ) op.drop_constraint( JOB_VALIDATOR_JOB_ID_FK, "association_job_validator", type_="foreignkey", ) op.drop_constraint( JOB_VALIDATOR_USER_ID_FK, "association_job_validator", type_="foreignkey", ) op.create_foreign_key( JOB_VALIDATOR_JOB_ID_FK, "association_job_validator", "jobs", ["job_id"], ["job_id"], ondelete="cascade", ) op.create_foreign_key( JOB_VALIDATOR_USER_ID_FK, "association_job_validator", "users", ["user_id"], ["user_id"], ondelete="cascade", ) op.drop_constraint(TASKS_JOB_ID_FK, "tasks", type_="foreignkey") op.create_foreign_key( TASKS_JOB_ID_FK, "tasks", "jobs", ["job_id"], ["job_id"], ondelete="cascade", ) op.execute( "ALTER TYPE validation_type ADD VALUE IF NOT EXISTS 'validation_only'" ) class ValidationSchema(str, Enum): cross = "cross" hierarchical = "hierarchical" def downgrade(): """ Remove validation_only job type and rollback fk constraints """ op.alter_column( "jobs", "validation_type", type_=sa.VARCHAR(), server_default=None ) op.execute("DROP TYPE validation_type;") op.execute("DELETE FROM jobs " "WHERE validation_type = 'validation_only'") validation_type = postgresql.ENUM(ValidationSchema, name="validation_type") validation_type.create(op.get_bind(), checkfirst=True) op.alter_column( "jobs", "validation_type", type_=validation_type, server_default=ValidationSchema.cross.name, postgresql_using="validation_type::validation_type", ) op.drop_constraint(TASKS_JOB_ID_FK, "tasks", type_="foreignkey") op.create_foreign_key( TASKS_JOB_ID_FK, "tasks", "jobs", ["job_id"], ["job_id"] ) op.drop_constraint( JOB_VALIDATOR_USER_ID_FK, "association_job_validator", type_="foreignkey", ) op.drop_constraint( JOB_VALIDATOR_JOB_ID_FK, "association_job_validator", type_="foreignkey", ) op.create_foreign_key( JOB_VALIDATOR_USER_ID_FK, "association_job_validator", "users", ["user_id"], ["user_id"], ) op.create_foreign_key( JOB_VALIDATOR_JOB_ID_FK, "association_job_validator", "jobs", ["job_id"], ["job_id"], ) op.drop_constraint( JOB_OWNER_USER_ID_FK, "association_job_owner", type_="foreignkey" ) op.drop_constraint( JOB_OWNER_JOB_ID_FK, "association_job_owner", type_="foreignkey" ) op.create_foreign_key( JOB_OWNER_USER_ID_FK, "association_job_owner", "users", ["user_id"], ["user_id"], ) op.create_foreign_key( JOB_OWNER_JOB_ID_FK, "association_job_owner", "jobs", ["job_id"], ["job_id"], ) op.drop_constraint( JOB_ANNOTATOR_USER_ID_FK, "association_job_annotator", type_="foreignkey", ) op.drop_constraint( JOB_ANNOTATOR_JOB_ID_FK, "association_job_annotator", type_="foreignkey", ) op.create_foreign_key( JOB_ANNOTATOR_USER_ID_FK, "association_job_annotator", "users", ["user_id"], ["user_id"], ) op.create_foreign_key( JOB_ANNOTATOR_JOB_ID_FK, "association_job_annotator", "jobs", ["job_id"], ["job_id"], ) op.drop_constraint(DOCS_TASK_ID_FK, "annotated_docs", type_="foreignkey") op.create_foreign_key( DOCS_TASK_ID_FK, "annotated_docs", "tasks", ["task_id"], ["id"] )