- shared/ = portable Android-origin sources vendored from deferred/desktop-server (app/build.gradle.kts srcDir repointed; PlaybackController.kt excluded as Android-only) - backend/ = bundled-lite engine (SQLite + inline queue); .venv symlinked from the old checkout, PYTHONPATH pins THIS backend's code over any editable install - repoRoot() resolves this project dir (env SHONAR_REPO still wins); desktop-dev.sh watches shared/ + backend/ - Verified: :app:compileKotlin + :app:test green (23 tests); engine boots on :8010, self-migrates, /healthz ok
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
"""per-recording transcription model + job progress + app settings
|
|
|
|
Revision ID: m8models000001
|
|
Revises: fts0000000001
|
|
|
|
- recordings.transcription_model (nullable; NULL = server default)
|
|
- processing_jobs.stage / processing_jobs.progress (display-only)
|
|
- app_settings table (global default model, …)
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
revision: str = 'm8models000001'
|
|
down_revision: str | None = 'fts0000000001'
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def _json_type() -> sa.types.TypeEngine:
|
|
"""JSONB on PostgreSQL, plain JSON on SQLite (desktop bundled engine)."""
|
|
if op.get_context().dialect.name == "postgresql":
|
|
return postgresql.JSONB(astext_type=sa.Text())
|
|
return sa.JSON()
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column(
|
|
"recordings",
|
|
sa.Column("transcription_model", sa.String(length=32), nullable=True),
|
|
)
|
|
op.add_column(
|
|
"upload_sessions",
|
|
sa.Column("transcription_model", sa.String(length=32), nullable=True),
|
|
)
|
|
op.add_column(
|
|
"processing_jobs",
|
|
sa.Column("stage", sa.String(length=32), nullable=True),
|
|
)
|
|
op.add_column(
|
|
"processing_jobs",
|
|
sa.Column("progress", sa.Integer(), nullable=True),
|
|
)
|
|
op.create_table(
|
|
"app_settings",
|
|
sa.Column("key", sa.String(length=120), nullable=False),
|
|
sa.Column(
|
|
"value",
|
|
_json_type(),
|
|
nullable=False,
|
|
),
|
|
sa.Column("id", sa.Uuid(), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
|
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
|
sa.PrimaryKeyConstraint("id"),
|
|
sa.UniqueConstraint("key"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("app_settings")
|
|
op.drop_column("processing_jobs", "progress")
|
|
op.drop_column("processing_jobs", "stage")
|
|
op.drop_column("upload_sessions", "transcription_model")
|
|
op.drop_column("recordings", "transcription_model")
|