d5279b124f
Storage Persistence Guard / storage-persistence-audit (push) Has been cancelled
Client Quality Gates / Shared client and Web (push) Has been cancelled
Client Quality Gates / macOS Desktop (push) Has been cancelled
Client Quality Gates / Shared client and Web (pull_request) Has been cancelled
Client Quality Gates / macOS Desktop (pull_request) Has been cancelled
Storage Persistence Guard / storage-persistence-audit (pull_request) Has been cancelled
64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""Expand generic notifications and route desktop delivery through them.
|
|
|
|
Revision ID: 20260716_05
|
|
Revises: 20260716_04
|
|
"""
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
|
|
revision = "20260716_05"
|
|
down_revision = "20260716_04"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column(
|
|
"notifications",
|
|
sa.Column("requires_action", sa.Boolean(), nullable=False, server_default=sa.true()),
|
|
)
|
|
op.add_column(
|
|
"notifications",
|
|
sa.Column("due_at", sa.DateTime(timezone=True), nullable=True),
|
|
)
|
|
op.alter_column("desktop_notification_deliveries", "distribution_id", nullable=True)
|
|
op.add_column(
|
|
"desktop_notification_deliveries",
|
|
sa.Column("notification_id", postgresql.UUID(as_uuid=True), nullable=True),
|
|
)
|
|
op.create_foreign_key(
|
|
"fk_desktop_notification_deliveries_notification",
|
|
"desktop_notification_deliveries",
|
|
"notifications",
|
|
["notification_id"],
|
|
["id"],
|
|
ondelete="CASCADE",
|
|
)
|
|
op.create_unique_constraint(
|
|
"uq_desktop_notification_user_notification",
|
|
"desktop_notification_deliveries",
|
|
["user_id", "notification_id"],
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_constraint(
|
|
"uq_desktop_notification_user_notification",
|
|
"desktop_notification_deliveries",
|
|
type_="unique",
|
|
)
|
|
op.drop_constraint(
|
|
"fk_desktop_notification_deliveries_notification",
|
|
"desktop_notification_deliveries",
|
|
type_="foreignkey",
|
|
)
|
|
op.drop_column("desktop_notification_deliveries", "notification_id")
|
|
# Legacy rows always have a distribution id; rows created by the generic delivery path do not.
|
|
op.execute("DELETE FROM desktop_notification_deliveries WHERE distribution_id IS NULL")
|
|
op.alter_column("desktop_notification_deliveries", "distribution_id", nullable=False)
|
|
op.drop_column("notifications", "due_at")
|
|
op.drop_column("notifications", "requires_action")
|