diff --git a/backend/inbox/app.py b/backend/inbox/app.py index cdd4ed8..8653268 100644 --- a/backend/inbox/app.py +++ b/backend/inbox/app.py @@ -2,6 +2,7 @@ from fastapi import APIRouter,Depends, Query from fastapi.responses import JSONResponse from fastapi import HTTPException from db_setup import get_session +from inbox.enums import Candidate_application_Status from sqlalchemy.ext.asyncio import AsyncSession from inbox.views import Email from users.permissions import PermissionTag, require_permission @@ -115,6 +116,7 @@ async def get_inbox_read_status( @router.get("/inbox/all-applications") async def get_all_applications( record_id: str | None = Query(None), + application_status: Candidate_application_Status = Query(default=Candidate_application_Status.CLOSED), isread: bool = Query(default=True), search: str | None = Query(None), top: int | None = Query(None), @@ -124,6 +126,9 @@ async def get_all_applications( ): try: service=Email(session=session) + if application_status == Candidate_application_Status.PROCESS or application_status==Candidate_application_Status.REJECTED: + items=await service.get_all_applications(top, skip, search, application_status=application_status) + total=await service.count_inbox_messages(search, application_status=application_status) if isread==False: items=await service.get_all_applications(top, skip, search, isread=False) total=await service.count_inbox_messages(search, isread=False) diff --git a/backend/inbox/models.py b/backend/inbox/models.py index 039a3ba..f0074a4 100644 --- a/backend/inbox/models.py +++ b/backend/inbox/models.py @@ -196,15 +196,21 @@ class Inbox_Messages(SQLModel, table=True): @classmethod async def get_inbox_messages( - cls, session: AsyncSession, top: int | None, skip: int, search: str | None, isread: bool=True + cls, session: AsyncSession, top: int | None, skip: int, search: str | None, isread: bool=True, application_status: Candidate_application_Status=Candidate_application_Status.CLOSED ): statement = select(cls).order_by(cls.message_received_time.desc()) if search: statement = statement.where(cls._search_filter(search)) + + if application_status == Candidate_application_Status.PROCESS or application_status==Candidate_application_Status.REJECTED: + statement = statement.where(cls.application_status==application_status) + if skip: statement = statement.offset(skip) + if top is not None: statement = statement.limit(top) + if isread==False: statement = statement.where(cls.message_read==False) result = await session.execute(statement) diff --git a/backend/inbox/plugins.py b/backend/inbox/plugins.py index 5983537..45294fe 100644 --- a/backend/inbox/plugins.py +++ b/backend/inbox/plugins.py @@ -71,11 +71,19 @@ async def fetch_message_read_status(message_id, token=None): def resolve_attachment_path(path_str:str) -> Path: - """Prefer stored path; fall back to basename under decoded_attachments.""" - path=Path(path_str.strip()) + """Prefer stored path; fall back to basename under decoded_attachments. + + Stored paths may be Windows absolutes written by the host API. The Taskiq + worker runs in Linux, where ``Path(r"D:\\...\\file.pdf").name`` is the + whole string (backslash is not a separator), so normalize separators before + taking the basename for the mounted attachments dir. + """ + raw=path_str.strip() + path=Path(raw) if path.is_file(): return path - fallback=_ATTACHMENTS_DIR/path.name + basename=Path(raw.replace("\\","/")).name + fallback=_ATTACHMENTS_DIR/basename if fallback.is_file(): return fallback return path diff --git a/backend/inbox/views.py b/backend/inbox/views.py index 62db458..6b6925c 100644 --- a/backend/inbox/views.py +++ b/backend/inbox/views.py @@ -1,6 +1,7 @@ import logging import httpx,os from fastapi import HTTPException +from backend.inbox.enums import Candidate_application_Status from inbox.models import Inbox_Messages from inbox.file_decoder import decode_attachment from inbox.serializers import serialize_application, serialize_message @@ -91,7 +92,10 @@ class Email: item["files"]=files return item - async def get_all_applications(self,top,skip,search=None,isread:bool=True): + async def get_all_applications(self,top,skip,search=None,isread:bool=True,application_status:Candidate_application_Status=Candidate_application_Status.CLOSED): + + if application_status == Candidate_application_Status.PROCESS or application_status==Candidate_application_Status.REJECTED: + messages=await Inbox_Messages.get_inbox_messages(self.session,top,skip,search,application_status=application_status) if isread==False: messages=await Inbox_Messages.get_inbox_messages(self.session,top,skip,search,isread) else: