diff --git a/backend/app/models/project.py b/backend/app/models/project.py index 57e5acc..8fbc169 100644 --- a/backend/app/models/project.py +++ b/backend/app/models/project.py @@ -23,6 +23,6 @@ class Project(Base): updated_at: Mapped[datetime] = mapped_column(default=func.now(), onupdate=func.now()) # Relationships — lazy="raise" to prevent N+1 (mirrors CalendarMember pattern) - tasks: Mapped[List["ProjectTask"]] = relationship(back_populates="project", cascade="all, delete-orphan", lazy="raise") + tasks: Mapped[List["ProjectTask"]] = relationship(back_populates="project", cascade="all, delete-orphan", passive_deletes=True, lazy="raise") todos: Mapped[List["Todo"]] = relationship(back_populates="project", lazy="raise") - members: Mapped[List["ProjectMember"]] = relationship(back_populates="project", cascade="all, delete-orphan", lazy="raise") + members: Mapped[List["ProjectMember"]] = relationship(back_populates="project", cascade="all, delete-orphan", passive_deletes=True, lazy="raise") diff --git a/backend/app/models/project_task.py b/backend/app/models/project_task.py index ad25d27..cb950e0 100644 --- a/backend/app/models/project_task.py +++ b/backend/app/models/project_task.py @@ -36,15 +36,18 @@ class ProjectTask(Base): subtasks: Mapped[List["ProjectTask"]] = sa_relationship( back_populates="parent_task", cascade="all, delete-orphan", + passive_deletes=True, lazy="raise", ) comments: Mapped[List["TaskComment"]] = sa_relationship( back_populates="task", cascade="all, delete-orphan", + passive_deletes=True, lazy="raise", ) assignments: Mapped[List["ProjectTaskAssignment"]] = sa_relationship( back_populates="task", cascade="all, delete-orphan", + passive_deletes=True, lazy="raise", ) diff --git a/frontend/src/components/projects/ProjectDetail.tsx b/frontend/src/components/projects/ProjectDetail.tsx index 6c9dcb3..89d7022 100644 --- a/frontend/src/components/projects/ProjectDetail.tsx +++ b/frontend/src/components/projects/ProjectDetail.tsx @@ -201,6 +201,9 @@ export default function ProjectDetail() { toast.success('Task deleted'); setSelectedTaskId(null); }, + onError: () => { + toast.error('Failed to delete task'); + }, }); const deleteProjectMutation = useMutation({