"""Add CBT tables Revision ID: 002 Revises: 001 Create Date: 2023-10-15 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision: str = '002' down_revision: Union[str, None] = '001' branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # Create exam table op.create_table( 'exam', sa.Column('id', sa.Integer(), nullable=False), sa.Column('title', sa.String(length=200), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('course_id', sa.Integer(), nullable=False), sa.Column('duration_minutes', sa.Integer(), nullable=True, default=60), sa.Column('passing_score', sa.Float(), nullable=True, default=50.0), sa.Column('is_active', sa.Boolean(), nullable=True, default=True), sa.Column('is_randomized', sa.Boolean(), nullable=True, default=False), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('start_time', sa.DateTime(), nullable=True), sa.Column('end_time', sa.DateTime(), nullable=True), sa.Column('created_by', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['course_id'], ['course.id'], ), sa.ForeignKeyConstraint(['created_by'], ['user.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_exam_id'), 'exam', ['id'], unique=False) # Create question table op.create_table( 'question', sa.Column('id', sa.Integer(), nullable=False), sa.Column('exam_id', sa.Integer(), nullable=False), sa.Column('text', sa.Text(), nullable=False), sa.Column('question_type', sa.Enum('MULTIPLE_CHOICE', 'TRUE_FALSE', 'SHORT_ANSWER', 'ESSAY', name='questiontype'), nullable=False), sa.Column('points', sa.Float(), nullable=True), sa.Column('image_url', sa.String(length=255), nullable=True), sa.Column('solution', sa.Text(), nullable=True), sa.ForeignKeyConstraint(['exam_id'], ['exam.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_question_id'), 'question', ['id'], unique=False) # Create question_option table op.create_table( 'question_option', sa.Column('id', sa.Integer(), nullable=False), sa.Column('question_id', sa.Integer(), nullable=False), sa.Column('text', sa.Text(), nullable=False), sa.Column('is_correct', sa.Boolean(), nullable=True, default=False), sa.ForeignKeyConstraint(['question_id'], ['question.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_question_option_id'), 'question_option', ['id'], unique=False) # Create exam_result table op.create_table( 'exam_result', sa.Column('id', sa.Integer(), nullable=False), sa.Column('exam_id', sa.Integer(), nullable=False), sa.Column('student_id', sa.Integer(), nullable=False), sa.Column('score', sa.Float(), nullable=True), sa.Column('max_score', sa.Float(), nullable=True), sa.Column('started_at', sa.DateTime(), nullable=True), sa.Column('completed_at', sa.DateTime(), nullable=True), sa.Column('is_completed', sa.Boolean(), nullable=True, default=False), sa.Column('remarks', sa.Text(), nullable=True), sa.ForeignKeyConstraint(['exam_id'], ['exam.id'], ), sa.ForeignKeyConstraint(['student_id'], ['student.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_exam_result_id'), 'exam_result', ['id'], unique=False) # Create student_answer table op.create_table( 'student_answer', sa.Column('id', sa.Integer(), nullable=False), sa.Column('exam_result_id', sa.Integer(), nullable=False), sa.Column('question_id', sa.Integer(), nullable=False), sa.Column('selected_option_id', sa.Integer(), nullable=True), sa.Column('text_answer', sa.Text(), nullable=True), sa.Column('is_correct', sa.Boolean(), nullable=True), sa.Column('points_earned', sa.Float(), nullable=True, default=0.0), sa.ForeignKeyConstraint(['exam_result_id'], ['exam_result.id'], ), sa.ForeignKeyConstraint(['question_id'], ['question.id'], ), sa.ForeignKeyConstraint(['selected_option_id'], ['question_option.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_student_answer_id'), 'student_answer', ['id'], unique=False) def downgrade() -> None: # Drop tables in reverse order of creation op.drop_index(op.f('ix_student_answer_id'), table_name='student_answer') op.drop_table('student_answer') op.drop_index(op.f('ix_exam_result_id'), table_name='exam_result') op.drop_table('exam_result') op.drop_index(op.f('ix_question_option_id'), table_name='question_option') op.drop_table('question_option') op.drop_index(op.f('ix_question_id'), table_name='question') op.drop_table('question') op.drop_index(op.f('ix_exam_id'), table_name='exam') op.drop_table('exam') # Drop the enum type op.execute('DROP TYPE questiontype')