From f0850ad3bf1f77c765749c4a6d4139d26c38279e Mon Sep 17 00:00:00 2001 From: Kyle Pope Date: Tue, 17 Mar 2026 03:49:28 +0800 Subject: [PATCH] Fix MissingGreenlet in invite_members and assign_users_to_task Both endpoints accessed ORM object IDs after db.commit(), which expires all loaded objects in async SQLAlchemy. Added db.flush() before commit to assign IDs while objects are still live. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/routers/projects.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/app/routers/projects.py b/backend/app/routers/projects.py index 8e8d143..b95b32b 100644 --- a/backend/app/routers/projects.py +++ b/backend/app/routers/projects.py @@ -600,13 +600,13 @@ async def invite_members( source_type="project_member", ) + await db.flush() # Assign IDs before commit (ORM objects expire after commit) + member_ids = [m.id for m in created_members] await db.commit() # Re-fetch with relationships if not created_members: return [] - - member_ids = [m.id for m in created_members] result = await db.execute( select(ProjectMember) .options( @@ -876,13 +876,14 @@ async def assign_users_to_task( source_type="task_assignment", ) + await db.flush() # Assign IDs before commit (ORM objects expire after commit) + assignment_ids = [a.id for a in created] await db.commit() if not created: return [] # Re-fetch with user info - assignment_ids = [a.id for a in created] result = await db.execute( select(ProjectTaskAssignment) .options(selectinload(ProjectTaskAssignment.user))