1
0
favro-sync/favro_sync/favro_data_model.py

132 lines
3.4 KiB
Python
Raw Normal View History

2024-09-26 21:07:46 +00:00
import dataclasses
import datetime
from typing import Any
@dataclasses.dataclass(frozen=True)
class SeqId:
raw_id: int
2024-09-26 21:08:37 +00:00
2024-09-26 21:07:46 +00:00
@dataclasses.dataclass(frozen=True)
class CardId:
raw_id: str
2024-09-26 21:08:37 +00:00
2024-09-26 21:07:46 +00:00
@dataclasses.dataclass(frozen=True)
class CommonId:
raw_id: str
2024-09-26 21:08:37 +00:00
2024-09-26 21:07:46 +00:00
@dataclasses.dataclass(frozen=True)
class UserId:
raw_id: str
2024-09-26 21:08:37 +00:00
2024-09-26 21:07:46 +00:00
@dataclasses.dataclass(frozen=True)
class OrganizationId:
raw_id: str
2024-09-26 21:08:37 +00:00
@dataclasses.dataclass(frozen=True)
class CardAssignment:
user: UserId
completed: bool
@staticmethod
def from_json(json: dict[str, Any]) -> 'CardAssignment':
return CardAssignment(
UserId(json['userId']),
json['completed'],
)
@dataclasses.dataclass(frozen=True)
class UserInfo:
user_id: UserId
name: str
email: str
organization_role: str
@staticmethod
def from_json(json: dict[str, Any]) -> 'UserInfo':
return UserInfo(
UserId(json['userId']),
json['name'],
json['email'],
json['organizationRole'],
)
@dataclasses.dataclass(frozen=True)
class TagId:
raw_id: str
@dataclasses.dataclass(frozen=True)
class TagInfo:
tag_id: TagId
organization_id: OrganizationId
name: str
color: str | None
@staticmethod
def from_json(json: dict[str, Any]) -> 'TagInfo':
return TagInfo(
TagId(json['tagId']),
OrganizationId(json['organizationId']),
json['name'],
json.get('color'),
)
@dataclasses.dataclass(frozen=True)
class CardDependency:
card_id: CardId
card_common_id: CommonId
is_before: bool
reverse_card_id: CardId
@staticmethod
def from_json(json: dict[str, Any]) -> 'CardDependency':
return CardDependency(
CardId(json['cardId']),
CommonId(json['cardCommonId']),
json['isBefore'],
CardId(json['reverseCardId']),
)
2024-09-26 21:07:46 +00:00
@dataclasses.dataclass(frozen=True)
class Card:
card_id: CardId
seq_id: SeqId
common_id: CommonId
organization_id: OrganizationId
is_archived: bool
name: str
dependencies: list[CardDependency]
assignments: list[CardAssignment]
tags: list[TagId]
2024-09-26 21:07:46 +00:00
todo_list_user_id: UserId | None
todo_list_completed: bool | None
creator_user_id: UserId
creation_date: datetime.datetime
detailed_description: str | None
@staticmethod
def from_json(json: dict[str, Any]) -> 'Card':
todo_list_user_id = UserId(json['todoListUserId']) if 'todoListUserId' in json else None
2024-09-26 21:07:46 +00:00
return Card(
2024-09-26 21:08:37 +00:00
card_id=CardId(json['cardId']),
seq_id=SeqId(json['sequentialId']),
common_id=CommonId(json['cardCommonId']),
detailed_description=json.get('detailedDescription'),
is_archived=json['archived'],
organization_id=OrganizationId(json['organizationId']),
name=json['name'],
todo_list_user_id=todo_list_user_id,
2024-09-26 21:08:37 +00:00
todo_list_completed=json.get('todoListCompleted'),
dependencies=json['dependencies'],
tags=[TagId(tag) for tag in json['tags']],
2024-09-26 21:08:37 +00:00
creator_user_id=UserId(json['createdByUserId']),
creation_date=datetime.datetime.fromisoformat(json['createdAt']),
assignments = [CardAssignment.from_json(ass) for ass in json['assignments']],
2024-09-26 21:07:46 +00:00
)