Files
ctms/backend/alembic/versions/20260331_01_cleanup_overview_demo_data.py
T
2026-03-31 11:20:57 +08:00

398 lines
14 KiB
Python

"""cleanup overview demo data
Revision ID: 20260331_01
Revises: 20260302_02
Create Date: 2026-03-31 10:45:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
revision: str = "20260331_01"
down_revision: Union[str, None] = "20260302_02"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
DEMO_FEASIBILITY_CODES = ("PROJ-001", "PROJ-002", "PROJ-003", "PROJ-004", "PROJ-005")
DEMO_ETHICS_CODES = ("EC-001", "EC-002", "EC-003", "EC-004")
DEMO_FINANCE_CONTRACT_CODES = ("CT-001", "CT-002", "CT-003")
DEMO_STUDY_CODE = "DEMO-CTMS"
def upgrade() -> None:
conn = op.get_bind()
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id
FROM startup_feasibility
WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id
FROM startup_ethics
WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id
FROM finance_contracts
WHERE contract_no = ANY(:contract_codes)
AND amount = 500000.0
AND currency = 'CNY'
UNION
SELECT DISTINCT study_id
FROM kickoff_meetings
WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id
FROM subjects
WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
),
candidate_sites AS (
SELECT DISTINCT site_id
FROM startup_feasibility
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT site_id
FROM startup_ethics
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND (
approval_no = ANY(:ethics_codes)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-10'
AND accept_date = DATE '2025-01-15'
AND meeting_date IS NULL
AND approved_date IS NULL
)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-20'
AND accept_date = DATE '2025-01-25'
AND meeting_date IS NULL
AND approved_date IS NULL
)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-30'
AND accept_date = DATE '2025-02-04'
AND meeting_date IS NULL
AND approved_date IS NULL
)
)
UNION
SELECT DISTINCT site_id
FROM kickoff_meetings
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT site_id
FROM subjects
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
UPDATE sites
SET enrollment_target = 0
WHERE id IN (SELECT site_id FROM candidate_sites WHERE site_id IS NOT NULL)
AND enrollment_target IN (40, 50, 60, 70, 80)
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id FROM finance_contracts
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
UNION
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
DELETE FROM subjects
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND subject_no ~ '^S0[1-3]-[0-9]{3}$'
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id FROM finance_contracts
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
UNION
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
DELETE FROM kickoff_meetings
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND attendees::text = '["研究者", "CRA", "PM"]'
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id FROM finance_contracts
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
UNION
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
DELETE FROM finance_contracts
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND contract_no = ANY(:contract_codes)
AND amount = 500000.0
AND currency = 'CNY'
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id FROM finance_contracts
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
UNION
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
DELETE FROM startup_ethics
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND (
approval_no = ANY(:ethics_codes)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-10'
AND accept_date = DATE '2025-01-15'
AND meeting_date IS NULL
AND approved_date IS NULL
)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-20'
AND accept_date = DATE '2025-01-25'
AND meeting_date IS NULL
AND approved_date IS NULL
)
OR (
approval_no IS NULL
AND submit_date = DATE '2025-01-30'
AND accept_date = DATE '2025-02-04'
AND meeting_date IS NULL
AND approved_date IS NULL
)
)
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH candidate_studies AS (
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
UNION
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
UNION
SELECT DISTINCT study_id FROM finance_contracts
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
UNION
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
UNION
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
)
DELETE FROM startup_feasibility
WHERE study_id IN (SELECT study_id FROM candidate_studies)
AND project_no = ANY(:feasibility_codes)
"""
),
{
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
"ethics_codes": list(DEMO_ETHICS_CODES),
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
},
)
conn.execute(
sa.text(
"""
WITH demo_study AS (
SELECT id
FROM studies
WHERE code = :demo_study_code
),
demo_contract_fees AS (
SELECT id
FROM contract_fees
WHERE project_id IN (SELECT id FROM demo_study)
),
demo_special_expenses AS (
SELECT id
FROM special_expenses
WHERE project_id IN (SELECT id FROM demo_study)
)
DELETE FROM fee_attachments
WHERE (
entity_type = 'contract_fee'
AND entity_id IN (SELECT id FROM demo_contract_fees)
) OR (
entity_type = 'special_expense'
AND entity_id IN (SELECT id FROM demo_special_expenses)
) OR (
url IN (
'https://example.com/contract-demo.pdf',
'https://example.com/voucher-demo.pdf',
'https://example.com/invoice-demo.pdf'
)
)
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
conn.execute(
sa.text(
"""
WITH demo_study AS (
SELECT id
FROM studies
WHERE code = :demo_study_code
),
demo_contract_fees AS (
SELECT id
FROM contract_fees
WHERE project_id IN (SELECT id FROM demo_study)
)
DELETE FROM contract_fee_payments
WHERE contract_fee_id IN (SELECT id FROM demo_contract_fees)
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
conn.execute(
sa.text(
"""
DELETE FROM contract_fees
WHERE project_id IN (
SELECT id
FROM studies
WHERE code = :demo_study_code
)
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
conn.execute(
sa.text(
"""
DELETE FROM special_expenses
WHERE project_id IN (
SELECT id
FROM studies
WHERE code = :demo_study_code
)
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
conn.execute(
sa.text(
"""
DELETE FROM sites
WHERE study_id IN (
SELECT id
FROM studies
WHERE code = :demo_study_code
)
AND name LIKE '示例中心 %'
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
conn.execute(
sa.text(
"""
DELETE FROM studies
WHERE code = :demo_study_code
"""
),
{
"demo_study_code": DEMO_STUDY_CODE,
},
)
def downgrade() -> None:
return