"""Passwörter und Tokens an Quellen Revision ID: 0004 Revises: 0003 Erstellt: 2026-10-21 23:05:24.232956 """ from alembic import op import sqlalchemy as sa revision = '0004' down_revision = '0003' branch_labels = None depends_on = None def upgrade() -> None: op.add_column('data_sources', sa.Column('secret', sa.String(length=2000), nullable=True)) op.add_column('data_sources', sa.Column('secret_hint', sa.String(length=10), nullable=False, server_default='')) op.drop_column('data_sources', 'credential_ref') op.add_column('users', sa.Column('password_hash', sa.String(length=200), nullable=True)) op.add_column('users', sa.Column('must_change_password', sa.Boolean(), nullable=False, server_default=sa.false())) op.add_column('users', sa.Column('failed_logins', sa.Integer(), nullable=False, server_default='0')) op.add_column('users', sa.Column('locked_until', sa.DateTime(timezone=True), nullable=True)) op.add_column('users', sa.Column('password_changed', sa.DateTime(timezone=True), nullable=True)) def downgrade() -> None: op.drop_column('users', 'password_changed') op.drop_column('users', 'locked_until') op.drop_column('users', 'failed_logins') op.drop_column('users', 'must_change_password') op.drop_column('users', 'password_hash') op.add_column('data_sources', sa.Column('credential_ref', sa.VARCHAR(length=200), autoincrement=False, nullable=True)) op.drop_column('data_sources', 'secret_hint') op.drop_column('data_sources', 'secret')