Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions huntflow_api_client/entities/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from huntflow_api_client.entities.organization_settings import OrganizationSettings
from huntflow_api_client.entities.production_calendars import ProductionCalendar
from huntflow_api_client.entities.questionary import ApplicantsQuestionary
from huntflow_api_client.entities.recommendation import Recommendation
from huntflow_api_client.entities.regions import Region
from huntflow_api_client.entities.rejection_reason import RejectionReason
from huntflow_api_client.entities.resume import Resume
Expand Down Expand Up @@ -54,6 +55,7 @@
"MultiVacancy",
"OrganizationSettings",
"ProductionCalendar",
"Recommendation",
"Region",
"RejectionReason",
"Resume",
Expand Down
40 changes: 40 additions & 0 deletions huntflow_api_client/entities/recommendation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from typing import Dict, Optional, Union

from huntflow_api_client.entities.base import BaseEntity, ListEntityMixin
from huntflow_api_client.models.consts import RecommendationProcessingStatus
from huntflow_api_client.models.response.recommendation import RecommendationListResponse


class Recommendation(BaseEntity, ListEntityMixin):
async def list(
self,
account_id: int,
vacancy_id: int,
count: int = 30,
processing_status: RecommendationProcessingStatus = RecommendationProcessingStatus.ALL,
next_page_cursor: Optional[str] = None,
) -> RecommendationListResponse:
"""
API method reference
https://api.huntflow.ai/v2/docs#get-/accounts/-account_id-/recommendations/-vacancy_id-

:param account_id: Organization ID
:param vacancy_id: Vacancy ID
:param count: Number of items per page
:param next_page_cursor: Next page cursor
:param processing_status: Get all recommendations or processed/unprocessed only
:return: A list of applicants recommended for a vacancy
"""
params: Dict[str, Union[str, int]]
if next_page_cursor is not None:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сейчас логика с params раздвоена

при передаче next_page_cursor игнорируются count и processing_status
Это норм?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ты прав, по коду сервиса рекомендаций параметр processing_status в любом случае принимается, игнорится только count если есть курсор
recommendation_service/recommendation_service/api/views/recommendation.py:59
поправил

params = {"next_page_cursor": next_page_cursor}
else:
params = {"count": count}
params["processing_status"] = processing_status.value

response = await self._api.request(
"GET",
f"/accounts/{account_id}/recommendations/{vacancy_id}",
params=params,
)
return RecommendationListResponse.model_validate(response.json())
12 changes: 12 additions & 0 deletions huntflow_api_client/models/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,18 @@ class UserControlTaskStatus(str, Enum):
FAILED = "FAILED"


class RecommendationProcessingStatus(str, Enum):
ALL = "ALL"
PROCESSED = "PROCESSED"
UNPROCESSED = "UNPROCESSED"


class RecommendationStatus(str, Enum):
TAKEN = "TAKEN"
TAKEN_OTHER = "TAKEN_OTHER"
DECLINED = "DECLINED"


class InterviewType(str, Enum):
USER = "user"
INTERVIEW = "interview"
2 changes: 1 addition & 1 deletion huntflow_api_client/models/request/resume.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ApplicantResumeUpdateRequest(JsonRequestModel):
account_source: Optional[PositiveInt] = Field(..., description="Resume source ID")
data: Optional[ApplicantResumeUpdateData] = Field(..., description="Resume data")
files: Optional[List[PositiveInt]] = Field(
[],
None,
max_length=1,
description="Upload files<br>" "List of file's ID attached to the applicant resume",
)
34 changes: 34 additions & 0 deletions huntflow_api_client/models/response/recommendation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from datetime import datetime
from typing import List, Optional

from pydantic import BaseModel, Field

from huntflow_api_client.models.consts import RecommendationStatus


class RecommendationItem(BaseModel):
id: int = Field(..., description="Recommendation ID")
vacancy_id: int = Field(..., description="Vacancy ID")
applicant_id: int = Field(..., description="Applicant ID")
rank: int = Field(..., description="Position of the recommendation in the ranking list.")
created_at: datetime = Field(
...,
description="Date and time when the recommendation was created.",
)
updated_at: datetime = Field(
...,
description="Date and time when the recommendation was last updated.",
)
resolved_by_user: Optional[int] = Field(
None,
description="ID of the recruiter who resolved recommendation. null if not processed yet.",
)
status: Optional[RecommendationStatus] = Field(
None,
description="Current status of the recommendation. null if not processed yet.",
)


class RecommendationListResponse(BaseModel):
items: List[RecommendationItem]
next_page_cursor: Optional[str] = None
2 changes: 1 addition & 1 deletion huntflow_api_client/models/response/vacancies.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class VacancyChild(VacancyItem):

class VacancyResponse(VacancyChild):
blocks: Optional[List[VacancyChild]] = Field(
[],
None,
description="Affiliate vacancies if vacancy is a multiple",
)

Expand Down
Loading
Loading