HR-ATS-Portal/backend/job/candidate/serializers.py

70 lines
3.0 KiB
Python

from inbox.models import Inbox
from typing import Any,List,Dict
from job.candidate.plugins import documents_from_message, source_from_message_to
from job.interviews.serializers import serialize_interview
from job.activity.serializers import serialize_activity
from job.feedback.serializers import serialize_feedback
def serialize_candidate_profile(
link:Inbox|List[Inbox]|Dict[str,Any]|List[Dict[str,Any]],
*,
detail:bool=False,
) -> Dict[str,Any]|List[Dict[str,Any]]:
if isinstance(link,list):
return [serialize_candidate_profile(item,detail=detail) for item in link]
if isinstance(link,dict):
return link
user = link.user
message = link.messages
payload = {
"inbox_id": link.id,
"user_id": str(link.user_id) if link.user_id else None,
"name": user.name if user else None,
"email": user.email if user else None,
"is_active": user.is_active if user else None,
"message_id": str(link.message_id) if link.message_id else None,
"created_at": link.created_at.isoformat() if link.created_at else None,
"application_status": message.application_status if message else None,
"experience": message.experience if message else None,
"current_employment": message.current_employment if message else None,
"resume_text": message.resume_text if message else None,
"suggested_job_post_ids": list(message.suggested_job_post_ids or []) if message else [],
"match_summary": message.match_summary if message else None,
"match_reasoning": message.match_reasoning if message else None,
"match_status": message.match_status if message else None,
"match_error": message.match_error if message else None,
"matched_at": message.matched_at.isoformat() if message and message.matched_at else None,
"job_posts": [],
}
if not detail:
return payload
payload.update({
"favorite": link.favorite,
"rating": link.rating,
"phone": message.candidate_phone_number if message else None,
"education": message.candidate_education if message else None,
"currentCompany": message.current_employment if message else None,
"stage": message.application_status if message else None,
"source": source_from_message_to(message.message_to if message else None),
"applied": message.message_received_time if message else None,
"documents": documents_from_message(
message.file_name if message else None,
message.file_path if message else None,
),
"recruiter": None,
"recruiter_id": None,
"job_title": None,
"ai_score": None,
"recommendation": None,
"sub_scores": None,
"interviews": [serialize_interview(r) for r in (link.interviews or [])],
"activity": [serialize_activity(r) for r in (link.activity or [])],
"feedback": [serialize_feedback(r) for r in (link.feedback or [])],
"notes": [],
})
return payload