Create/bank pages use AMBOSS-style facets: Exams, Disciplines, Symptoms, Systems, Articles, Saved. Personal question libraries with add-to-library in study modal. Adaptive session shortcuts from performance (including weakest topics). Quiz restart with fresh attempt. Category counts computed with two grouped queries. Migration n7a8b9c0d142. 63 backend and 97 frontend tests pass.
33 lines
1,014 B
Python
33 lines
1,014 B
Python
"""Personal question libraries.
|
|
|
|
Revision ID: n7a8b9c0d142
|
|
Revises: m6a7b8c9d031
|
|
"""
|
|
from alembic import op
|
|
|
|
revision = "n7a8b9c0d142"
|
|
down_revision = "m6a7b8c9d031"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade():
|
|
op.execute("""
|
|
CREATE TABLE IF NOT EXISTS user_collections (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
title VARCHAR(200) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
)""")
|
|
op.execute("""
|
|
CREATE TABLE IF NOT EXISTS user_collection_questions (
|
|
id SERIAL PRIMARY KEY,
|
|
collection_id INTEGER NOT NULL REFERENCES user_collections(id) ON DELETE CASCADE,
|
|
question_id INTEGER NOT NULL REFERENCES questions(id) ON DELETE CASCADE,
|
|
CONSTRAINT uq_collection_question UNIQUE (collection_id, question_id)
|
|
)""")
|
|
|
|
|
|
def downgrade():
|
|
op.execute("DROP TABLE IF EXISTS user_collection_questions")
|
|
op.execute("DROP TABLE IF EXISTS user_collections")
|