Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions api/db/repositories.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ def create_template(session: Session, template: Template) -> Template:
def get_template(session: Session, template_id: int) -> Template | None:
return session.get(Template, template_id)


def get_templates_by_ids(session: Session, template_ids: list[int]) -> list[Template]:
if not template_ids:
return []
statement = select(Template).where(Template.id.in_(template_ids))
return list(session.exec(statement).all())

Comment on lines +19 to +20
# Forms
def create_form(session: Session, form: FormSubmission) -> FormSubmission:
session.add(form)
Expand Down
2 changes: 2 additions & 0 deletions api/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from fastapi import FastAPI
from api.routes import templates, forms
from api.errors.handlers import register_exception_handlers

app = FastAPI()
register_exception_handlers(app)

app.include_router(templates.router)
app.include_router(forms.router)
47 changes: 45 additions & 2 deletions api/routes/forms.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import os

from fastapi import APIRouter, Depends
from fastapi.responses import FileResponse
from sqlmodel import Session
from api.deps import get_db
from api.schemas.forms import FormFill, FormFillResponse
from api.db.repositories import create_form, get_template
from api.schemas.forms import FormBatchFill, FormBatchFillResponse, FormFill, FormFillResponse
from api.db.repositories import create_form, get_template, get_templates_by_ids
from api.db.models import FormSubmission
from api.errors.base import AppError
from src.controller import Controller
Expand All @@ -23,3 +26,43 @@ def fill_form(form: FormFill, db: Session = Depends(get_db)):
return create_form(db, submission)


@router.post("/fill-batch", response_model=FormBatchFillResponse)
def fill_forms_batch(form: FormBatchFill, db: Session = Depends(get_db)):
templates = get_templates_by_ids(db, form.template_ids)
if not templates:
raise AppError("No templates found for provided template_ids", status_code=404)

template_ids_found = {tpl.id for tpl in templates}
template_ids_missing = [tid for tid in form.template_ids if tid not in template_ids_found]
if template_ids_missing:
raise AppError(
f"Template(s) not found: {template_ids_missing}",
status_code=404,
)

controller = Controller()
batch_result = controller.fill_multiple_forms(
incident_record=form.incident_record,
templates=templates,
)

batch_id = batch_result["batch_id"]
return {
**batch_result,
"download_url": f"/forms/batch-download/{batch_id}",
}


@router.get("/batch-download/{batch_id}")
def download_batch_package(batch_id: str):
zip_path = os.path.join("src", "outputs", "batches", f"{batch_id}.zip")
if not os.path.exists(zip_path):
raise AppError("Batch package not found", status_code=404)

return FileResponse(
path=zip_path,
media_type="application/zip",
filename=f"{batch_id}.zip",
)
Comment on lines +56 to +66


37 changes: 36 additions & 1 deletion api/schemas/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,39 @@ class FormFillResponse(BaseModel):
output_pdf_path: str

class Config:
from_attributes = True
from_attributes = True


class BatchTemplateMappingReport(BaseModel):
compatible: bool
missing_fields: list[str]
extra_fields: list[str]
unmapped_fields: list[str]
type_mismatches: dict[str, str]
dependency_violations: list[list[str] | tuple[str, str]]
warnings: list[str]
matched_fields: list[str]


class BatchTemplateResult(BaseModel):
template_id: int
template_name: str
status: str
output_pdf_path: str | None
error: str | None
mapping_report: BatchTemplateMappingReport


class FormBatchFill(BaseModel):
template_ids: list[int]
incident_record: dict


class FormBatchFillResponse(BaseModel):
batch_id: str
total_templates: int
successful_count: int
failed_count: int
package_zip_path: str
download_url: str
results: list[BatchTemplateResult]
Comment on lines +43 to +50
Loading
Loading