Skip to content

Commit 2dab3ef

Browse files
authored
Merge pull request #102 from huntflow/INT-950
[INT-950] recommendation entity
2 parents 1f12816 + 9a1b5c4 commit 2dab3ef

File tree

9 files changed

+450
-229
lines changed

9 files changed

+450
-229
lines changed

huntflow_api_client/entities/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from huntflow_api_client.entities.organization_settings import OrganizationSettings
1919
from huntflow_api_client.entities.production_calendars import ProductionCalendar
2020
from huntflow_api_client.entities.questionary import ApplicantsQuestionary
21+
from huntflow_api_client.entities.recommendation import Recommendation
2122
from huntflow_api_client.entities.regions import Region
2223
from huntflow_api_client.entities.rejection_reason import RejectionReason
2324
from huntflow_api_client.entities.resume import Resume
@@ -54,6 +55,7 @@
5455
"MultiVacancy",
5556
"OrganizationSettings",
5657
"ProductionCalendar",
58+
"Recommendation",
5759
"Region",
5860
"RejectionReason",
5961
"Resume",
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from typing import Dict, Optional, Union
2+
3+
from huntflow_api_client.entities.base import BaseEntity, ListEntityMixin
4+
from huntflow_api_client.models.consts import RecommendationProcessingStatus
5+
from huntflow_api_client.models.response.recommendation import RecommendationListResponse
6+
7+
8+
class Recommendation(BaseEntity, ListEntityMixin):
9+
async def list(
10+
self,
11+
account_id: int,
12+
vacancy_id: int,
13+
count: int = 30,
14+
processing_status: RecommendationProcessingStatus = RecommendationProcessingStatus.ALL,
15+
next_page_cursor: Optional[str] = None,
16+
) -> RecommendationListResponse:
17+
"""
18+
API method reference
19+
https://api.huntflow.ai/v2/docs#get-/accounts/-account_id-/recommendations/-vacancy_id-
20+
21+
:param account_id: Organization ID
22+
:param vacancy_id: Vacancy ID
23+
:param count: Number of items per page
24+
:param next_page_cursor: Next page cursor
25+
:param processing_status: Get all recommendations or processed/unprocessed only
26+
:return: A list of applicants recommended for a vacancy
27+
"""
28+
params: Dict[str, Union[str, int]]
29+
if next_page_cursor is not None:
30+
params = {"next_page_cursor": next_page_cursor}
31+
else:
32+
params = {"count": count}
33+
params["processing_status"] = processing_status.value
34+
35+
response = await self._api.request(
36+
"GET",
37+
f"/accounts/{account_id}/recommendations/{vacancy_id}",
38+
params=params,
39+
)
40+
return RecommendationListResponse.model_validate(response.json())

huntflow_api_client/models/consts.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ class UserControlTaskStatus(str, Enum):
181181
FAILED = "FAILED"
182182

183183

184+
class RecommendationProcessingStatus(str, Enum):
185+
ALL = "ALL"
186+
PROCESSED = "PROCESSED"
187+
UNPROCESSED = "UNPROCESSED"
188+
189+
190+
class RecommendationStatus(str, Enum):
191+
TAKEN = "TAKEN"
192+
TAKEN_OTHER = "TAKEN_OTHER"
193+
DECLINED = "DECLINED"
194+
195+
184196
class InterviewType(str, Enum):
185197
USER = "user"
186198
INTERVIEW = "interview"

huntflow_api_client/models/request/resume.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ApplicantResumeUpdateRequest(JsonRequestModel):
1313
account_source: Optional[PositiveInt] = Field(..., description="Resume source ID")
1414
data: Optional[ApplicantResumeUpdateData] = Field(..., description="Resume data")
1515
files: Optional[List[PositiveInt]] = Field(
16-
[],
16+
None,
1717
max_length=1,
1818
description="Upload files<br>" "List of file's ID attached to the applicant resume",
1919
)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from datetime import datetime
2+
from typing import List, Optional
3+
4+
from pydantic import BaseModel, Field
5+
6+
from huntflow_api_client.models.consts import RecommendationStatus
7+
8+
9+
class RecommendationItem(BaseModel):
10+
id: int = Field(..., description="Recommendation ID")
11+
vacancy_id: int = Field(..., description="Vacancy ID")
12+
applicant_id: int = Field(..., description="Applicant ID")
13+
rank: int = Field(..., description="Position of the recommendation in the ranking list.")
14+
created_at: datetime = Field(
15+
...,
16+
description="Date and time when the recommendation was created.",
17+
)
18+
updated_at: datetime = Field(
19+
...,
20+
description="Date and time when the recommendation was last updated.",
21+
)
22+
resolved_by_user: Optional[int] = Field(
23+
None,
24+
description="ID of the recruiter who resolved recommendation. null if not processed yet.",
25+
)
26+
status: Optional[RecommendationStatus] = Field(
27+
None,
28+
description="Current status of the recommendation. null if not processed yet.",
29+
)
30+
31+
32+
class RecommendationListResponse(BaseModel):
33+
items: List[RecommendationItem]
34+
next_page_cursor: Optional[str] = None

huntflow_api_client/models/response/vacancies.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class VacancyChild(VacancyItem):
8181

8282
class VacancyResponse(VacancyChild):
8383
blocks: Optional[List[VacancyChild]] = Field(
84-
[],
84+
None,
8585
description="Affiliate vacancies if vacancy is a multiple",
8686
)
8787

0 commit comments

Comments
 (0)