Skip to content

Commit

Permalink
source-monday: Simplify and relax model definitions
Browse files Browse the repository at this point in the history
Modify GraphQL and models to be more flexible:
    - Update USERS GraphQL query to support pagination
    - Remove strict field definitions in models
    - Simplify model structures for Tag, Team, User, and Item
    - Adjust type hints and remove unnecessary validators
  • Loading branch information
JustinASmith committed Feb 28, 2025
1 parent ca52be5 commit 213d219
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 163 deletions.
4 changes: 2 additions & 2 deletions source-monday/source_monday/graphql.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,8 +341,8 @@ async def fetch_items_by_boards(
"""

USERS = """
query {
users {
query ($limit: Int = 10, $page: Int = 1) {
users(limit: $limit, page: $page) {
birthday
country_code
created_at
Expand Down
166 changes: 10 additions & 156 deletions source-monday/source_monday/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,7 @@ class Advanced(BaseModel, extra="forbid"):


ConnectorState = GenericConnectorState[ResourceState]


ResponseObject = TypeVar("ResponseObject", bound=BaseModel)
State = Literal["active", "all", "archived", "deleted"]


class FullRefreshResource(BaseDocument, extra="allow"):
Expand Down Expand Up @@ -118,12 +115,8 @@ class GraphQLResponse(BaseModel, Generic[ResponseObject], extra="forbid"):
errors: list[GraphQLError] | None = None


class ActivityLog(BaseModel, extra="forbid"):
id: str
entity: Literal["board", "pulse"]
event: str
class ActivityLog(BaseModel, extra="allow"):
data: dict[str, Any] = Field(default_factory=dict)
created_at: AwareDatetime

@field_validator("data", mode="before")
@classmethod
Expand All @@ -132,147 +125,35 @@ def parse_json_data(cls, v: Any) -> dict[str, Any]:
return json.loads(v)
return v

@field_validator("created_at", mode="before")
@classmethod
def parse_created_at(cls, v: Any) -> datetime:
if isinstance(v, str):
unix_millis = int(v) / 10_000
return datetime.fromtimestamp(unix_millis / 1_000, tz=UTC)
raise ValueError(f"Invalid created_at value: {v}")


class BoardActivityLogs(BaseModel, extra="forbid"):
id: str
class BoardActivityLogs(BaseModel, extra="allow"):
activity_logs: list[ActivityLog]


class ActivityLogsResponse(BaseModel, extra="forbid"):
boards: list[BoardActivityLogs]


# A simple reference model for entities with just an id.
class EntityRef(BaseModel, extra="forbid"):
id: str


class Column(BaseModel, extra="forbid"):
archived: bool
description: str | None = None
id: str
settings_str: str | None = None
title: str
type: str
width: int | None = None


class Group(BaseModel, extra="forbid"):
archived: bool
color: str | None = None
deleted: bool
id: str
position: int | None = None
title: str


class Tag(BaseDocument, extra="forbid"):
id: str
color: str
name: str


class View(BaseModel, extra="forbid"):
id: str
name: str
settings_str: str | None = None
type: str
view_specific_data_str: str | None = None


class Workspace(BaseModel, extra="forbid"):
id: str
name: str
kind: str
description: str | None = None
class Tag(BaseDocument, extra="allow"):
pass


class Board(BaseDocument, extra="forbid"):
id: str
name: str
board_kind: str
type: str
columns: list[Column]
communication: str | None = None
description: str | None = None
groups: list[Group]
owners: list[EntityRef]
creator: EntityRef
permissions: str | None = None
state: str
subscribers: list[EntityRef]
tags: list[Tag]
top_group: EntityRef
class Board(BaseDocument, extra="allow"):
updated_at: AwareDatetime
updates: list[EntityRef]
views: list[View]
workspace: Workspace


class BoardsResponse(BaseModel, extra="forbid"):
boards: list[Board]


class BoardRef(BaseModel, extra="forbid"):
id: str
name: str


class Asset(BaseModel, extra="forbid"):
created_at: AwareDatetime
file_extension: str
file_size: int
id: str
name: str
original_geometry: str | None = None
public_url: str
uploaded_by: EntityRef
url: str
url_thumbnail: str


class ColumnValue(BaseModel, extra="forbid"):
id: str
text: str | None = None
type: str
value: str | None = None


class GroupRef(BaseModel, extra="forbid"):
id: str


class ParentItemRef(BaseModel, extra="forbid"):
id: str


class Update(BaseModel, extra="forbid"):
class Item(BaseDocument, extra="allow"):
id: str


class Item(BaseDocument, extra="forbid"):
id: str
name: str
assets: list[Asset]
board: BoardRef
column_values: list[ColumnValue]
created_at: AwareDatetime
creator_id: str
group: GroupRef
parent_item: ParentItemRef | None = None
state: str
subscribers: list[EntityRef]
updated_at: AwareDatetime
updates: list[Update]
subitems: list["Item"] | None = None


class ItemsPage(BaseModel, extra="forbid"):
Expand All @@ -297,44 +178,17 @@ class ItemsByIdResponse(BaseModel, extra="forbid"):
items: list[Item] | None = Field(default_factory=list)


class Team(BaseDocument, extra="forbid"):
id: str
name: str
picture_url: str | None = None
users: list[EntityRef]
owners: list[EntityRef]
class Team(BaseDocument, extra="allow"):
pass


class TeamsResponse(BaseModel, extra="forbid"):
teams: list[Team]


class User(BaseDocument, extra="forbid"):
birthday: str | None = None
country_code: str | None = None
created_at: AwareDatetime | None = None
join_date: AwareDatetime | None = None
email: str | None = None
enabled: bool
class User(BaseDocument, extra="allow"):
id: str
is_admin: bool
is_guest: bool
is_pending: bool
is_view_only: bool
is_verified: bool
location: str | None = None
mobile_phone: str | None = None
name: str
phone: str | None = None
photo_original: str | None = None
photo_small: str | None = None
photo_thumb: str | None = None
photo_thumb_small: str | None = None
photo_tiny: str | None = None
time_zone_identifier: str | None = None
title: str | None = None
url: str | None = None
utc_hours_diff: float | None = None
pass


class UsersResponse(BaseModel, extra="forbid"):
Expand Down
10 changes: 5 additions & 5 deletions source-monday/tests/snapshots/snapshots__capture__stdout.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"time_zone_identifier": "America/Chicago",
"title": null,
"url": "https://estuarydev.monday.com/users/71985416",
"utc_hours_diff": -6.0
"utc_hours_diff": -6
}
],
[
Expand Down Expand Up @@ -144,15 +144,15 @@
"color": "#579bfc",
"deleted": false,
"id": "new_group29179",
"position": 65472,
"position": "65472.0",
"title": "To-Do"
},
{
"archived": false,
"color": "#00c875",
"deleted": false,
"id": "new_group43041",
"position": 98208,
"position": "98208",
"title": "Completed"
}
],
Expand All @@ -175,7 +175,7 @@
"id": "new_group29179"
},
"type": "board",
"updated_at": "2025-02-24T17:14:41Z",
"updated_at": "2025-02-28T21:54:49Z",
"updates": [],
"views": [],
"workspace": {
Expand Down Expand Up @@ -242,7 +242,7 @@
"color": "#579bfc",
"deleted": false,
"id": "topics",
"position": 65536,
"position": "65536",
"title": "Subitems"
}
],
Expand Down

0 comments on commit 213d219

Please sign in to comment.