"""users: PIN a 4 cifre per login rapido e capoturno (#59) pin_hash (bcrypt, mai in chiaro), contatore errori consecutivi e fine blocco. Revision ID: 017_user_pin Revises: 016_vision_recipe_dir Create Date: 2026-10-07 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = '017_user_pin' down_revision: Union[str, None] = '016_vision_recipe_dir' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # batch: SQLite non sa fare DROP COLUMN nativo su tutte le versioni with op.batch_alter_table('users') as batch: batch.add_column(sa.Column('pin_hash', sa.String(255), nullable=True)) batch.add_column(sa.Column( 'pin_failed_count', sa.Integer(), nullable=False, server_default='0')) batch.add_column(sa.Column('pin_locked_until', sa.DateTime(), nullable=True)) def downgrade() -> None: with op.batch_alter_table('users') as batch: batch.drop_column('pin_locked_until') batch.drop_column('pin_failed_count') batch.drop_column('pin_hash')