From e9c2d806cf9cae96fb1d90c16e566bbf8ba3b640 Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:33 +0200 Subject: [PATCH 1/8] Added "create board by workspace id" --- monday/query_joins.py | 12 ++++++++++++ monday/resources/boards.py | 6 +++++- monday/tests/test_board_resource.py | 12 +++++++++++- monday/tests/test_case_resource.py | 1 + 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index db34840..f0dd008 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -356,6 +356,18 @@ def get_columns_by_board_query(board_ids): }''' % board_ids +def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): + workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' + query = ''' + mutation { + create_board (board_name:"%s", board_kind: %s, %s) { + id + } + } + ''' % (board_name, board_kind, workspace_query) + return query + + # USER RESOURCE QUERIES def get_users_query(**kwargs): query = '''query diff --git a/monday/resources/boards.py b/monday/resources/boards.py index fe9afd6..9aaccf8 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,5 +1,5 @@ from monday.resources.base import BaseResource -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query @@ -22,3 +22,7 @@ def fetch_items_by_board_id(self, board_ids): def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) + + def create_board(self, board_name, board_kind, workspace_id): + query = create_board_by_workspace_query(board_name, board_kind, workspace_id) + return self.client.execute(query) \ No newline at end of file diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 3cd13fb..d476019 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -1,5 +1,5 @@ from monday.tests.test_case_resource import BaseTestCase -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ +from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ get_columns_by_board_query @@ -22,3 +22,13 @@ def test_get_board_items_query(self): def test_get_columns_by_board_query(self): query = get_columns_by_board_query(board_ids=self.board_id) self.assertIn(str(self.board_id), query) + + def test_create_board_by_workspace_query(self): + query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) + self.assertIn(str(self.board_name), query_a) + self.assertIn(str(self.board_kind), query_a) + self.assertIn(str(self.workspace_id), query_a) + query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) + self.assertIn(str(self.board_name), query_b) + self.assertIn(str(self.board_kind), query_b) + self.assertNotIn(str(self.workspace_id), query_b) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index d8ad9f0..706f1ca 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -7,6 +7,7 @@ def setUp(self): self.group_name = "my_group" self.item_name = "Nerd" self.item_id = 24 + self.board_name = "my_board" self.board_id = 12 self.board_kind = "public" self.group_id = 7 From 748f418620b972eb69b84d6509e270fb4ac469e1 Mon Sep 17 00:00:00 2001 From: albcl Date: Sat, 18 Jun 2022 19:12:39 +0200 Subject: [PATCH 2/8] Update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7720eb6..1dc8b1c 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids. +- `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id. + #### Users Resource (monday.users) - `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments. From 6e005542205431e7e40909fbafd67ea8a724b3f3 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 14:11:27 +0200 Subject: [PATCH 3/8] Added missing type hints --- monday/query_joins.py | 3 ++- monday/resources/boards.py | 12 +++++++++--- monday/resources/types.py | 9 +++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 monday/resources/types.py diff --git a/monday/query_joins.py b/monday/query_joins.py index f0dd008..524b305 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,4 +1,5 @@ import json +from monday.resources.types import BoardKind from monday.utils import monday_json_stringify @@ -356,7 +357,7 @@ def get_columns_by_board_query(board_ids): }''' % board_ids -def create_board_by_workspace_query(board_name, board_kind, workspace_id = None): +def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, workspace_id = None) -> str: workspace_query = f'workspace_id: {workspace_id}' if workspace_id else '' query = ''' mutation { diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 9aaccf8..3fd825d 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,6 +1,12 @@ from monday.resources.base import BaseResource -from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \ - get_columns_by_board_query +from monday.query_joins import ( + get_boards_query, + get_boards_by_id_query, + get_board_items_query, + get_columns_by_board_query, + create_board_by_workspace_query, +) +from monday.resources.types import BoardKind class BoardResource(BaseResource): @@ -23,6 +29,6 @@ def fetch_columns_by_board_id(self, board_ids): query = get_columns_by_board_query(board_ids) return self.client.execute(query) - def create_board(self, board_name, board_kind, workspace_id): + def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int = None): query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) \ No newline at end of file diff --git a/monday/resources/types.py b/monday/resources/types.py new file mode 100644 index 0000000..f74039f --- /dev/null +++ b/monday/resources/types.py @@ -0,0 +1,9 @@ +from enum import Enum + + +class BoardKind(Enum): + """Board kinds""" + + PUBLIC = "public" + PRIVATE = "private" + SHARE = "share" From b6e78228cb69ba023f0fd3bf430046226bc64bfa Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 14:33:30 +0200 Subject: [PATCH 4/8] Updated test --- monday/tests/test_case_resource.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index 706f1ca..2e6ddc2 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -1,5 +1,7 @@ import unittest +from monday.resources.types import BoardKind + class BaseTestCase(unittest.TestCase): @@ -9,7 +11,7 @@ def setUp(self): self.item_id = 24 self.board_name = "my_board" self.board_id = 12 - self.board_kind = "public" + self.board_kind = BoardKind.PUBLIC.value self.group_id = 7 self.column_id = "file_column" self.user_ids = [1287123, 1230919] From f971584e53384f40bfe754189a9633f140ef38df Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:19:42 +0200 Subject: [PATCH 5/8] More custom type hints --- monday/resources/types.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/monday/resources/types.py b/monday/resources/types.py index f74039f..ba160e1 100644 --- a/monday/resources/types.py +++ b/monday/resources/types.py @@ -7,3 +7,19 @@ class BoardKind(Enum): PUBLIC = "public" PRIVATE = "private" SHARE = "share" + + +class BoardState(Enum): + """Board available states""" + + ALL = "all" + ACTIVE = "active" + ARCHIVED = "archived" + DELETED = "deleted" + + +class BoardsOrderBy(Enum): + """Order to retrieve boards""" + + CREATED_AT = "created_at" + USED_AT = "used_at" From 2df4e52f7396e9e7a7eacfa7d77ab54eb8d5a15d Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:22:20 +0200 Subject: [PATCH 6/8] Type hints for 'get_boards_query' --- monday/query_joins.py | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/monday/query_joins.py b/monday/query_joins.py index 524b305..6284f10 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,5 +1,7 @@ +from enum import Enum import json -from monday.resources.types import BoardKind +from typing import List +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy from monday.utils import monday_json_stringify @@ -287,7 +289,18 @@ def get_board_items_query(board_id): return query -def get_boards_query(**kwargs): +def get_boards_query(limit: int = None, page: int = None, ids: List[int] = None, board_kind: BoardKind = None, state: BoardState = None, order_by: BoardsOrderBy = None): + parameters = locals().items() + query_params = [] + for k, v in parameters: + if v is not None: + value = v + if isinstance(v, Enum): + value = v.value + + query_params.append("%s: %s" % (k, value)) + + query = '''query { boards (%s) { @@ -308,7 +321,8 @@ def get_boards_query(**kwargs): type } } - }''' % ', '.join(["%s: %s" % (arg, kwargs.get(arg)) for arg in kwargs]) + }''' % ', '.join(query_params) + return query @@ -365,7 +379,7 @@ def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, work id } } - ''' % (board_name, board_kind, workspace_query) + ''' % (board_name, board_kind.value, workspace_query) return query From 6774ef6edd680138853ac7bb506ae48debfe45e7 Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:22:32 +0200 Subject: [PATCH 7/8] Fixed tests --- monday/tests/test_board_resource.py | 31 +++++++++++++++++++++++++---- monday/tests/test_case_resource.py | 6 ++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index d476019..b549937 100644 --- a/monday/tests/test_board_resource.py +++ b/monday/tests/test_board_resource.py @@ -8,8 +8,29 @@ def setUp(self): super(BoardTestCase, self).setUp() def test_get_boards_query(self): - query = get_boards_query(board_kind=self.board_kind) - self.assertIn(self.board_kind, query) + query_a = get_boards_query(limit=1, page=2, ids=[888,999], board_kind=self.board_kind, state=self.board_state, order_by=self.boards_order_by) + self.assertIn('1', query_a) + self.assertIn('2', query_a) + self.assertIn('[888, 999]', query_a) + self.assertNotIn(str(self.board_kind), query_a) + self.assertIn(str(self.board_kind.value), query_a) + self.assertNotIn(str(self.board_state), query_a) + self.assertIn(str(self.board_state.value), query_a) + self.assertNotIn(str(self.boards_order_by), query_a) + self.assertIn(str(self.boards_order_by.value), query_a) + + query_b = get_boards_query(board_kind=self.board_kind) + self.assertNotIn(str(self.board_kind), query_b) + self.assertIn(str(self.board_kind.value), query_b) + + query_c = get_boards_query(limit=1,state=self.board_state) + self.assertIn('1', query_c) + self.assertNotIn(str(self.board_state), query_c) + self.assertIn(str(self.board_state.value), query_c) + self.assertNotIn(str(self.board_kind), query_c) + self.assertNotIn(str(self.boards_order_by), query_c) + + def test_get_boards_by_id_query(self): query = get_boards_by_id_query(board_ids=self.board_id) @@ -26,9 +47,11 @@ def test_get_columns_by_board_query(self): def test_create_board_by_workspace_query(self): query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id) self.assertIn(str(self.board_name), query_a) - self.assertIn(str(self.board_kind), query_a) + self.assertNotIn(str(self.board_kind), query_a) + self.assertIn(str(self.board_kind.value), query_a) self.assertIn(str(self.workspace_id), query_a) query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind) self.assertIn(str(self.board_name), query_b) - self.assertIn(str(self.board_kind), query_b) + self.assertNotIn(str(self.board_kind), query_b) + self.assertIn(str(self.board_kind.value), query_b) self.assertNotIn(str(self.workspace_id), query_b) diff --git a/monday/tests/test_case_resource.py b/monday/tests/test_case_resource.py index 2e6ddc2..f6a4d5c 100644 --- a/monday/tests/test_case_resource.py +++ b/monday/tests/test_case_resource.py @@ -1,6 +1,6 @@ import unittest -from monday.resources.types import BoardKind +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy class BaseTestCase(unittest.TestCase): @@ -11,7 +11,9 @@ def setUp(self): self.item_id = 24 self.board_name = "my_board" self.board_id = 12 - self.board_kind = BoardKind.PUBLIC.value + self.board_kind = BoardKind.PUBLIC + self.board_state = BoardState.ACTIVE + self.boards_order_by = BoardsOrderBy.USED_AT self.group_id = 7 self.column_id = "file_column" self.user_ids = [1287123, 1230919] From 302b1f3fd6a751c5c45e54809191745f6735430c Mon Sep 17 00:00:00 2001 From: albcl Date: Tue, 18 Oct 2022 17:49:47 +0200 Subject: [PATCH 8/8] Updated Readme and 'fetch_boards' method --- README.md | 9 ++++++++- monday/resources/boards.py | 7 ++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1dc8b1c..325ebd9 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,14 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a #### Boards Resource (monday.boards) -- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments. See Monday API docs for a list of accepted keyword arguments. +- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments: + - `limit` - The number of boards returned (*int*. Default is 25). + - `page` - The page number returned, should you implement pagination(*int*. Starts at 1). + - `ids` - A list of the unique board identifier(s) (*List[int]*). + - `board_kind` - The board's kind (*BoardKind*. public / private / share). + - `state` - The state of the board (*BoardState*. all / active / archived / deleted. Default is active). + - `order_by` - The order in which to retrieve your boards (*BoardsOrderBy*. created_at / used_at). + - `fetch_boards_by_id([board_ids])` - Since Monday does not allow querying boards by name, you can use `fetch_boards` to get a list of boards, and then `fetch_boards_by_id` to get more detailed info about the groups and columns on that board. Accepts a comma separated list of board ids. diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 3fd825d..d3a98f2 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,3 +1,4 @@ +from typing import List from monday.resources.base import BaseResource from monday.query_joins import ( get_boards_query, @@ -6,15 +7,15 @@ get_columns_by_board_query, create_board_by_workspace_query, ) -from monday.resources.types import BoardKind +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy class BoardResource(BaseResource): def __init__(self, token): super().__init__(token) - def fetch_boards(self, **kwargs): - query = get_boards_query(**kwargs) + def fetch_boards(self, limit: int = None, page: int = None, ids: List[int] = None, board_kind: BoardKind = None, state: BoardState = None, order_by: BoardsOrderBy = None): + query = get_boards_query(limit, page, ids, board_kind, state, order_by) return self.client.execute(query) def fetch_boards_by_id(self, board_ids):