未知(继上次中断)

This commit is contained in:
Cheng Zhou
2026-02-04 10:52:34 +08:00
parent 8e258d21a7
commit 737f84bf54
99 changed files with 5497 additions and 2143 deletions
@@ -0,0 +1,59 @@
"""migrate ae seriousness to roman numerals
Revision ID: 20260116_04
Revises: 20260116_03
Create Date: 2026-01-16 17:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "20260116_04"
down_revision: Union[str, None] = "20260116_03"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
UPDATE adverse_events
SET seriousness = CASE
WHEN UPPER(TRIM(seriousness)) = 'SERIOUS' THEN 'IV'
WHEN UPPER(TRIM(seriousness)) IN ('NON_SERIOUS', 'NON-SERIOUS', 'NON SERIOUS') THEN 'II'
WHEN TRIM(seriousness) = '1' THEN 'I'
WHEN TRIM(seriousness) = '2' THEN 'II'
WHEN TRIM(seriousness) = '3' THEN 'III'
WHEN TRIM(seriousness) = '4' THEN 'IV'
WHEN TRIM(seriousness) = '5' THEN 'V'
WHEN UPPER(TRIM(seriousness)) IN ('I', 'II', 'III', 'IV', 'V') THEN UPPER(TRIM(seriousness))
ELSE seriousness
END
"""
)
)
def downgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
UPDATE adverse_events
SET seriousness = CASE
WHEN UPPER(TRIM(seriousness)) = 'I' THEN '1'
WHEN UPPER(TRIM(seriousness)) = 'II' THEN '2'
WHEN UPPER(TRIM(seriousness)) = 'III' THEN '3'
WHEN UPPER(TRIM(seriousness)) = 'IV' THEN '4'
WHEN UPPER(TRIM(seriousness)) = 'V' THEN '5'
ELSE seriousness
END
"""
)
)
@@ -0,0 +1,95 @@
"""remove document workflows
Revision ID: 20260116_05
Revises: 20260116_04
Create Date: 2026-01-16 17:30:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = "20260116_05"
down_revision: Union[str, None] = "20260116_04"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.drop_table("workflow_actions")
op.drop_table("version_workflows")
op.drop_table("workflow_nodes")
op.drop_table("workflow_templates")
op.execute("DROP TYPE IF EXISTS workflow_action_type")
op.execute("DROP TYPE IF EXISTS workflow_status")
def downgrade() -> None:
workflow_status = sa.Enum("PENDING", "APPROVED", "REJECTED", "CANCELED", name="workflow_status")
workflow_action_type = sa.Enum("SUBMIT", "APPROVE", "REJECT", name="workflow_action_type")
workflow_status.create(op.get_bind(), checkfirst=True)
workflow_action_type.create(op.get_bind(), checkfirst=True)
op.create_table(
"workflow_templates",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
sa.Column("trial_id", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("name", sa.String(length=200), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("is_active", sa.Boolean(), server_default="true", nullable=False),
sa.Column("created_by", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.ForeignKeyConstraint(["trial_id"], ["studies.id"]),
sa.ForeignKeyConstraint(["created_by"], ["users.id"]),
)
op.create_table(
"workflow_nodes",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
sa.Column("template_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("node_order", sa.Integer(), nullable=False),
sa.Column("role", sa.String(length=50), nullable=False),
sa.Column("name", sa.String(length=100), nullable=True),
sa.Column("is_required", sa.Boolean(), server_default="true", nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.ForeignKeyConstraint(["template_id"], ["workflow_templates.id"]),
sa.UniqueConstraint("template_id", "node_order", name="uq_workflow_nodes_order"),
)
op.create_table(
"version_workflows",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
sa.Column("document_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("version_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("template_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("status", workflow_status, server_default="PENDING", nullable=False),
sa.Column("current_node", sa.Integer(), nullable=True),
sa.Column("submitted_by", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("submitted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.ForeignKeyConstraint(["document_id"], ["documents.id"]),
sa.ForeignKeyConstraint(["version_id"], ["document_versions.id"]),
sa.ForeignKeyConstraint(["template_id"], ["workflow_templates.id"]),
sa.ForeignKeyConstraint(["submitted_by"], ["users.id"]),
sa.UniqueConstraint("version_id", name="uq_version_workflow_version"),
)
op.create_table(
"workflow_actions",
sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
sa.Column("workflow_id", postgresql.UUID(as_uuid=True), nullable=False),
sa.Column("node_order", sa.Integer(), nullable=True),
sa.Column("action", workflow_action_type, nullable=False),
sa.Column("actor_id", postgresql.UUID(as_uuid=True), nullable=True),
sa.Column("comment", sa.Text(), nullable=True),
sa.Column("acted_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
sa.ForeignKeyConstraint(["workflow_id"], ["version_workflows.id"]),
sa.ForeignKeyConstraint(["actor_id"], ["users.id"]),
)
@@ -0,0 +1,41 @@
"""migrate ae seriousness cn to roman numerals
Revision ID: 20260116_06
Revises: 20260116_05
Create Date: 2026-01-16 18:30:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "20260116_06"
down_revision: Union[str, None] = "20260116_05"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
UPDATE adverse_events
SET seriousness = CASE
WHEN TRIM(seriousness) IN ('轻微', '轻度') THEN 'I'
WHEN TRIM(seriousness) = '一般' THEN 'II'
WHEN TRIM(seriousness) = '中度' THEN 'III'
WHEN TRIM(seriousness) IN ('严重', '重度') THEN 'IV'
WHEN TRIM(seriousness) = '危重' THEN 'V'
ELSE seriousness
END
"""
)
)
def downgrade() -> None:
pass
@@ -0,0 +1,41 @@
"""migrate ae seriousness enum strings to roman numerals
Revision ID: 20260116_07
Revises: 20260116_06
Create Date: 2026-01-16 19:00:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "20260116_07"
down_revision: Union[str, None] = "20260116_06"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
UPDATE adverse_events
SET seriousness = CASE
WHEN TRIM(seriousness) = 'AESERIOUSNESS.I' THEN 'I'
WHEN TRIM(seriousness) = 'AESERIOUSNESS.II' THEN 'II'
WHEN TRIM(seriousness) = 'AESERIOUSNESS.III' THEN 'III'
WHEN TRIM(seriousness) = 'AESERIOUSNESS.IV' THEN 'IV'
WHEN TRIM(seriousness) = 'AESERIOUSNESS.V' THEN 'V'
ELSE seriousness
END
"""
)
)
def downgrade() -> None:
pass
@@ -0,0 +1,41 @@
"""migrate ae seriousness enum strings case-insensitive
Revision ID: 20260116_08
Revises: 20260116_07
Create Date: 2026-01-16 19:10:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = "20260116_08"
down_revision: Union[str, None] = "20260116_07"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
UPDATE adverse_events
SET seriousness = CASE
WHEN UPPER(TRIM(seriousness)) = 'AESERIOUSNESS.I' THEN 'I'
WHEN UPPER(TRIM(seriousness)) = 'AESERIOUSNESS.II' THEN 'II'
WHEN UPPER(TRIM(seriousness)) = 'AESERIOUSNESS.III' THEN 'III'
WHEN UPPER(TRIM(seriousness)) = 'AESERIOUSNESS.IV' THEN 'IV'
WHEN UPPER(TRIM(seriousness)) = 'AESERIOUSNESS.V' THEN 'V'
ELSE seriousness
END
"""
)
)
def downgrade() -> None:
pass