Files
dodo/migrations/versions/0016_recurrence_trigger_modes.py
T
bboysoul 64b8525720
ci / gitleaks (push) Successful in 7s
ci / docker (push) Successful in 3m31s
feat: repeat tasks after completion
2026-09-10 21:21:28 +08:00

47 lines
1.9 KiB
Python

"""add recurrence trigger modes
Revision ID: 0016_recurrence_trigger_modes
Revises: 0015_purge_operations
"""
import sqlalchemy as sa
from alembic import op
revision = "0016_recurrence_trigger_modes"
down_revision = "0015_purge_operations"
branch_labels = None
depends_on = None
def upgrade() -> None:
with op.batch_alter_table("recurrence_templates") as batch_op:
batch_op.alter_column("rrule", existing_type=sa.Text(), nullable=True)
batch_op.add_column(
sa.Column("trigger_mode", sa.String(length=32), nullable=False, server_default="scheduled")
)
batch_op.add_column(sa.Column("after_completion_days", sa.Integer(), nullable=True))
batch_op.add_column(sa.Column("last_completed_at", sa.DateTime(timezone=True), nullable=True))
batch_op.create_check_constraint(
"ck_recurrence_trigger_configuration",
"(trigger_mode = 'scheduled' AND rrule IS NOT NULL AND after_completion_days IS NULL) "
"OR (trigger_mode = 'after_completion' AND rrule IS NULL "
"AND after_completion_days BETWEEN 1 AND 3650)",
)
def downgrade() -> None:
with op.batch_alter_table("recurrence_templates") as batch_op:
batch_op.drop_constraint("ck_recurrence_trigger_configuration", type_="check")
# Legacy schema requires an RRULE. Completion-relative rows have none, so
# preserve them as a compatible daily interval rule before restoring NOT NULL.
op.execute(
"UPDATE recurrence_templates "
"SET rrule = 'FREQ=DAILY;INTERVAL=' || after_completion_days "
"WHERE trigger_mode = 'after_completion' AND rrule IS NULL"
)
with op.batch_alter_table("recurrence_templates") as batch_op:
batch_op.drop_column("last_completed_at")
batch_op.drop_column("after_completion_days")
batch_op.drop_column("trigger_mode")
batch_op.alter_column("rrule", existing_type=sa.Text(), nullable=False)