Skip to content

Commit

Permalink
feat: add projects support
Browse files Browse the repository at this point in the history
  • Loading branch information
danfimov committed Sep 30, 2023
1 parent 3a3d496 commit 1401a1b
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/get_test_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ async def main() -> None:
await client.get_worklog_records_by_parameters(me.login)
await client.get_attachments_list('TRACKER-1')
await client.get_issue_comments('TRACKER-1')
await client.get_projects_list(expand='queues')

await client.stop()

Expand Down
44 changes: 44 additions & 0 deletions ya_tracker_client/domain/entities/project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from datetime import date

from pydantic import Field

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.queue import QueueShort
from ya_tracker_client.domain.entities.user import UserShort


class ProjectCreate(AbstractEntity):
name: str
queues: str
description: str | None = None
lead: str | int | None = None
status: str | None = Field(default=None, examples=["DRAFT", "IN_PROGRESS", "LAUNCHED", "POSTPONED"])
start_date: date | None = None
end_date: date | None = None


class Project(AbstractEntity):
url: str
id: int
version: int
key: str
name: str
description: str | None = None
lead: UserShort
status: str = Field(default=None, examples=["DRAFT", "IN_PROGRESS", "LAUNCHED", "POSTPONED"])
start_date: date | None = None
end_date: date | None = None


class ProjectWithQueues(Project):
queues: list[QueueShort]


class ProjectEdit(AbstractEntity):
name: str | None
queues: str
description: str | None = None
lead: str | int | None = None
status: str | None = Field(default=None, examples=["DRAFT", "IN_PROGRESS", "LAUNCHED", "POSTPONED"])
start_date: date | None = None
end_date: date | None = None
2 changes: 2 additions & 0 deletions ya_tracker_client/domain/repositories/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from ya_tracker_client.domain.repositories.component import ComponentRepository
from ya_tracker_client.domain.repositories.issue import IssueRepository
from ya_tracker_client.domain.repositories.issue_relationship import IssueRelationshipRepository
from ya_tracker_client.domain.repositories.project import ProjectRepository
from ya_tracker_client.domain.repositories.queue import QueueRepository
from ya_tracker_client.domain.repositories.user import UserRepository
from ya_tracker_client.domain.repositories.worklog import WorklogRepository
Expand All @@ -16,6 +17,7 @@
"ComponentRepository",
"IssueRelationshipRepository",
"IssueRepository",
"ProjectRepository",
"QueueRepository",
"UserRepository",
"WorklogRepository",
Expand Down
111 changes: 111 additions & 0 deletions ya_tracker_client/domain/repositories/project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from datetime import date

from ya_tracker_client.domain.entities.project import Project, ProjectCreate, ProjectEdit, ProjectWithQueues
from ya_tracker_client.domain.entities.queue import Queue
from ya_tracker_client.domain.repositories.base import EntityRepository


class ProjectRepository(EntityRepository):
async def create_project(
self,
name: str,
queues: str,
description: str | None = None,
lead: str | int | None = None,
status: str | None = None,
start_date: date | None = None,
end_date: date | None = None,
) -> Project:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/create-project
"""
raw_response = await self._client.request(
method="POST",
uri="/projects",
payload=ProjectCreate(
name=name,
queues=queues,
description=description,
lead=lead,
status=status,
start_date=start_date,
end_date=end_date,
).model_dump(exclude_none=True, by_alias=True),
)
return self._decode(raw_response, Project)

async def get_project(self, project_id: str | int) -> Project:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/get-project
"""
raw_response = await self._client.request(
method="GET",
uri=f"/projects/{project_id}",
)
return self._decode(raw_response, Project)

async def get_projects_list(self, expand: str | None = None) -> list[Project | ProjectWithQueues]:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/get-projects
"""
raw_response = await self._client.request(
method="GET",
uri="/projects",
params={"expand": expand} if expand is not None else None,
)
return self._decode(raw_response, ProjectWithQueues if expand == "queues" else Project, plural=True)

async def get_project_queues(self, project_id: str | int) -> list[Queue]:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/get-project-queues
"""
raw_response = await self._client.request(
method="GET",
uri=f"/projects/{project_id}/queues",
)
return self._decode(raw_response, Queue, plural=True)

async def edit_project(
self,
project_id: str | int,
version: int,
queues: str,
name: str | None = None,
description: str | None = None,
lead: str | int | None = None,
status: str | None = None,
start_date: date | None = None,
end_date: date | None = None,
expand: str | None = None,
) -> Project | ProjectWithQueues:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/update-project
"""
params = {"version": version}
if expand:
params["expand"] = expand

raw_response = await self._client.request(
method="PATCH",
uri=f"/projects/{project_id}",
payload=ProjectEdit(
name=name,
queues=queues,
description=description,
lead=lead,
status=status,
start_date=start_date,
end_date=end_date,
).model_dump(exclude_none=True, by_alias=True),
params=params,
)
return self._decode(raw_response, ProjectWithQueues if expand == "queues" else Project)

async def delete_project(self, project_id: str | int) -> None:
"""
YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/projects/delete-project
"""
await self._client.request(
method="DELETE",
uri=f"/projects/{project_id}",
)
2 changes: 2 additions & 0 deletions ya_tracker_client/service/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
ComponentRepository,
IssueRelationshipRepository,
IssueRepository,
ProjectRepository,
QueueRepository,
UserRepository,
WorklogRepository,
Expand All @@ -22,6 +23,7 @@ class YaTrackerClient(
QueueRepository,
UserRepository,
WorklogRepository,
ProjectRepository,
):
def __init__(
self,
Expand Down

0 comments on commit 1401a1b

Please sign in to comment.