Skip to content
This repository has been archived by the owner on Apr 14, 2024. It is now read-only.

hotfix/multiple-statuses-in-get-projects #224

Merged
merged 5 commits into from
Nov 28, 2023
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
14 changes: 8 additions & 6 deletions autotests/clients/rest/projects/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ async def get_projects(
startline_le: datetime | Type[Empty] = Empty,
deadline_ge: datetime | Type[Empty] = Empty,
deadline_le: datetime | Type[Empty] = Empty,
status: ProjectStatusEnum | Type[Empty] = Empty,
statuses: list[ProjectStatusEnum] | Type[Empty] = Empty,
position_skill_ids: list[uuid.UUID] | Type[Empty] = Empty,
position_specialization_ids: list[uuid.UUID] | Type[Empty] = Empty,
participant_user_ids: list[uuid.UUID] | Type[Empty] = Empty,
Expand All @@ -60,7 +60,7 @@ async def get_projects(
"startline_le": startline_le,
"deadline_ge": deadline_ge,
"deadline_le": deadline_le,
"status": status.value if status is not Empty else Empty,
"status": [s.value for s in statuses] if statuses is not Empty else Empty,
"position_skill_ids": position_skill_ids,
"position_specialization_ids": position_specialization_ids,
"participant_user_ids": participant_user_ids,
Expand Down Expand Up @@ -138,7 +138,6 @@ async def remove_project_avatar(self, project_id: uuid.UUID) -> ProjectResponse:
async def get_positions(
self,
project_id: uuid.UUID | Type[Empty] = Empty,
is_closed: bool | Type[Empty] = Empty,
specialization_ids: list[uuid.UUID] | Type[Empty] = Empty,
skill_ids: list[uuid.UUID] | Type[Empty] = Empty,
joined_user_id: uuid.UUID | Type[Empty] = Empty,
Expand All @@ -147,14 +146,13 @@ async def get_positions(
project_startline_le: datetime | Type[Empty] = Empty,
project_deadline_ge: datetime | Type[Empty] = Empty,
project_deadline_le: datetime | Type[Empty] = Empty,
project_status: ProjectStatusEnum | Type[Empty] = Empty,
project_statuses: list[ProjectStatusEnum] | Type[Empty] = Empty,
page: int = 1,
per_page: int = 10,
) -> PositionListResponse:
path = f"/api/rest/positions/"
params = {
"project_id": project_id,
"is_closed": is_closed,
"specialization_ids": specialization_ids,
"skill_ids": skill_ids,
"joined_user_id": joined_user_id,
Expand All @@ -163,7 +161,11 @@ async def get_positions(
"project_startline_le": project_startline_le,
"project_deadline_ge": project_deadline_ge,
"project_deadline_le": project_deadline_le,
"project_status": Empty if project_status is Empty else project_status.value,
"project_status": (
Empty
if project_statuses is Empty else
[project_status.value for project_status in project_statuses]
),
"page": page,
"per_page": per_page,
}
Expand Down
21 changes: 9 additions & 12 deletions autotests/rest/projects/test_positions.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,13 @@
pytest.lazy_fixture("random_projects_rest_client"),
))
@pytest.mark.parametrize(
("project_id", "is_closed", "specialization_ids", "skill_ids", "joined_user_id",
"project_query_text", "project_startline_ge", "project_startline_le", "project_deadline_ge",
"project_deadline_le", "project_status", "page", "per_page"),
("project_id", "specialization_ids", "skill_ids", "joined_user_id", "project_query_text",
"project_startline_ge", "project_startline_le", "project_deadline_ge", "project_deadline_le",
"project_statuses", "page", "per_page"),
(
(Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, 1, 10),
(Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, Empty, 1, 10),
(
Empty,
False,
[uuid.uuid4(), uuid.uuid4()],
[uuid.uuid4(), uuid.uuid4()],
uuid.uuid4(),
Expand All @@ -36,7 +35,7 @@
datetime.now() + timedelta(days=30),
datetime.now() + timedelta(days=30),
datetime.now() + timedelta(days=90),
ProjectStatusEnum.PREPARATION,
[ProjectStatusEnum.PREPARATION],
1,
10,
),
Expand All @@ -46,7 +45,6 @@
async def test_get_positions(
client: ProjectsRestClient,
project_id: uuid.UUID | Type[Empty],
is_closed: bool | Type[Empty],
specialization_ids: list[uuid.UUID] | Type[Empty],
skill_ids: list[uuid.UUID] | Type[Empty],
joined_user_id: uuid.UUID | Type[Empty],
Expand All @@ -55,13 +53,12 @@ async def test_get_positions(
project_startline_le: datetime | Type[Empty],
project_deadline_ge: datetime | Type[Empty],
project_deadline_le: datetime | Type[Empty],
project_status: ProjectStatusEnum | Type[Empty],
project_statuses: list[ProjectStatusEnum] | Type[Empty],
page: int,
per_page: int,
):
positions = await client.get_positions(
project_id=project_id,
is_closed=is_closed,
specialization_ids=specialization_ids,
skill_ids=skill_ids,
joined_user_id=joined_user_id,
Expand All @@ -70,16 +67,16 @@ async def test_get_positions(
project_startline_le=project_startline_le,
project_deadline_ge=project_deadline_ge,
project_deadline_le=project_deadline_le,
project_status=project_status,
project_statuses=project_statuses,
page=page,
per_page=per_page,
)

for position in positions.data:
if is_closed is not Empty:
assert (position.closed_at is not None) == is_closed
if specialization_ids is not Empty:
assert position.specialization_id in specialization_ids
if project_statuses is not Empty:
assert position.project.status in project_statuses


@pytest.mark.parametrize("client", (
Expand Down
12 changes: 6 additions & 6 deletions autotests/rest/projects/test_projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
@pytest.mark.parametrize(
(
"text", "owner_id", "user_id", "startline_ge", "startline_le", "deadline_ge", "deadline_le",
"status", "position_skill_ids", "position_specialization_ids",
"statuses", "position_skill_ids", "position_specialization_ids",
"participant_user_ids", "page", "per_page",
),
(
Expand All @@ -36,7 +36,7 @@
datetime.utcnow() + timedelta(days=7),
datetime.utcnow() + timedelta(days=30),
datetime.utcnow() + timedelta(days=90),
ProjectStatusEnum.FINISHED,
[ProjectStatusEnum.FINISHED],
[],
[],
[],
Expand All @@ -55,7 +55,7 @@ async def test_get_projects(
startline_le: datetime | Type[Empty],
deadline_ge: datetime | Type[Empty],
deadline_le: datetime | Type[Empty],
status: ProjectStatusEnum | Type[Empty],
statuses: list[ProjectStatusEnum] | Type[Empty],
position_skill_ids: list[uuid.UUID] | Type[Empty],
position_specialization_ids: list[uuid.UUID] | Type[Empty],
participant_user_ids: list[uuid.UUID] | Type[Empty],
Expand All @@ -70,7 +70,7 @@ async def test_get_projects(
startline_le=startline_le,
deadline_ge=deadline_ge,
deadline_le=deadline_le,
status=status,
statuses=statuses,
position_skill_ids=position_skill_ids,
position_specialization_ids=position_specialization_ids,
participant_user_ids=participant_user_ids,
Expand All @@ -81,8 +81,8 @@ async def test_get_projects(
for project in projects.data:
if owner_id is not Empty:
assert project.owner_id == owner_id
if status is not Empty:
assert project.status == status
if statuses is not Empty:
assert project.status in statuses
if startline_ge is not Empty:
assert project.startline >= startline_ge
if startline_le is not Empty:
Expand Down
21 changes: 15 additions & 6 deletions sapphire/projects/api/rest/positions/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,25 @@ async def get_positions(
database_service: ProjectsDatabaseService = request.app.service.database

async with database_service.transaction() as session:
params = {
"session": session,
"project_id": filters.project_id,
"specialization_ids": filters.specialization_ids,
"skill_ids": filters.skill_ids,
"joined_user_id": filters.joined_user_id,
"project_query_text": filters.project_query_text,
"project_startline_ge": filters.project_startline_ge,
"project_startline_le": filters.project_startline_le,
"project_deadline_ge": filters.project_deadline_ge,
"project_deadline_le": filters.project_deadline_le,
"project_statuses": filters.project_status,
}
db_positions = await database_service.get_positions(
session=session,
**params,
page=pagination.page,
per_page=pagination.per_page,
**filters.model_dump(),
)
total_positions = await database_service.get_positions_count(
session=session,
**filters.model_dump(),
)
total_positions = await database_service.get_positions_count(**params)

total_pages = -(total_positions // -pagination.per_page)
positions = [PositionResponse.from_db_model(position) for position in db_positions]
Expand Down
2 changes: 1 addition & 1 deletion sapphire/projects/api/rest/positions/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class PositionListFiltersRequest(BaseModel):
project_startline_le: NaiveDatetime | Type[Empty] = Empty
project_deadline_ge: NaiveDatetime | Type[Empty] = Empty
project_deadline_le: NaiveDatetime | Type[Empty] = Empty
project_status: ProjectStatusEnum | Type[Empty] = Empty
project_status: list[ProjectStatusEnum] | Type[Empty] = Empty


class PositionResponse(BaseModel):
Expand Down
21 changes: 16 additions & 5 deletions sapphire/projects/api/rest/projects/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,26 @@ async def get_projects(
database_service: ProjectsDatabaseService = request.app.service.database

async with database_service.transaction() as session:
params = {
"session": session,
"query_text": filters.query_text,
"owner_id": filters.owner_id,
"user_id": filters.user_id,
"startline_le": filters.startline_le,
"startline_ge": filters.startline_ge,
"deadline_le": filters.deadline_le,
"deadline_ge": filters.deadline_ge,
"statuses": filters.status,
"position_skill_ids": filters.position_skill_ids,
"position_specialization_ids": filters.position_specialization_ids,
"participant_user_ids": filters.participant_user_ids,
}
projects_db = await database_service.get_projects(
session=session,
page=pagination.page,
per_page=pagination.per_page,
**filters.model_dump(),
)
total_projects = await database_service.get_projects_count(
session=session, **filters.model_dump()
**params,
)
total_projects = await database_service.get_projects_count(**params)

total_pages = -(total_projects // -pagination.per_page)
projects = [ProjectResponse.model_validate(project_db) for project_db in projects_db]
Expand Down
2 changes: 1 addition & 1 deletion sapphire/projects/api/rest/projects/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class ProjectListFiltersRequest(BaseModel):
startline_le: NaiveDatetime | Type[Empty] = Empty
deadline_ge: NaiveDatetime | Type[Empty] = Empty
deadline_le: NaiveDatetime | Type[Empty] = Empty
status: ProjectStatusEnum | Type[Empty] = Empty
status: list[ProjectStatusEnum] | Type[Empty] = Empty
position_skill_ids: list[uuid.UUID] | Type[Empty] = Field(fastapi.Query(Empty))
position_specialization_ids: list[uuid.UUID] | Type[Empty] = Field(fastapi.Query(Empty))
participant_user_ids: list[uuid.UUID] | Type[Empty] = Field(fastapi.Query(Empty))
Expand Down
Loading