Skip to content

Commit

Permalink
feat: checklists support (#23)
Browse files Browse the repository at this point in the history
  • Loading branch information
danfimov committed Sep 28, 2023
2 parents 09cbd49 + 7d9bfb4 commit da4fd88
Show file tree
Hide file tree
Showing 29 changed files with 312 additions and 165 deletions.
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

0 comments on commit da4fd88

Please sign in to comment.