Files
tg_bot_language/migrations/versions/20251209_add_mini_stories.py
mamonov.ep f38ff2f18e feat: мини-истории, слово дня, меню практики
- Добавлены мини-истории для чтения с выбором жанра и вопросами
- Кнопка показа/скрытия перевода истории
- Количество вопросов берётся из настроек пользователя
- Слово дня генерируется глобально в 00:00 UTC
- Кнопка "Практика" открывает меню выбора режима
- Убран автоматический create_all при запуске (только миграции)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 15:05:38 +03:00

56 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Add mini_stories table
Revision ID: 20251209_mini_stories
Revises: 20251209_word_of_day
Create Date: 2024-12-09
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision: str = '20251209_mini_stories'
down_revision: Union[str, None] = '20251209_word_of_day'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Удаляем старую таблицу и enum если существуют
op.execute("DROP TABLE IF EXISTS mini_stories CASCADE")
op.execute("DROP TYPE IF EXISTS storygenre CASCADE")
# Создаём enum через raw SQL
op.execute("CREATE TYPE storygenre AS ENUM ('dialogue', 'news', 'story', 'letter', 'recipe')")
# Создаём таблицу используя postgresql.ENUM с create_type=False
story_genre = postgresql.ENUM('dialogue', 'news', 'story', 'letter', 'recipe', name='storygenre', create_type=False)
op.create_table(
'mini_stories',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=False),
sa.Column('title', sa.String(length=255), nullable=False),
sa.Column('content', sa.String(length=5000), nullable=False),
sa.Column('genre', story_genre, nullable=False),
sa.Column('learning_lang', sa.String(length=5), nullable=False),
sa.Column('level', sa.String(length=5), nullable=False),
sa.Column('word_count', sa.Integer(), nullable=True, server_default='0'),
sa.Column('vocabulary', sa.JSON(), nullable=True),
sa.Column('questions', sa.JSON(), nullable=True),
sa.Column('is_completed', sa.Boolean(), nullable=True, server_default='false'),
sa.Column('correct_answers', sa.Integer(), nullable=True, server_default='0'),
sa.Column('created_at', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index('ix_mini_stories_user_id', 'mini_stories', ['user_id'], unique=False)
def downgrade() -> None:
op.drop_index('ix_mini_stories_user_id', table_name='mini_stories')
op.drop_table('mini_stories')
op.execute("DROP TYPE IF EXISTS storygenre CASCADE")