From 54155a99c5de1818c2ad9ad2e9f99af01b7d9ca7 Mon Sep 17 00:00:00 2001 From: ruslangilfanov Date: Sat, 16 Aug 2025 19:40:51 +0300 Subject: [PATCH] add SRS migrations and integrate models into application setup --- src/greek_lang/database/app_models.py | 2 + .../versions/20250816_1940_9a2898513cf2_.py | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/greek_lang/database/migrations/versions/20250816_1940_9a2898513cf2_.py diff --git a/src/greek_lang/database/app_models.py b/src/greek_lang/database/app_models.py index e8af15a..8b62824 100644 --- a/src/greek_lang/database/app_models.py +++ b/src/greek_lang/database/app_models.py @@ -5,9 +5,11 @@ def get_app_models_modules() -> list[types.ModuleType]: from greek_lang.glossaries import models as glossaries_models from greek_lang.openai_manager import models as openai_manager_models from greek_lang.users import models as users_models + from greek_lang.srs import models as srs_models return [ glossaries_models, openai_manager_models, users_models, + srs_models, ] diff --git a/src/greek_lang/database/migrations/versions/20250816_1940_9a2898513cf2_.py b/src/greek_lang/database/migrations/versions/20250816_1940_9a2898513cf2_.py new file mode 100644 index 0000000..e5fe758 --- /dev/null +++ b/src/greek_lang/database/migrations/versions/20250816_1940_9a2898513cf2_.py @@ -0,0 +1,71 @@ +"""empty message + +Revision ID: 9a2898513cf2 +Revises: 747797032526 +Create Date: 2025-08-16 19:40:06.376743 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '9a2898513cf2' +down_revision: Union[str, None] = '747797032526' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + """Upgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('srs_progress', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.Column('word_id', sa.BigInteger(), nullable=False), + sa.Column('due_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('interval_days', sa.Integer(), nullable=False), + sa.Column('ease', sa.Float(), nullable=False), + sa.Column('reps', sa.Integer(), nullable=False), + sa.Column('lrn_step', sa.Integer(), nullable=False), + sa.Column('state', sa.Enum('learning', 'review', 'lapsed', name='reviewstate', native_enum=False), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_srs_progress_user_id_users')), + sa.ForeignKeyConstraint(['word_id'], ['glossary_word.id'], name=op.f('fk_srs_progress_word_id_glossary_word')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_srs_progress')), + sa.UniqueConstraint('user_id', 'word_id', name='uq_srs_user_word') + ) + op.create_index(op.f('ix_srs_progress_due_at'), 'srs_progress', ['due_at'], unique=False) + op.create_index(op.f('ix_srs_progress_user_id'), 'srs_progress', ['user_id'], unique=False) + op.create_index(op.f('ix_srs_progress_word_id'), 'srs_progress', ['word_id'], unique=False) + op.create_table('srs_review_log', + sa.Column('id', sa.BigInteger(), nullable=False), + sa.Column('user_id', sa.BigInteger(), nullable=False), + sa.Column('word_id', sa.BigInteger(), nullable=False), + sa.Column('ts', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=False), + sa.Column('grade', sa.Integer(), nullable=False), + sa.Column('prev_interval', sa.Integer(), nullable=False), + sa.Column('new_interval', sa.Integer(), nullable=False), + sa.Column('prev_ease', sa.Float(), nullable=False), + sa.Column('new_ease', sa.Float(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], name=op.f('fk_srs_review_log_user_id_users')), + sa.ForeignKeyConstraint(['word_id'], ['glossary_word.id'], name=op.f('fk_srs_review_log_word_id_glossary_word')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_srs_review_log')) + ) + op.create_index(op.f('ix_srs_review_log_user_id'), 'srs_review_log', ['user_id'], unique=False) + op.create_index(op.f('ix_srs_review_log_word_id'), 'srs_review_log', ['word_id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + """Downgrade schema.""" + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_srs_review_log_word_id'), table_name='srs_review_log') + op.drop_index(op.f('ix_srs_review_log_user_id'), table_name='srs_review_log') + op.drop_table('srs_review_log') + op.drop_index(op.f('ix_srs_progress_word_id'), table_name='srs_progress') + op.drop_index(op.f('ix_srs_progress_user_id'), table_name='srs_progress') + op.drop_index(op.f('ix_srs_progress_due_at'), table_name='srs_progress') + op.drop_table('srs_progress') + # ### end Alembic commands ###