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

72 lines
3.0 KiB
Python

from fastapi import HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from inbox.models import Inbox
from job.candidate.models import Activity
from job.activity.serializers import serialize_activity
class ActivityLog:
def __init__(self,session:AsyncSession):
self.session=session
async def _resolve_inbox(self,payload):
if payload.get("inbox_id") is not None:
row=await Inbox.get_inbox_by_id(self.session,payload["inbox_id"])
if not row:
raise HTTPException(status_code=404,detail="Inbox not found")
return row
if payload.get("message_id"):
row=await Inbox.get_inbox_by_message_id(self.session,payload["message_id"])
if not row:
raise HTTPException(status_code=404,detail="Inbox not found for message_id")
return row
if payload.get("user_id"):
row=await Inbox.get_inbox_by_user_id(self.session,payload["user_id"])
if not row:
raise HTTPException(status_code=404,detail="Inbox not found for user_id")
return row
return None
async def get_activity(self,activity_id=None,inbox_id=None,top=None,skip=0):
if activity_id:
row=await Activity.get_activity_by_id(self.session,activity_id)
if not row:
raise HTTPException(status_code=404,detail="Activity not found")
return serialize_activity(row)
if inbox_id is not None:
rows=await Activity.get_activity_by_inbox(self.session,int(inbox_id))
return [serialize_activity(r) for r in rows]
if top is not None:
return await self.get_activity_feed(top=top,skip=skip)
raise HTTPException(status_code=400,detail="activity_id or inbox_id is required")
async def get_activity_feed(self,top,skip=0):
rows,total=await Activity.get_activity_feed(self.session,top=top,skip=skip)
items=[]
for r in rows:
data=serialize_activity(r)
actor_name=None
if r.inbox_id is not None:
inbox=await Inbox.get_inbox_by_id(self.session,r.inbox_id)
if inbox and getattr(inbox,"user",None):
actor_name=inbox.user.name
data["actor_name"]=actor_name
items.append(data)
return items,total
async def create_activity(self,payload):
link=await self._resolve_inbox(payload)
fields={
"activity_type":payload.get("activity_type") or "",
"activity_status":payload.get("activity_status") or "",
"description":payload.get("description"),
"inbox_id":link.id if link else None,
}
if payload.get("activity_date") is not None:
fields["activity_date"]=payload["activity_date"]
if payload.get("activity_time") is not None:
fields["activity_time"]=payload["activity_time"]
row=await Activity.insert_activity(self.session,fields)
return serialize_activity(row)