from typing import Optional from uuid import UUID, uuid4 from sqlalchemy import Text, UniqueConstraint from sqlmodel import Column, Field, Relationship, SQLModel from langflow.services.database.models.flow.model import Flow, FlowRead from langflow.services.database.models.user.model import User class FolderBase(SQLModel): name: str = Field(index=True) description: str | None = Field(default=None, sa_column=Column(Text)) class Folder(FolderBase, table=True): # type: ignore[call-arg] id: UUID | None = Field(default_factory=uuid4, primary_key=True) parent_id: UUID | None = Field(default=None, foreign_key="folder.id") parent: Optional["Folder"] = Relationship( back_populates="children", sa_relationship_kwargs={"remote_side": "Folder.id"}, ) children: list["Folder"] = Relationship(back_populates="parent") user_id: UUID | None = Field(default=None, foreign_key="user.id") user: User = Relationship(back_populates="folders") flows: list[Flow] = Relationship( back_populates="folder", sa_relationship_kwargs={"cascade": "all, delete, delete-orphan"} ) __table_args__ = (UniqueConstraint("user_id", "name", name="unique_folder_name"),) class FolderCreate(FolderBase): components_list: list[UUID] | None = None flows_list: list[UUID] | None = None class FolderRead(FolderBase): id: UUID parent_id: UUID | None = Field() class FolderReadWithFlows(FolderBase): id: UUID parent_id: UUID | None = Field() flows: list[FlowRead] = Field(default=[]) class FolderUpdate(SQLModel): name: str | None = None description: str | None = None parent_id: UUID | None = None components: list[UUID] = Field(default_factory=list) flows: list[UUID] = Field(default_factory=list)