diff --git a/examples/get_test_entities.py b/examples/get_test_entities.py index bd791b5..e1a40df 100644 --- a/examples/get_test_entities.py +++ b/examples/get_test_entities.py @@ -24,6 +24,7 @@ async def main() -> None: await client.get_user(uid=me.uid) await client.get_users() await client.get_issue('TRACKER-1') + await client.get_issue_transitions('TRACKER-1') await client.get_queue('TRACKER') await client.get_issue_relationships('TRACKER-1') await client.get_checklist_items("TRACKER-1") diff --git a/ya_tracker_client/domain/entities/bulk_operation.py b/ya_tracker_client/domain/entities/bulk_operation.py new file mode 100644 index 0000000..a7a7588 --- /dev/null +++ b/ya_tracker_client/domain/entities/bulk_operation.py @@ -0,0 +1,34 @@ +from datetime import datetime + +from ya_tracker_client.domain.entities.base import AbstractEntity +from ya_tracker_client.domain.entities.user import UserShort + + +class BulkOperation(AbstractEntity): + id: str + url: str + created_by: UserShort + created_at: datetime + status: str + status_text: str + execution_chunk_percent: int + execution_issue_percent: int + + +class BulkMove(AbstractEntity): + queue: str + issues: list[str] + values: dict | None = None + move_all_fields: bool | None = None + initial_status: bool | None = None + + +class BulkChange(AbstractEntity): + issues: list[str] + values: dict + + +class BulkChangeStatus(AbstractEntity): + issues: list[str] + transition: str + values: dict | None = None diff --git a/ya_tracker_client/domain/repositories/bulk_operation.py b/ya_tracker_client/domain/repositories/bulk_operation.py index e475581..ee52a85 100644 --- a/ya_tracker_client/domain/repositories/bulk_operation.py +++ b/ya_tracker_client/domain/repositories/bulk_operation.py @@ -1,5 +1,72 @@ +from ya_tracker_client.domain.entities.bulk_operation import BulkChange, BulkChangeStatus, BulkMove, BulkOperation from ya_tracker_client.domain.repositories.base import EntityRepository class BulkOperationRepository(EntityRepository): - ... + async def bulk_move_issues( + self, + queue_id: str, + issue_ids: list[str], + values: dict | None = None, + move_all_fields: bool | None = None, + initial_status: bool | None = None, + notify: bool = False, + ) -> BulkOperation: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/bulkchange/bulk-move-issues + """ + raw_response = await self._client.request( + method="POST", + uri="/bulkchange/_move", + payload=BulkMove( + queue=queue_id, + issues=issue_ids, + values=values, + move_all_fields=move_all_fields, + initial_status=initial_status, + ).model_dump(exclude_none=True, by_alias=True), + params={"notify": "true" if notify else "false"}, + ) + return self._decode(raw_response, BulkOperation) + + async def bulk_change_issues( + self, + issue_ids: list[str], + values: dict, + notify: bool = False, + ) -> BulkOperation: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/bulkchange/bulk-update-issues + """ + raw_response = await self._client.request( + method="POST", + uri="/bulkchange/_update", + payload=BulkChange( + issues=issue_ids, + values=values, + ).model_dump(exclude_none=True, by_alias=True), + params={"notify": "true" if notify else "false"}, + ) + return self._decode(raw_response, BulkOperation) + + async def bulk_change_issues_statuses( + self, + issue_ids: list[str], + transition_id: str, + values: dict | None = None, + notify: bool = False, + ) -> BulkOperation: + """ + YC docs: https://cloud.yandex.com/en/docs/tracker/concepts/bulkchange/bulk-transition + """ + raw_response = await self._client.request( + method="POST", + uri="/bulkchange/_transition", + payload=BulkChangeStatus( + transition=transition_id, + issues=issue_ids, + values=values, + ).model_dump(exclude_none=True, by_alias=True), + params={"notify": "true" if notify else "false"}, + ) + return self._decode(raw_response, BulkOperation)