45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""Phase 10: Customer password-setup workflow
|
|
|
|
Adds three columns to the users table to support the
|
|
invitation-based customer account creation flow:
|
|
|
|
password_set — False until the customer completes set-password
|
|
set_password_token — one-time URL token (64-char hex, nullable)
|
|
set_password_token_expires — UTC expiry datetime (nullable)
|
|
|
|
Revision ID: phase10_customer_password_setup
|
|
Revises: phase9_user_full_name
|
|
Create Date: 2026-04-02
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision = 'phase10_customer_password_setup'
|
|
down_revision = 'phase9_user_full_name'
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
bind = op.get_bind()
|
|
inspector = sa.inspect(bind)
|
|
columns = [c['name'] for c in inspector.get_columns('users')]
|
|
|
|
if 'password_set' not in columns:
|
|
op.add_column('users',
|
|
sa.Column('password_set', sa.Boolean, nullable=False, server_default='1'))
|
|
|
|
if 'set_password_token' not in columns:
|
|
op.add_column('users',
|
|
sa.Column('set_password_token', sa.String(64), nullable=True))
|
|
|
|
if 'set_password_token_expires' not in columns:
|
|
op.add_column('users',
|
|
sa.Column('set_password_token_expires', sa.DateTime, nullable=True))
|
|
|
|
|
|
def downgrade():
|
|
op.drop_column('users', 'set_password_token_expires')
|
|
op.drop_column('users', 'set_password_token')
|
|
op.drop_column('users', 'password_set')
|