Model/backend/app/db/models/tasks.py
Daniel Roth e7785f6b76 Record a rename run's result summary on its sub_task 🟥
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-29 08:58:18 +00:00

76 lines
2.4 KiB
Python

import enum
from typing import Optional
from datetime import datetime
from uuid import UUID, uuid4
from sqlalchemy import Column, Enum
from sqlmodel import SQLModel, Field, Relationship
class SourceEnum(enum.Enum): # TODO: move to domain?
# Legacy mirror of the same `source` pgEnum as domain.tasks.tasks.Source.
# Already drifted — PROPERTY is missing here — so this is not a reliable
# lockstep copy. SHAREPOINT_SITE is added because the backend maps rows
# through this model and an unknown value raises LookupError on read.
PORTFOLIO = "portfolio_id"
HUBSPOT_DEAL = "hubspot_deal_id"
SHAREPOINT_SITE = "sharepoint_site"
class Task(SQLModel, table=True):
__tablename__ = "tasks"
id: UUID = Field(
default_factory=uuid4,
primary_key=True,
index=True,
)
task_source: str
job_started: Optional[datetime] = None
job_completed: Optional[datetime] = None
status: str = Field(default="In Progress")
service: Optional[str] = None
# FE-owned column (Drizzle migration): the app stores a task's original
# request here — for a Modelling Run, the full trigger-run payload
# (ADR-0055). The backend reads it at most; per-batch inputs live on the
# sub_tasks.
inputs: Optional[str] = None
updated_at: datetime = Field(default_factory=datetime.utcnow)
# 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")
class SubTask(SQLModel, table=True):
__tablename__ = "sub_task"
id: UUID = Field(
default_factory=uuid4,
primary_key=True,
index=True,
)
task_id: UUID = Field(foreign_key="tasks.id")
job_started: Optional[datetime] = None
job_completed: Optional[datetime] = None
status: str = Field(default="In Progress")
inputs: Optional[str] = None
outputs: Optional[str] = None
cloud_logs_url: Optional[str] = None
updated_at: datetime = Field(default_factory=datetime.utcnow)
task: Optional["Task"] = Relationship(back_populates="sub_tasks")