diff --git a/README.md b/README.md index 7720eb6..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. @@ -61,6 +68,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. diff --git a/monday/query_joins.py b/monday/query_joins.py index db34840..6284f10 100644 --- a/monday/query_joins.py +++ b/monday/query_joins.py @@ -1,4 +1,7 @@ +from enum import Enum import json +from typing import List +from monday.resources.types import BoardKind, BoardState, BoardsOrderBy from monday.utils import monday_json_stringify @@ -286,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) { @@ -307,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 @@ -356,6 +371,18 @@ def get_columns_by_board_query(board_ids): }''' % board_ids +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 { + create_board (board_name:"%s", board_kind: %s, %s) { + id + } + } + ''' % (board_name, board_kind.value, 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..d3a98f2 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,14 +1,21 @@ +from typing import List from monday.resources.base import BaseResource -from monday.query_joins import 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, 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): @@ -22,3 +29,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: 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..ba160e1 --- /dev/null +++ b/monday/resources/types.py @@ -0,0 +1,25 @@ +from enum import Enum + + +class BoardKind(Enum): + """Board kinds""" + + 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" diff --git a/monday/tests/test_board_resource.py b/monday/tests/test_board_resource.py index 3cd13fb..b549937 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 @@ -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) @@ -22,3 +43,15 @@ 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.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.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 d8ad9f0..f6a4d5c 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, BoardState, BoardsOrderBy + class BaseTestCase(unittest.TestCase): @@ -7,8 +9,11 @@ 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.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]