Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: checklists support #23

Merged
merged 3 commits into from
Sep 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
4 changes: 2 additions & 2 deletions ya_tracker_client/domain/client/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from abc import ABC, abstractmethod
from http import HTTPStatus
from json import dumps
from logging import getLogger
from typing import Any

Expand All @@ -14,6 +13,7 @@
ClientObjectNotFoundError,
ClientSufficientRightsError,
)
from ya_tracker_client.utils import serialize_entity


logger = getLogger(__name__)
Expand Down Expand Up @@ -60,7 +60,7 @@ async def request(
uri = f"{self._base_url}/{self._api_version}{uri}"

bytes_payload = BytesPayload(
value=bytes(dumps(payload), encoding="utf-8"),
value=bytes(serialize_entity(payload), encoding="utf-8"),
content_type="application/json",
)

Expand Down
12 changes: 10 additions & 2 deletions ya_tracker_client/domain/entities/base.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
from abc import ABCMeta

from pydantic import BaseModel
from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel


def tracker_alias_generator(s: str) -> str:
"""Convert a string from snake case to camel case and rename url to self"""
if s == "url":
return "self"
return to_camel(s)


class AbstractEntity(BaseModel, metaclass=ABCMeta):
...
model_config = ConfigDict(alias_generator=tracker_alias_generator, populate_by_name=True)
28 changes: 28 additions & 0 deletions ya_tracker_client/domain/entities/checklist.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.deadline import Deadline
from ya_tracker_client.domain.entities.user import UserShort


class ChecklistCreate(AbstractEntity):
text: str
checked: bool | None = None
assignee: str | None = None
deadline: Deadline | None = None


class ChecklistItem(AbstractEntity):
id: str
text: str
text_html: str
checked: bool
checklist_item_type: str
deadline: Deadline | None = None
assignee: UserShort | None = None


class ChecklistItemEdit(AbstractEntity):
text: str
checked: bool | None = None
assignee: str | None = None
deadline: Deadline | None = None
9 changes: 9 additions & 0 deletions ya_tracker_client/domain/entities/deadline.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from datetime import datetime

from ya_tracker_client.domain.entities.base import AbstractEntity


class Deadline(AbstractEntity):
date: datetime
deadline_type: str = "date"
is_exceeded: bool | None = None
48 changes: 39 additions & 9 deletions ya_tracker_client/domain/entities/issue.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from datetime import datetime

from pydantic import AliasChoices, Field
from pydantic import Field

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.checklist import ChecklistItem
from ya_tracker_client.domain.entities.issue_status import IssueStatus
from ya_tracker_client.domain.entities.issue_type import IssueType
from ya_tracker_client.domain.entities.priority import Priority
from ya_tracker_client.domain.entities.queue import QueueIdentifier, QueueShort
Expand All @@ -12,14 +14,14 @@


class IssueShort(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
key: str
display: str


class Issue(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
key: str
version: int
Expand All @@ -39,8 +41,8 @@ class Issue(AbstractEntity):
last_comment_update_at: datetime | None = None
aliases: list[str] | None = None
updated_by: UserShort | None = None
created_at: datetime = Field(validation_alias=AliasChoices("createdAt", "created_at"))
created_by: UserShort = Field(validation_alias=AliasChoices("createdBy", "created_by"))
created_at: datetime
created_by: UserShort
votes: int
updated_at: datetime | None = None
status: Status
Expand All @@ -59,10 +61,7 @@ class IssueCreate(AbstractEntity):
followers: list[UserShort | str] | None = None
assignee: list[UserShort | str] | None = None
unique: str | None = None
attachment_ids: list[str] | None = Field(
default=None,
validation_alias=AliasChoices("attachmentIds", "attachment_ids"),
)
attachment_ids: list[str] | None = None


class IssueEdit(AbstractEntity):
Expand All @@ -73,3 +72,34 @@ class IssueEdit(AbstractEntity):
type: IssueType | None = None
priority: Priority | None = None
followers: list[UserShort | str] | None = None


class IssueWithChecklist(AbstractEntity):
url: str
id: str
key: str
version: int

summary: str
description: str | None = None
type: IssueType
priority: Priority
followers: list[UserShort] | None = None
queue: QueueShort
favorite: bool
assignee: UserShort | None = None

last_comment_updated_at: datetime | None = None
pending_reply_from: UserShort | None = None
created_at: datetime
updated_at: datetime
created_by: UserShort
updated_by: UserShort | None = None
votes: int
status: IssueStatus
previous_status: IssueStatus | None = None
status_start_time: datetime
previous_status_last_assignee: UserShort | None = None
deadline: datetime | None = None

checklist_items: list[ChecklistItem] = Field(default_factory=list)
14 changes: 6 additions & 8 deletions ya_tracker_client/domain/entities/issue_relationship.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from datetime import datetime
from enum import Enum

from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.issue import IssueShort
from ya_tracker_client.domain.entities.issue_status import IssueStatus
Expand All @@ -22,22 +20,22 @@ class IssueRelationshipTypeEnum(str, Enum):


class IssueRelationshipType(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
inward: str
outward: str


class IssueRelationship(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: int
type: IssueRelationshipType
direction: str
object: IssueShort
created_at: datetime = Field(validation_alias=AliasChoices("createdAt", "created_at"))
updated_at: datetime = Field(validation_alias=AliasChoices("updatedAt", "updated_at"))
created_by: UserShort = Field(validation_alias=AliasChoices("createdBy", "created_by"))
updated_by: UserShort = Field(validation_alias=AliasChoices("updatedBy", "updated_by"))
created_at: datetime
updated_at: datetime
created_by: UserShort
updated_by: UserShort
assignee: UserShort | None = None
status: IssueStatus

Expand Down
4 changes: 1 addition & 3 deletions ya_tracker_client/domain/entities/issue_status.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity


class IssueStatus(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
key: str
display: str
4 changes: 1 addition & 3 deletions ya_tracker_client/domain/entities/issue_type.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity


class IssueType(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
key: str
display: str
4 changes: 1 addition & 3 deletions ya_tracker_client/domain/entities/issue_type_config.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.issue_type import IssueType
from ya_tracker_client.domain.entities.resolution import ResolutionShort
from ya_tracker_client.domain.entities.workflow import WorkflowShort


class IssueTypeConfig(AbstractEntity):
issue_type: IssueType = Field(validation_alias=AliasChoices("issueType", "issue_type"))
issue_type: IssueType
workflow: WorkflowShort
resolutions: list[ResolutionShort]
4 changes: 1 addition & 3 deletions ya_tracker_client/domain/entities/priority.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity


class Priority(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: int
key: str
display: str | None = None
Expand Down
58 changes: 20 additions & 38 deletions ya_tracker_client/domain/entities/queue.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from pydantic import AliasChoices, Field
from pydantic import Field

from ya_tracker_client.domain.entities.base import AbstractEntity
from ya_tracker_client.domain.entities.issue_type import IssueType
Expand All @@ -14,66 +14,48 @@ class QueueIdentifier(AbstractEntity):


class QueueShort(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
key: str
display: str


class QueueVersion(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
display: str


class Queue(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: int
key: str
version: int
name: str
description: str | None = None # TODO: string in documentation, but may be missing in response - TB145879
lead: UserShort
assign_auto: bool = Field(validation_alias=AliasChoices("assignAuto", "assign_auto"))
default_type: IssueType = Field(validation_alias=AliasChoices("defaultType", "default_type"))
default_priority: Priority = Field(validation_alias=AliasChoices("defaultPriority", "default_priority"))
team_users: list[UserShort] = Field(default=list, validation_alias=AliasChoices("teamUsers", "team_users"))
issue_types: list[IssueType] = Field(default=list, validation_alias=AliasChoices("issueTypes", "issue_types"))
versions: list[QueueVersion] = Field(default=list)
workflows: list[WorkflowShort] = Field(default=list)
deny_voting: bool = Field(validation_alias=AliasChoices("denyVoting", "deny_voting"))
issue_types_config: list[IssueTypeConfig] = Field(
default=list,
validation_alias=AliasChoices("issueTypesConfig", "issue_types_config"),
)
assign_auto: bool
default_type: IssueType
default_priority: Priority
team_users: list[UserShort] = Field(default_factory=list)
issue_types: list[IssueType] = Field(default_factory=list)
versions: list[QueueVersion] = Field(default_factory=list)
workflows: list[WorkflowShort] = Field(default_factory=list)
deny_voting: bool
issue_types_config: list[IssueTypeConfig] = Field(default_factory=list)

# TODO: documentation does not contain this fields - TB145879
deny_conductor_autolink: bool = Field(
validation_alias=AliasChoices("denyConductorAutolink", "deny_conductor_autolink"),
)
deny_tracker_auto_link: bool = Field(
validation_alias=AliasChoices("denyTrackerAutolink", "deny_tracker_auto_link"),
)
use_component_permissions_intersection: bool = Field(
validation_alias=AliasChoices("useComponentPermissionsIntersection", "use_component_permissions_intersection"),
)
workflow_actions_style: str = Field(
validation_alias=AliasChoices("workflowActionsStyle", "workflow_actions_style"),
)
use_last_signature: bool = Field(
validation_alias=AliasChoices("useLastSignature", "use_last_signature"),
)
deny_conductor_autolink: bool | None = None
deny_tracker_auto_link: bool | None = None
use_component_permissions_intersection: bool | None = None
workflow_actions_style: str | None = None
use_last_signature: bool | None = None


class QueueCreate(AbstractEntity):
key: str
name: str
lead: str
default_type: str
default_priority: str = Field(
validation_alias=AliasChoices("defaultPriority", "default_priority"),
)
issue_types_config: list[IssueTypeConfig] = Field(
default=list,
validation_alias=AliasChoices("issueTypesConfig", "issue_types_config"),
)
default_priority: str
issue_types_config: list[IssueTypeConfig] = Field(default_factory=list)
14 changes: 4 additions & 10 deletions ya_tracker_client/domain/entities/queue_field.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@


class QueueField(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
name: str
version: int
Expand All @@ -19,17 +19,11 @@ class QueueField(AbstractEntity):
readonly: bool
options: bool
suggest: bool
options_provider: QueueFieldOptionsProvider | None = Field( # TODO: not required in response - not documented
default=None, validation_alias=AliasChoices("optionsProvider", "options_provider"),
)
query_provider: QueueFieldQueryProvider | None = Field(
default=None, validation_alias=AliasChoices("queryProvider", "query_provider"),
)
options_provider: QueueFieldOptionsProvider | None = None # TODO: not required in response - not documented
query_provider: QueueFieldQueryProvider | None = None
order: int

# TODO: documentation does not contain this fields
suggest_provider: QueueFieldSuggestProvider | None = Field(
default=None, validation_alias=AliasChoices("suggestProvider", "suggest_provider"),
)
suggest_provider: QueueFieldSuggestProvider | None = None
type: str
category: QueueFieldCategory
4 changes: 1 addition & 3 deletions ya_tracker_client/domain/entities/queue_field_category.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
from pydantic import AliasChoices, Field

from ya_tracker_client.domain.entities.base import AbstractEntity


class QueueFieldCategory(AbstractEntity):
url: str = Field(validation_alias=AliasChoices("self", "url"))
url: str
id: str
display: str
Loading
Loading