"""Админ-панель: is_admin, источники парсинга, отстойник, сессии админа. Revision ID: 003 Revises: 002 Create Date: 2026-05-30 """ from alembic import op import sqlalchemy as sa revision = "003" down_revision = "002" branch_labels = None depends_on = None def upgrade() -> None: # users.is_admin op.add_column( "users", sa.Column("is_admin", sa.Boolean(), nullable=False, server_default=sa.false()), ) # parse_sources op.create_table( "parse_sources", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("source_type", sa.String(50), nullable=False), sa.Column("name", sa.String(255), nullable=False), sa.Column("query", sa.Text(), nullable=True), sa.Column("lang", sa.String(10), nullable=True), sa.Column("year_from", sa.Integer(), nullable=True), sa.Column("year_to", sa.Integer(), nullable=True), sa.Column("limit", sa.Integer(), nullable=False, server_default="1000"), sa.Column("enabled", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("last_status", sa.String(20), nullable=False, server_default="idle"), sa.Column("last_error", sa.Text(), nullable=True), sa.Column("last_run_at", sa.DateTime(), nullable=True), sa.Column("docs_added", sa.Integer(), nullable=False, server_default="0"), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now()), ) op.create_index("ix_parse_sources_source_type", "parse_sources", ["source_type"]) # staged_works op.create_table( "staged_works", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id"), nullable=True), sa.Column("task_id", sa.String(36), nullable=True), sa.Column("filename", sa.Text(), nullable=True), sa.Column("minio_key", sa.Text(), nullable=True), sa.Column("text_key", sa.Text(), nullable=True), sa.Column("title", sa.Text(), nullable=True), sa.Column("authors", sa.JSON(), nullable=True), sa.Column("year", sa.Integer(), nullable=True), sa.Column("lang", sa.String(10), nullable=True), sa.Column("word_count", sa.Integer(), nullable=True), sa.Column("status", sa.String(20), nullable=False, server_default="pending"), sa.Column("document_id", sa.Integer(), nullable=True), sa.Column("reviewed_by", sa.Integer(), nullable=True), sa.Column("reviewed_at", sa.DateTime(), nullable=True), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now()), ) op.create_index("ix_staged_works_user_id", "staged_works", ["user_id"]) op.create_index("ix_staged_works_task_id", "staged_works", ["task_id"]) op.create_index("ix_staged_works_status", "staged_works", ["status"]) op.create_index("ix_staged_works_created_at", "staged_works", ["created_at"]) # admin_sessions op.create_table( "admin_sessions", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("user_id", sa.Integer(), sa.ForeignKey("users.id"), nullable=False), sa.Column("code", sa.String(64), nullable=False), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now()), sa.Column("expires_at", sa.DateTime(), nullable=False), sa.Column("last_used_at", sa.DateTime(), nullable=True), ) op.create_index("ix_admin_sessions_user_id", "admin_sessions", ["user_id"]) op.create_index("ix_admin_sessions_code", "admin_sessions", ["code"], unique=True) def downgrade() -> None: op.drop_table("admin_sessions") op.drop_table("staged_works") op.drop_index("ix_parse_sources_source_type", table_name="parse_sources") op.drop_table("parse_sources") op.drop_column("users", "is_admin")