def serialize_task(row, users_by_id=None) -> dict: """`users_by_id` is one batched Users lookup done in views — never a lazy per-row load. Assignee name/role ride along so the screen can render the real user without a second request.""" users_by_id = users_by_id or {} assignee = users_by_id.get(row.assignee_id) return { "id": str(row.id) if row.id else None, "title": row.title, "status": row.status, "priority": row.priority, "due_date": row.due_date.isoformat() if row.due_date else None, "assignee_id": str(row.assignee_id) if row.assignee_id else None, "assignee_name": assignee.name if assignee else None, "assignee_role": assignee.role.role_name if assignee and assignee.role else None, "inbox_id": row.inbox_id, "job_post_id": str(row.job_post_id) if row.job_post_id else None, "created_by": str(row.created_by) if row.created_by else None, "created_at": row.created_at.isoformat() if row.created_at else None, "updated_at": row.updated_at.isoformat() if row.updated_at else None, }