58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
"""add owner_id to group
|
|
|
|
Revision ID: 36ed70229177
|
|
Revises: b5ace31192c3
|
|
Create Date: 2026-03-28 13:26:31.817104
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = '36ed70229177'
|
|
down_revision: Union[str, Sequence[str], None] = 'b5ace31192c3'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Upgrade schema."""
|
|
# 1. Add column as nullable
|
|
op.add_column('groups', sa.Column('owner_id', sa.UUID(), nullable=True))
|
|
op.create_index(op.f('ix_groups_owner_id'), 'groups', ['owner_id'], unique=False)
|
|
op.create_foreign_key(None, 'groups', 'users', ['owner_id'], ['id'], ondelete='CASCADE')
|
|
|
|
# 2. Update existing groups with an owner (using the first manager or any member)
|
|
op.execute("""
|
|
UPDATE groups g
|
|
SET owner_id = (
|
|
SELECT user_id
|
|
FROM group_members
|
|
WHERE group_id = g.id
|
|
ORDER BY (CASE WHEN role::text = 'MANAGER' THEN 0 ELSE 1 END), user_id
|
|
LIMIT 1
|
|
)
|
|
""")
|
|
|
|
# 3. For any group that still has NULL (unlikely), set to the first user in the system
|
|
op.execute("""
|
|
UPDATE groups
|
|
SET owner_id = (SELECT id FROM users LIMIT 1)
|
|
WHERE owner_id IS NULL
|
|
""")
|
|
|
|
# 4. Set NOT NULL constraint
|
|
op.alter_column('groups', 'owner_id', nullable=False)
|
|
|
|
|
|
def downgrade() -> None:
|
|
"""Downgrade schema."""
|
|
# ### commands auto generated by Alembic - please adjust! ###
|
|
op.drop_constraint(None, 'groups', type_='foreignkey')
|
|
op.drop_index(op.f('ix_groups_owner_id'), table_name='groups')
|
|
op.drop_column('groups', 'owner_id')
|
|
# ### end Alembic commands ###
|