def serialize_assessment(row, *, candidate_name=None, job_title=None) -> dict: """`candidate_name` / `job_title` come from one batched lookup in views — never a lazy per-row load. The Assessments table's first two columns are an avatar + name and cannot render off foreign keys alone.""" return { "id": str(row.id) if row.id else None, "inbox_id": row.inbox_id, "manual_upload_candidate_id": ( str(row.manual_upload_candidate_id) if row.manual_upload_candidate_id else None ), "job_post_id": str(row.job_post_id) if row.job_post_id else None, "candidate_name": candidate_name, "job_title": job_title, "assessment_type": row.assessment_type, "assessment_status": row.assessment_status, "score": row.score, "section_scores": list(row.section_scores or []), "duration_minutes": row.duration_minutes, "assigned_at": row.assigned_at.isoformat() if row.assigned_at else None, "due_at": row.due_at.isoformat() if row.due_at else None, "completed_at": row.completed_at.isoformat() if row.completed_at else None, "reminded_at": row.reminded_at.isoformat() if row.reminded_at 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, }