|
|
from datetime import datetime, timezone |
|
|
from typing import TYPE_CHECKING |
|
|
from uuid import UUID, uuid4 |
|
|
|
|
|
from pydantic import field_serializer, field_validator |
|
|
from sqlmodel import JSON, Column, Field, Relationship, SQLModel |
|
|
|
|
|
if TYPE_CHECKING: |
|
|
from langflow.services.database.models.flow.model import Flow |
|
|
|
|
|
from langflow.utils.util_strings import truncate_long_strings |
|
|
|
|
|
|
|
|
class TransactionBase(SQLModel): |
|
|
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) |
|
|
vertex_id: str = Field(nullable=False) |
|
|
target_id: str | None = Field(default=None) |
|
|
inputs: dict | None = Field(default=None, sa_column=Column(JSON)) |
|
|
outputs: dict | None = Field(default=None, sa_column=Column(JSON)) |
|
|
status: str = Field(nullable=False) |
|
|
error: str | None = Field(default=None) |
|
|
flow_id: UUID = Field(foreign_key="flow.id") |
|
|
|
|
|
|
|
|
class Config: |
|
|
arbitrary_types_allowed = True |
|
|
|
|
|
@field_validator("flow_id", mode="before") |
|
|
@classmethod |
|
|
def validate_flow_id(cls, value): |
|
|
if value is None: |
|
|
return value |
|
|
if isinstance(value, str): |
|
|
value = UUID(value) |
|
|
return value |
|
|
|
|
|
@field_serializer("outputs") |
|
|
def serialize_outputs(self, data) -> dict: |
|
|
return truncate_long_strings(data) |
|
|
|
|
|
|
|
|
class TransactionTable(TransactionBase, table=True): |
|
|
__tablename__ = "transaction" |
|
|
id: UUID | None = Field(default_factory=uuid4, primary_key=True) |
|
|
flow: "Flow" = Relationship(back_populates="transactions") |
|
|
|
|
|
|
|
|
class TransactionReadResponse(TransactionBase): |
|
|
transaction_id: UUID |
|
|
flow_id: UUID |
|
|
|