From 2d20143f2fe5051d18cdfba8c8e4ef5095b1a876 Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Tue, 23 Jun 2026 22:27:56 +0530 Subject: [PATCH 1/2] fix(db): add job table to migration 001 and align schema with models --- alembic/env.py | 5 ++-- alembic/versions/001_initial_schema.py | 38 +++++++++++++++++--------- app/models/models.py | 2 +- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/alembic/env.py b/alembic/env.py index d503289..06639d8 100644 --- a/alembic/env.py +++ b/alembic/env.py @@ -3,9 +3,10 @@ from alembic import context from sqlalchemy import engine_from_config, pool +from sqlmodel import SQLModel + from app.core.config import DATABASE_URL -from app.models.models import SQLModel -from app.models import Template, FormSubmission +from app.models import FormSubmission, Job, Template config = context.config diff --git a/alembic/versions/001_initial_schema.py b/alembic/versions/001_initial_schema.py index 59faa78..12db15d 100644 --- a/alembic/versions/001_initial_schema.py +++ b/alembic/versions/001_initial_schema.py @@ -1,4 +1,4 @@ -"""Initial schema — Template and FormSubmission tables. +"""Initial schema — Template, FormSubmission, and Job tables. Revision ID: 001 Revises: @@ -24,12 +24,7 @@ def upgrade() -> None: sa.Column("name", sqlmodel.sql.sqltypes.AutoString, nullable=False), sa.Column("fields", sa.JSON, nullable=False), sa.Column("pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False), - sa.Column( - "created_at", - sa.DateTime, - nullable=False, - server_default=sa.text("now()"), - ), + sa.Column("created_at", sa.DateTime, nullable=False), ) op.create_table( @@ -38,15 +33,32 @@ def upgrade() -> None: sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=False), sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=False), sa.Column("output_pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False), - sa.Column( - "created_at", - sa.DateTime, - nullable=False, - server_default=sa.text("now()"), - ), + sa.Column("created_at", sa.DateTime, nullable=False), ) + op.create_table( + "job", + sa.Column("id", sa.Integer, primary_key=True, autoincrement=True), + sa.Column("job_id", sqlmodel.sql.sqltypes.AutoString, nullable=False), + sa.Column("celery_task_id", sqlmodel.sql.sqltypes.AutoString, nullable=False), + sa.Column("job_type", sqlmodel.sql.sqltypes.AutoString, nullable=False), + sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=True), + sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=True), + sa.Column("status", sqlmodel.sql.sqltypes.AutoString, nullable=False), + sa.Column("progress_percent", sa.Integer, nullable=False), + sa.Column("result_url", sqlmodel.sql.sqltypes.AutoString, nullable=True), + sa.Column("error", sa.JSON, nullable=True), + sa.Column("model", sqlmodel.sql.sqltypes.AutoString, nullable=True), + sa.Column("created_at", sa.DateTime, nullable=False), + sa.Column("updated_at", sa.DateTime, nullable=False), + ) + op.create_index("ix_job_job_id", "job", ["job_id"], unique=True) + op.create_index("ix_job_celery_task_id", "job", ["celery_task_id"], unique=False) + def downgrade() -> None: + op.drop_index("ix_job_celery_task_id", table_name="job") + op.drop_index("ix_job_job_id", table_name="job") + op.drop_table("job") op.drop_table("formsubmission") op.drop_table("template") diff --git a/app/models/models.py b/app/models/models.py index c4ddf0b..fea977f 100644 --- a/app/models/models.py +++ b/app/models/models.py @@ -8,7 +8,7 @@ class Template(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) name: str - fields: dict = Field(sa_column=Column(JSON)) + fields: dict = Field(sa_column=Column(JSON, nullable=False)) pdf_path: str created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) From e76392163f1c94971bed528a1b2cc6d3bca83c4d Mon Sep 17 00:00:00 2001 From: chetanr25 Date: Wed, 24 Jun 2026 00:02:13 +0530 Subject: [PATCH 2/2] updated teststo include job tables --- tests/test_migrations.py | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/test_migrations.py b/tests/test_migrations.py index 3e92032..87a6149 100644 --- a/tests/test_migrations.py +++ b/tests/test_migrations.py @@ -35,6 +35,7 @@ def test_upgrade_head(alembic_cfg, alembic_engine): tables = inspector.get_table_names() assert "template" in tables assert "formsubmission" in tables + assert "job" in tables assert "alembic_version" in tables @@ -46,6 +47,7 @@ def test_downgrade_base(alembic_cfg, alembic_engine): tables = inspector.get_table_names() assert "template" not in tables assert "formsubmission" not in tables + assert "job" not in tables def test_round_trip(alembic_cfg, alembic_engine): @@ -83,3 +85,44 @@ def test_formsubmission_fk(alembic_cfg, alembic_engine): assert len(fks) == 1 assert fks[0]["referred_table"] == "template" assert fks[0]["referred_columns"] == ["id"] + + +def test_job_columns(alembic_cfg, alembic_engine): + command.upgrade(alembic_cfg, "head") + + inspector = inspect(alembic_engine) + columns = {c["name"] for c in inspector.get_columns("job")} + assert columns == { + "id", + "job_id", + "celery_task_id", + "job_type", + "template_id", + "input_text", + "status", + "progress_percent", + "result_url", + "error", + "model", + "created_at", + "updated_at", + } + + +def test_job_indexes(alembic_cfg, alembic_engine): + command.upgrade(alembic_cfg, "head") + + inspector = inspect(alembic_engine) + indexes = {ix["name"]: ix for ix in inspector.get_indexes("job")} + assert indexes["ix_job_job_id"]["unique"] + assert not indexes["ix_job_celery_task_id"]["unique"] + + +def test_job_fk(alembic_cfg, alembic_engine): + command.upgrade(alembic_cfg, "head") + + inspector = inspect(alembic_engine) + fks = inspector.get_foreign_keys("job") + assert len(fks) == 1 + assert fks[0]["referred_table"] == "template" + assert fks[0]["referred_columns"] == ["id"]