From c0b2bf669c8050c0d71be61c4e5e3680022a42f7 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 5 Mar 2026 11:27:43 +0000 Subject: [PATCH 1/4] add source and source_id to Task object --- backend/app/db/functions/tasks/Tasks.py | 6 +++++- backend/app/db/models/tasks.py | 22 ++++++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/backend/app/db/functions/tasks/Tasks.py b/backend/app/db/functions/tasks/Tasks.py index 0f987f3b..7ba3dd35 100644 --- a/backend/app/db/functions/tasks/Tasks.py +++ b/backend/app/db/functions/tasks/Tasks.py @@ -11,7 +11,7 @@ from sqlmodel import Session, select from backend.app.db.connection import get_db_session # ---- Models ---- -from backend.app.db.models.tasks import Task, SubTask +from backend.app.db.models.tasks import SourceEnum, Task, SubTask # ============================================================ @@ -268,6 +268,8 @@ class TasksInterface: service: Optional[str] = None, inputs: Optional[Dict[str, Any]] = None, task_only: bool = False, + source: Optional[SourceEnum] = None, + source_id: Optional[str] = None, ): """ Create a new Task record, and an initial SubTask in waiting state. Can also be used to create just @@ -286,6 +288,8 @@ class TasksInterface: status="waiting", job_started=now, job_completed=None, + source=source, + source_id=source_id, ) session.add(task) diff --git a/backend/app/db/models/tasks.py b/backend/app/db/models/tasks.py index cfe18d83..5b9d82c1 100644 --- a/backend/app/db/models/tasks.py +++ b/backend/app/db/models/tasks.py @@ -1,14 +1,25 @@ +import enum from typing import Optional from datetime import datetime from uuid import UUID, uuid4 +from sqlalchemy import Enum +from sqlalchemy.orm import Mapped, mapped_column from sqlmodel import SQLModel, Field, Relationship +class SourceEnum(enum.Enum): # TODO: move to domain? + PORTFOLIO = "portfolio_id" + + class Task(SQLModel, table=True): __tablename__ = "tasks" - id: UUID = Field(default_factory=uuid4, primary_key=True, index=True, ) + id: UUID = Field( + default_factory=uuid4, + primary_key=True, + index=True, + ) task_source: str job_started: Optional[datetime] = None job_completed: Optional[datetime] = None @@ -16,13 +27,20 @@ class Task(SQLModel, table=True): service: Optional[str] = None updated_at: datetime = Field(default_factory=datetime.utcnow) + source: Mapped[Optional[SourceEnum]] = mapped_column(Enum(SourceEnum)) + source_id: Optional[str] = None + sub_tasks: list["SubTask"] = Relationship(back_populates="task") class SubTask(SQLModel, table=True): __tablename__ = "sub_task" - id: UUID = Field(default_factory=uuid4, primary_key=True, index=True, ) + id: UUID = Field( + default_factory=uuid4, + primary_key=True, + index=True, + ) task_id: UUID = Field(foreign_key="tasks.id") job_started: Optional[datetime] = None From 08cf930f911b871e4d642830f341e44b067a170e Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 5 Mar 2026 11:32:54 +0000 Subject: [PATCH 2/4] set source and source id when creating categorisation task --- backend/app/plan/router.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/app/plan/router.py b/backend/app/plan/router.py index cc9fb579..a90c391a 100644 --- a/backend/app/plan/router.py +++ b/backend/app/plan/router.py @@ -9,6 +9,7 @@ import asyncio from datetime import datetime from fastapi import APIRouter, Depends +from backend.app.db.models.tasks import SourceEnum from backend.app.dependencies import validate_token from backend.app.plan.schemas import PlanTriggerRequest from backend.app.config import get_settings @@ -68,6 +69,8 @@ async def trigger_categorisation( service="plan_categorisation", inputs=payload.model_dump(), task_only=True, + source=SourceEnum.PORTFOLIO, + source_id=str(payload.portfolio_id), ) # Dispatch requests to lambdas From 78ff040711c88edd57756ba538aada3c904f7eae Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 5 Mar 2026 11:58:39 +0000 Subject: [PATCH 3/4] correct SQLModel typing --- backend/app/db/models/tasks.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/backend/app/db/models/tasks.py b/backend/app/db/models/tasks.py index 5b9d82c1..6b8b15be 100644 --- a/backend/app/db/models/tasks.py +++ b/backend/app/db/models/tasks.py @@ -3,7 +3,7 @@ from typing import Optional from datetime import datetime from uuid import UUID, uuid4 -from sqlalchemy import Enum +from sqlalchemy import Column, Enum from sqlalchemy.orm import Mapped, mapped_column from sqlmodel import SQLModel, Field, Relationship @@ -27,7 +27,19 @@ class Task(SQLModel, table=True): service: Optional[str] = None updated_at: datetime = Field(default_factory=datetime.utcnow) - source: Mapped[Optional[SourceEnum]] = mapped_column(Enum(SourceEnum)) + # source: Mapped[Optional[SourceEnum]] = mapped_column(Enum(SourceEnum)) <- SQLAlchemy not SQLModel + + source: Optional[SourceEnum] = Field( + default=None, + sa_column=Column( + Enum( + SourceEnum, + name="source", + values_callable=lambda e: [m.value for m in e], + ), + nullable=True, + ), + ) source_id: Optional[str] = None sub_tasks: list["SubTask"] = Relationship(back_populates="task") From f5e4e68a226574bc1f3323f0250d8027552a5d2f Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Thu, 5 Mar 2026 12:03:23 +0000 Subject: [PATCH 4/4] remove unused imports --- backend/app/db/models/tasks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/app/db/models/tasks.py b/backend/app/db/models/tasks.py index 6b8b15be..e97a939f 100644 --- a/backend/app/db/models/tasks.py +++ b/backend/app/db/models/tasks.py @@ -4,7 +4,6 @@ from datetime import datetime from uuid import UUID, uuid4 from sqlalchemy import Column, Enum -from sqlalchemy.orm import Mapped, mapped_column from sqlmodel import SQLModel, Field, Relationship