HR-ATS-Portal/backend/job/feedback/views.py

64 lines
2.6 KiB
Python

from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from sqlmodel import select
from job.candidate.models import Feedback
from job.feedback.serializers import serialize_feedback
class FeedbackView:
def __init__(self,session:AsyncSession):
self.session=session
async def _load(self,record_id):
uid=Feedback._as_uuid(record_id)
if uid is None:
return None
result=await self.session.execute(
select(Feedback).options(selectinload(Feedback.user)).where(Feedback.id==uid)
)
return result.scalars().first()
async def get_feedback(self,feedback_id=None,inbox_id=None):
if feedback_id:
row=await self._load(feedback_id)
if not row:
raise HTTPException(status_code=404,detail="Feedback not found")
return serialize_feedback(row)
if inbox_id is None:
raise HTTPException(status_code=400,detail="feedback_id or inbox_id is required")
result=await self.session.execute(
select(Feedback)
.options(selectinload(Feedback.user))
.where(Feedback.inbox_id==int(inbox_id))
.order_by(Feedback.created_at.desc())
)
return [serialize_feedback(r) for r in result.scalars().all()]
async def create_feedback(self,payload,current_user):
fields={
"review":payload.get("review") or "",
"financial_status":payload.get("financial_status") or "",
"score":payload.get("score") if payload.get("score") is not None else 0.0,
"note":payload.get("note"),
"inbox_id":payload.get("inbox_id"),
"reviewed_by":payload.get("reviewed_by") or (
current_user.get("id") if isinstance(current_user,dict) else None
),
}
row=await Feedback.insert_feedback(self.session,fields)
row=await self._load(row.id)
return serialize_feedback(row)
async def update_feedback(self,feedback_id,payload):
allowed=("review","financial_status","score","note","inbox_id","reviewed_by")
fields={k:v for k,v in payload.items() if v is not None and k in allowed}
if not fields:
raise HTTPException(status_code=400,detail="No fields to update")
row=await Feedback.update_feedback(self.session,feedback_id,fields)
if not row:
raise HTTPException(status_code=404,detail="Feedback not found")
row=await self._load(row.id)
return serialize_feedback(row)