-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
13 changed files
with
255 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
from re import compile | ||
from typing import Any | ||
|
||
from pydantic import model_validator | ||
|
||
from ya_tracker_client.domain.entities.base import AbstractEntity | ||
|
||
|
||
PATTERN = compile( | ||
r"^P(?=\d+[YMWD])" | ||
r"((?P<years>\d+)Y)?" | ||
r"((?P<months>\d+)M)?" | ||
r"((?P<weeks>\d+)W)?" | ||
r"((?P<days>\d+)D)?" | ||
r"(?P<time>T(?=\d+[HMS])" | ||
r"((?P<hours>\d+)H)?" | ||
r"((?P<minutes>\d+)M)?" | ||
r"((?P<seconds>\d+)S)?)?$", | ||
) | ||
|
||
|
||
class Duration(AbstractEntity): | ||
years: int = 0 | ||
months: int = 0 | ||
days: int = 0 | ||
hours: int = 0 | ||
minutes: int = 0 | ||
seconds: int = 0 | ||
|
||
@model_validator(mode="before") | ||
@classmethod | ||
def validate(cls, model_value: Any) -> dict | None: | ||
if not isinstance(model_value, str): | ||
return | ||
|
||
result = PATTERN.match(model_value) | ||
if result is None: | ||
msg = "Duration is not matched to ISO duration pattern." | ||
raise ValueError(msg) | ||
|
||
data: dict[str, int] = {} | ||
for field in Duration.model_fields: | ||
if value := result.group(field): | ||
data[field] = int(value) | ||
return data | ||
|
||
def __str__(self) -> str: | ||
time = "" | ||
if self.hours: | ||
time = f"{time}{self.hours}H" | ||
if self.minutes: | ||
time = f"{time}{self.minutes}M" | ||
if self.seconds: | ||
time = f"{time}{self.seconds}S" | ||
|
||
duration = "P" | ||
if self.years: | ||
duration = f"{duration}{self.years}Y" | ||
if self.months: | ||
duration = f"{duration}{self.months}M" | ||
if self.days: | ||
duration = f"{duration}{self.days}D" | ||
if time: | ||
duration = f"{duration}T{time}" | ||
|
||
return duration | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
from datetime import datetime | ||
|
||
from pydantic import field_serializer | ||
|
||
from ya_tracker_client.domain.entities.base import AbstractEntity | ||
from ya_tracker_client.domain.entities.duration import Duration | ||
from ya_tracker_client.domain.entities.issue import IssueShort | ||
from ya_tracker_client.domain.entities.user import UserShort | ||
|
||
|
||
class Worklog(AbstractEntity): | ||
url: str | ||
id: int | ||
version: int | ||
issue: IssueShort | ||
comment: str | None = None | ||
created_by: UserShort | ||
updated_by: UserShort | None | ||
created_at: datetime | ||
updated_at: datetime | None | ||
start: datetime | ||
duration: Duration | ||
|
||
@field_serializer("duration") | ||
def serialize_duration(self, duration: Duration): | ||
return str(duration) | ||
|
||
|
||
class WorklogCreate(AbstractEntity): | ||
start: datetime | ||
duration: Duration | ||
comment: str | None = None | ||
|
||
@field_serializer("duration") | ||
def serialize_duration(self, duration: Duration): | ||
return str(duration) | ||
|
||
|
||
class WorklogEdit(AbstractEntity): | ||
duration: Duration | None = None | ||
comment: str | None = None | ||
|
||
@field_serializer("duration") | ||
def serialize_duration(self, duration: Duration): | ||
return str(duration) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.