Skip to content

Commit ac186a0

Browse files
authored
Merge pull request #587 from chetanr25/alembic_setup
Alembic setup, added job, updated imports
2 parents d74efbc + e763921 commit ac186a0

4 files changed

Lines changed: 72 additions & 16 deletions

File tree

alembic/env.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
from alembic import context
44
from sqlalchemy import engine_from_config, pool
55

6+
from sqlmodel import SQLModel
7+
68
from app.core.config import DATABASE_URL
7-
from app.models.models import SQLModel
8-
from app.models import Template, FormSubmission
9+
from app.models import FormSubmission, Job, Template
910

1011
config = context.config
1112

alembic/versions/001_initial_schema.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Initial schema — Template and FormSubmission tables.
1+
"""Initial schema — Template, FormSubmission, and Job tables.
22
33
Revision ID: 001
44
Revises:
@@ -24,12 +24,7 @@ def upgrade() -> None:
2424
sa.Column("name", sqlmodel.sql.sqltypes.AutoString, nullable=False),
2525
sa.Column("fields", sa.JSON, nullable=False),
2626
sa.Column("pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False),
27-
sa.Column(
28-
"created_at",
29-
sa.DateTime,
30-
nullable=False,
31-
server_default=sa.text("now()"),
32-
),
27+
sa.Column("created_at", sa.DateTime, nullable=False),
3328
)
3429

3530
op.create_table(
@@ -38,15 +33,32 @@ def upgrade() -> None:
3833
sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=False),
3934
sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=False),
4035
sa.Column("output_pdf_path", sqlmodel.sql.sqltypes.AutoString, nullable=False),
41-
sa.Column(
42-
"created_at",
43-
sa.DateTime,
44-
nullable=False,
45-
server_default=sa.text("now()"),
46-
),
36+
sa.Column("created_at", sa.DateTime, nullable=False),
4737
)
4838

39+
op.create_table(
40+
"job",
41+
sa.Column("id", sa.Integer, primary_key=True, autoincrement=True),
42+
sa.Column("job_id", sqlmodel.sql.sqltypes.AutoString, nullable=False),
43+
sa.Column("celery_task_id", sqlmodel.sql.sqltypes.AutoString, nullable=False),
44+
sa.Column("job_type", sqlmodel.sql.sqltypes.AutoString, nullable=False),
45+
sa.Column("template_id", sa.Integer, sa.ForeignKey("template.id"), nullable=True),
46+
sa.Column("input_text", sqlmodel.sql.sqltypes.AutoString, nullable=True),
47+
sa.Column("status", sqlmodel.sql.sqltypes.AutoString, nullable=False),
48+
sa.Column("progress_percent", sa.Integer, nullable=False),
49+
sa.Column("result_url", sqlmodel.sql.sqltypes.AutoString, nullable=True),
50+
sa.Column("error", sa.JSON, nullable=True),
51+
sa.Column("model", sqlmodel.sql.sqltypes.AutoString, nullable=True),
52+
sa.Column("created_at", sa.DateTime, nullable=False),
53+
sa.Column("updated_at", sa.DateTime, nullable=False),
54+
)
55+
op.create_index("ix_job_job_id", "job", ["job_id"], unique=True)
56+
op.create_index("ix_job_celery_task_id", "job", ["celery_task_id"], unique=False)
57+
4958

5059
def downgrade() -> None:
60+
op.drop_index("ix_job_celery_task_id", table_name="job")
61+
op.drop_index("ix_job_job_id", table_name="job")
62+
op.drop_table("job")
5163
op.drop_table("formsubmission")
5264
op.drop_table("template")

app/models/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class Template(SQLModel, table=True):
99
id: int | None = Field(default=None, primary_key=True)
1010
name: str
11-
fields: dict = Field(sa_column=Column(JSON))
11+
fields: dict = Field(sa_column=Column(JSON, nullable=False))
1212
pdf_path: str
1313
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
1414

tests/test_migrations.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def test_upgrade_head(alembic_cfg, alembic_engine):
3535
tables = inspector.get_table_names()
3636
assert "template" in tables
3737
assert "formsubmission" in tables
38+
assert "job" in tables
3839
assert "alembic_version" in tables
3940

4041

@@ -46,6 +47,7 @@ def test_downgrade_base(alembic_cfg, alembic_engine):
4647
tables = inspector.get_table_names()
4748
assert "template" not in tables
4849
assert "formsubmission" not in tables
50+
assert "job" not in tables
4951

5052

5153
def test_round_trip(alembic_cfg, alembic_engine):
@@ -83,3 +85,44 @@ def test_formsubmission_fk(alembic_cfg, alembic_engine):
8385
assert len(fks) == 1
8486
assert fks[0]["referred_table"] == "template"
8587
assert fks[0]["referred_columns"] == ["id"]
88+
89+
90+
def test_job_columns(alembic_cfg, alembic_engine):
91+
command.upgrade(alembic_cfg, "head")
92+
93+
inspector = inspect(alembic_engine)
94+
columns = {c["name"] for c in inspector.get_columns("job")}
95+
assert columns == {
96+
"id",
97+
"job_id",
98+
"celery_task_id",
99+
"job_type",
100+
"template_id",
101+
"input_text",
102+
"status",
103+
"progress_percent",
104+
"result_url",
105+
"error",
106+
"model",
107+
"created_at",
108+
"updated_at",
109+
}
110+
111+
112+
def test_job_indexes(alembic_cfg, alembic_engine):
113+
command.upgrade(alembic_cfg, "head")
114+
115+
inspector = inspect(alembic_engine)
116+
indexes = {ix["name"]: ix for ix in inspector.get_indexes("job")}
117+
assert indexes["ix_job_job_id"]["unique"]
118+
assert not indexes["ix_job_celery_task_id"]["unique"]
119+
120+
121+
def test_job_fk(alembic_cfg, alembic_engine):
122+
command.upgrade(alembic_cfg, "head")
123+
124+
inspector = inspect(alembic_engine)
125+
fks = inspector.get_foreign_keys("job")
126+
assert len(fks) == 1
127+
assert fks[0]["referred_table"] == "template"
128+
assert fks[0]["referred_columns"] == ["id"]

0 commit comments

Comments
 (0)