From 3d6daec561550036d97b8507a86591ce41888221 Mon Sep 17 00:00:00 2001 From: John Lancaster <32917998+jsl12@users.noreply.github.com> Date: Thu, 30 Jul 2026 21:10:13 -0500 Subject: [PATCH] moved models to db pkg --- src/transcription/{ => db}/models.py | 0 src/transcription/db/operations.py | 14 +++++--------- src/transcription/services/documents.py | 2 +- src/transcription/services/jobs.py | 12 ++++-------- src/transcription/services/store.py | 6 +++--- src/transcription/services/transcription.py | 6 +++--- src/transcription/services/workflows.py | 6 +++--- .../ui/components/document_panzoom.py | 2 +- src/transcription/ui/components/job_detail.py | 6 +++--- src/transcription/ui/components/transcript.py | 4 ++-- src/transcription/ui/pages/jobs_page.py | 6 +++--- tests/integration/test_pipeline_flow.py | 4 ++-- tests/services/test_job_service.py | 8 ++++---- tests/services/test_transcription_service.py | 8 ++++---- tests/services/test_workflows_reliability.py | 8 ++++---- tests/test_models.py | 10 +++++----- tests/ui/conftest.py | 10 +++++----- tests/ui/test_jobs_page.py | 2 +- 18 files changed, 53 insertions(+), 61 deletions(-) rename src/transcription/{ => db}/models.py (100%) diff --git a/src/transcription/models.py b/src/transcription/db/models.py similarity index 100% rename from src/transcription/models.py rename to src/transcription/db/models.py diff --git a/src/transcription/db/operations.py b/src/transcription/db/operations.py index 8c8fc78..4be28da 100644 --- a/src/transcription/db/operations.py +++ b/src/transcription/db/operations.py @@ -10,8 +10,8 @@ from sqlmodel import SQLModel from sqlmodel import select from sqlmodel.ext.asyncio.session import AsyncSession -from ..models import Job -from ..models import JobStatus +from .models import Job +from .models import JobStatus from .runtime import get_engine logger = logging.getLogger(__name__) @@ -31,7 +31,7 @@ async def get_next_queued_job(*, session: AsyncSession) -> Job | None: async def create_all(*, engine: AsyncEngine | None = None) -> None: """Create all tables on the selected engine.""" # Import models so SQLModel metadata is fully registered before bootstrap. - from transcription import models as _models # noqa: F401 + from transcription.db import models as _models # noqa: F401 active_engine = engine or get_engine() async with active_engine.begin() as connection: @@ -68,12 +68,8 @@ def _ensure_sqlite_compat_columns(connection: Connection) -> None: break if not has_unique_source: connection.execute( - text( - "CREATE UNIQUE INDEX IF NOT EXISTS " - "ux_revision_source_id ON revision(source_id)" - ) + text("CREATE UNIQUE INDEX IF NOT EXISTS ux_revision_source_id ON revision(source_id)") ) logger.warning( - "Applied SQLite compatibility schema patch " - "table=revision unique_index=ux_revision_source_id" + "Applied SQLite compatibility schema patch table=revision unique_index=ux_revision_source_id" ) diff --git a/src/transcription/services/documents.py b/src/transcription/services/documents.py index d67a94d..6b5f05c 100644 --- a/src/transcription/services/documents.py +++ b/src/transcription/services/documents.py @@ -9,9 +9,9 @@ from sqlalchemy.orm import selectinload from sqlmodel import select from sqlmodel.ext.asyncio.session import AsyncSession +from ..db.models import Document from ..errors import AppError from ..errors import ErrorCategory -from ..models import Document from .base import ServiceBase logger = logging.getLogger(__name__) diff --git a/src/transcription/services/jobs.py b/src/transcription/services/jobs.py index 3fc6126..a0eabff 100644 --- a/src/transcription/services/jobs.py +++ b/src/transcription/services/jobs.py @@ -7,9 +7,9 @@ from sqlalchemy.orm import selectinload from sqlmodel import select from sqlmodel.ext.asyncio.session import AsyncSession -from ..models import Job -from ..models import JobStatus -from ..models import Source +from ..db.models import Job +from ..db.models import JobStatus +from ..db.models import Source from .base import ServiceBase @@ -170,11 +170,7 @@ class JobService(ServiceBase): ``stale_before`` are considered stale and re-queued. """ async with self._session_scope(session) as _session: - query = ( - select(Job) - .where(Job.status == JobStatus.PROCESSING) - .where(Job.date_updated < stale_before) - ) + query = select(Job).where(Job.status == JobStatus.PROCESSING).where(Job.date_updated < stale_before) stale_jobs = (await _session.exec(query)).all() if not stale_jobs: return 0 diff --git a/src/transcription/services/store.py b/src/transcription/services/store.py index 95eb293..21e4fc0 100644 --- a/src/transcription/services/store.py +++ b/src/transcription/services/store.py @@ -11,9 +11,9 @@ from transcription.config import get_settings from transcription.errors import AppError from transcription.errors import ErrorCategory -from ..models import Document -from ..models import Job -from ..models import Source +from ..db.models import Document +from ..db.models import Job +from ..db.models import Source from .documents import UploadJobResult logger = logging.getLogger(__name__) diff --git a/src/transcription/services/transcription.py b/src/transcription/services/transcription.py index 9475c8a..f26b5e3 100644 --- a/src/transcription/services/transcription.py +++ b/src/transcription/services/transcription.py @@ -18,11 +18,11 @@ from sqlmodel.ext.asyncio.session import AsyncSession from transcription.config import Settings from transcription.config import get_settings +from transcription.db.models import Job +from transcription.db.models import Revision +from transcription.db.models import Source from transcription.errors import AppError from transcription.errors import ErrorCategory -from transcription.models import Job -from transcription.models import Revision -from transcription.models import Source from transcription.providers import ProviderAuthError from transcription.providers import ProviderError from transcription.providers import ProviderResponseError diff --git a/src/transcription/services/workflows.py b/src/transcription/services/workflows.py index 306917a..611ecd0 100644 --- a/src/transcription/services/workflows.py +++ b/src/transcription/services/workflows.py @@ -5,13 +5,13 @@ from sqlmodel.ext.asyncio.session import AsyncSession from ..config import Settings from ..config import get_settings +from ..db.models import Job +from ..db.models import JobStatus +from ..db.models import Source from ..errors import AppError from ..errors import ErrorCategory from ..errors import classify_unexpected_error from ..errors import format_error_detail -from ..models import Job -from ..models import JobStatus -from ..models import Source from ..providers import TranscriptionResult from . import ServiceBundle from .transcription import DEFAULT_PROMPT_FILE diff --git a/src/transcription/ui/components/document_panzoom.py b/src/transcription/ui/components/document_panzoom.py index 9d3695c..1bd9bb6 100644 --- a/src/transcription/ui/components/document_panzoom.py +++ b/src/transcription/ui/components/document_panzoom.py @@ -10,7 +10,7 @@ from uuid import uuid4 from nicegui import ui from transcription.config import get_settings -from transcription.models import Source +from transcription.db.models import Source PANGOZOOM_CDN_URL = "https://unpkg.com/@panzoom/panzoom@4.6.2/dist/panzoom.min.js" UPLOADS_URL_PREFIX = "/uploads" diff --git a/src/transcription/ui/components/job_detail.py b/src/transcription/ui/components/job_detail.py index e7d18e3..3ae1e5d 100644 --- a/src/transcription/ui/components/job_detail.py +++ b/src/transcription/ui/components/job_detail.py @@ -6,9 +6,9 @@ import logging from nicegui import ui -from transcription.models import Job -from transcription.models import Revision -from transcription.models import Source +from transcription.db.models import Job +from transcription.db.models import Revision +from transcription.db.models import Source from transcription.ui.components.document_panzoom import render_document_panzoom from transcription.ui.components.transcript import render_original_transcription_card from transcription.ui.components.transcript import render_revision_row diff --git a/src/transcription/ui/components/transcript.py b/src/transcription/ui/components/transcript.py index 6ddf3c6..82bc667 100644 --- a/src/transcription/ui/components/transcript.py +++ b/src/transcription/ui/components/transcript.py @@ -9,8 +9,8 @@ from typing import Any from nicegui import ui -from transcription.models import Job -from transcription.models import Revision +from transcription.db.models import Job +from transcription.db.models import Revision type RevisionAction = Callable[[Revision], Awaitable[None] | None] diff --git a/src/transcription/ui/pages/jobs_page.py b/src/transcription/ui/pages/jobs_page.py index 5b4ee34..3d222b2 100644 --- a/src/transcription/ui/pages/jobs_page.py +++ b/src/transcription/ui/pages/jobs_page.py @@ -8,9 +8,9 @@ from fastapi import Request from nicegui import ui from transcription.app_state import resolve_session_factory -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Source +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Source from transcription.services.jobs import JobService from transcription.services.transcription import TranscriptionService from transcription.ui.components.app_shell import render_navigation_header diff --git a/tests/integration/test_pipeline_flow.py b/tests/integration/test_pipeline_flow.py index a528407..7303d30 100644 --- a/tests/integration/test_pipeline_flow.py +++ b/tests/integration/test_pipeline_flow.py @@ -5,8 +5,8 @@ from pathlib import Path import pytest from transcription.config import Settings -from transcription.models import Job -from transcription.models import JobStatus +from transcription.db.models import Job +from transcription.db.models import JobStatus from transcription.providers.base import TranscriptionResult from transcription.services.store import create_upload_job from transcription.worker import process_next_queued_job diff --git a/tests/services/test_job_service.py b/tests/services/test_job_service.py index 9fae305..5acd0e4 100644 --- a/tests/services/test_job_service.py +++ b/tests/services/test_job_service.py @@ -2,10 +2,10 @@ from uuid import uuid4 import pytest -from transcription.models import Document -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Source +from transcription.db.models import Document +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Source from transcription.services.documents import DocumentService from transcription.services.jobs import JobService diff --git a/tests/services/test_transcription_service.py b/tests/services/test_transcription_service.py index 86cb962..2ffd85b 100644 --- a/tests/services/test_transcription_service.py +++ b/tests/services/test_transcription_service.py @@ -4,10 +4,10 @@ from uuid import uuid4 import pytest -from transcription.models import Document -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Source +from transcription.db.models import Document +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Source from transcription.services.documents import DocumentService from transcription.services.jobs import JobService from transcription.services.transcription import TranscriptionService diff --git a/tests/services/test_workflows_reliability.py b/tests/services/test_workflows_reliability.py index a370125..e52e018 100644 --- a/tests/services/test_workflows_reliability.py +++ b/tests/services/test_workflows_reliability.py @@ -6,10 +6,10 @@ from uuid import uuid4 import pytest from transcription.config import Settings -from transcription.models import Document -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Source +from transcription.db.models import Document +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Source from transcription.services import ServiceBundle from transcription.services.workflows import process_queued_job diff --git a/tests/test_models.py b/tests/test_models.py index 111a5fe..480649e 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -5,11 +5,11 @@ from uuid import UUID import pytest from sqlalchemy.exc import IntegrityError -from transcription.models import Document -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Revision -from transcription.models import Source +from transcription.db.models import Document +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Revision +from transcription.db.models import Source def _make_document(**overrides) -> Document: diff --git a/tests/ui/conftest.py b/tests/ui/conftest.py index 530fa07..5b288b0 100644 --- a/tests/ui/conftest.py +++ b/tests/ui/conftest.py @@ -18,11 +18,11 @@ from transcription.config import _settings from transcription.db import create_all from transcription.db import get_session from transcription.db import initialize_database_runtime -from transcription.models import Document -from transcription.models import Job -from transcription.models import JobStatus -from transcription.models import Revision -from transcription.models import Source +from transcription.db.models import Document +from transcription.db.models import Job +from transcription.db.models import JobStatus +from transcription.db.models import Revision +from transcription.db.models import Source RevisionSeed = str diff --git a/tests/ui/test_jobs_page.py b/tests/ui/test_jobs_page.py index eb4223b..f28259d 100644 --- a/tests/ui/test_jobs_page.py +++ b/tests/ui/test_jobs_page.py @@ -5,7 +5,7 @@ from uuid import uuid4 import pytest -from transcription.models import JobStatus +from transcription.db.models import JobStatus @pytest.mark.integration