Skip to content

Commit 1f594a4

Browse files
authored
Feature/create board by workspace (#60)
* Added "create board by workspace id" * Update readme * Added missing type hints * Updated test * More custom type hints * Type hints for 'get_boards_query' * Fixed tests * Updated Readme and 'fetch_boards' method
1 parent 5562f84 commit 1f594a4

6 files changed

Lines changed: 121 additions & 11 deletions

File tree

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,23 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a
5757

5858

5959
#### Boards Resource (monday.boards)
60-
- `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.
60+
- `fetch_boards(**kwargs)` - Fetch boards associated with an account. Returns boards and their groups, tags, and columns. Accepts keyword arguments:
61+
- `limit` - The number of boards returned (*int*. Default is 25).
62+
- `page` - The page number returned, should you implement pagination(*int*. Starts at 1).
63+
- `ids` - A list of the unique board identifier(s) (*List[int]*).
64+
- `board_kind` - The board's kind (*BoardKind*. public / private / share).
65+
- `state` - The state of the board (*BoardState*. all / active / archived / deleted. Default is active).
66+
- `order_by` - The order in which to retrieve your boards (*BoardsOrderBy*. created_at / used_at).
67+
6168

6269
- `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.
6370

6471
- `fetch_columns_by_board_id([board_ids])` - Get all columns, as well as their ids, types, and settings. Accepts a comma separated list of board ids.
6572

6673
- `fetch_items_by_board_id([board_ids])` - Get all items on a board(s). Accepts a comma separated list of board ids.
6774

75+
- `create_board(board_name, board_kind, workspace_id)` - Create board with the given name and kind by (and optional) workspace id.
76+
6877

6978
#### Users Resource (monday.users)
7079
- `fetch_users(**kwargs)` - Fetch user information associated with an account. See Monday API docs for a list of accepted keyword arguments.

monday/query_joins.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1+
from enum import Enum
12
import json
3+
from typing import List
4+
from monday.resources.types import BoardKind, BoardState, BoardsOrderBy
25

36
from monday.utils import monday_json_stringify
47

@@ -311,7 +314,18 @@ def get_board_items_query(board_id):
311314
return query
312315

313316

314-
def get_boards_query(**kwargs):
317+
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):
318+
parameters = locals().items()
319+
query_params = []
320+
for k, v in parameters:
321+
if v is not None:
322+
value = v
323+
if isinstance(v, Enum):
324+
value = v.value
325+
326+
query_params.append("%s: %s" % (k, value))
327+
328+
315329
query = '''query
316330
{
317331
boards (%s) {
@@ -332,7 +346,8 @@ def get_boards_query(**kwargs):
332346
type
333347
}
334348
}
335-
}''' % ', '.join(["%s: %s" % (arg, kwargs.get(arg)) for arg in kwargs])
349+
}''' % ', '.join(query_params)
350+
336351
return query
337352

338353

@@ -381,6 +396,18 @@ def get_columns_by_board_query(board_ids):
381396
}''' % board_ids
382397

383398

399+
def create_board_by_workspace_query(board_name: str, board_kind: BoardKind, workspace_id = None) -> str:
400+
workspace_query = f'workspace_id: {workspace_id}' if workspace_id else ''
401+
query = '''
402+
mutation {
403+
create_board (board_name:"%s", board_kind: %s, %s) {
404+
id
405+
}
406+
}
407+
''' % (board_name, board_kind.value, workspace_query)
408+
return query
409+
410+
384411
# USER RESOURCE QUERIES
385412
def get_users_query(**kwargs):
386413
query = '''query

monday/resources/boards.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1+
from typing import List
12
from monday.resources.base import BaseResource
2-
from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \
3-
get_columns_by_board_query
3+
from monday.query_joins import (
4+
get_boards_query,
5+
get_boards_by_id_query,
6+
get_board_items_query,
7+
get_columns_by_board_query,
8+
create_board_by_workspace_query,
9+
)
10+
from monday.resources.types import BoardKind, BoardState, BoardsOrderBy
411

512

613
class BoardResource(BaseResource):
714
def __init__(self, token):
815
super().__init__(token)
916

10-
def fetch_boards(self, **kwargs):
11-
query = get_boards_query(**kwargs)
17+
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):
18+
query = get_boards_query(limit, page, ids, board_kind, state, order_by)
1219
return self.client.execute(query)
1320

1421
def fetch_boards_by_id(self, board_ids):
@@ -22,3 +29,7 @@ def fetch_items_by_board_id(self, board_ids):
2229
def fetch_columns_by_board_id(self, board_ids):
2330
query = get_columns_by_board_query(board_ids)
2431
return self.client.execute(query)
32+
33+
def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: int = None):
34+
query = create_board_by_workspace_query(board_name, board_kind, workspace_id)
35+
return self.client.execute(query)

monday/resources/types.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from enum import Enum
2+
3+
4+
class BoardKind(Enum):
5+
"""Board kinds"""
6+
7+
PUBLIC = "public"
8+
PRIVATE = "private"
9+
SHARE = "share"
10+
11+
12+
class BoardState(Enum):
13+
"""Board available states"""
14+
15+
ALL = "all"
16+
ACTIVE = "active"
17+
ARCHIVED = "archived"
18+
DELETED = "deleted"
19+
20+
21+
class BoardsOrderBy(Enum):
22+
"""Order to retrieve boards"""
23+
24+
CREATED_AT = "created_at"
25+
USED_AT = "used_at"

monday/tests/test_board_resource.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from monday.tests.test_case_resource import BaseTestCase
2-
from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \
2+
from monday.query_joins import create_board_by_workspace_query, get_boards_query, get_boards_by_id_query, get_board_items_query, \
33
get_columns_by_board_query
44

55

@@ -8,8 +8,29 @@ def setUp(self):
88
super(BoardTestCase, self).setUp()
99

1010
def test_get_boards_query(self):
11-
query = get_boards_query(board_kind=self.board_kind)
12-
self.assertIn(self.board_kind, query)
11+
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)
12+
self.assertIn('1', query_a)
13+
self.assertIn('2', query_a)
14+
self.assertIn('[888, 999]', query_a)
15+
self.assertNotIn(str(self.board_kind), query_a)
16+
self.assertIn(str(self.board_kind.value), query_a)
17+
self.assertNotIn(str(self.board_state), query_a)
18+
self.assertIn(str(self.board_state.value), query_a)
19+
self.assertNotIn(str(self.boards_order_by), query_a)
20+
self.assertIn(str(self.boards_order_by.value), query_a)
21+
22+
query_b = get_boards_query(board_kind=self.board_kind)
23+
self.assertNotIn(str(self.board_kind), query_b)
24+
self.assertIn(str(self.board_kind.value), query_b)
25+
26+
query_c = get_boards_query(limit=1,state=self.board_state)
27+
self.assertIn('1', query_c)
28+
self.assertNotIn(str(self.board_state), query_c)
29+
self.assertIn(str(self.board_state.value), query_c)
30+
self.assertNotIn(str(self.board_kind), query_c)
31+
self.assertNotIn(str(self.boards_order_by), query_c)
32+
33+
1334

1435
def test_get_boards_by_id_query(self):
1536
query = get_boards_by_id_query(board_ids=self.board_id)
@@ -22,3 +43,15 @@ def test_get_board_items_query(self):
2243
def test_get_columns_by_board_query(self):
2344
query = get_columns_by_board_query(board_ids=self.board_id)
2445
self.assertIn(str(self.board_id), query)
46+
47+
def test_create_board_by_workspace_query(self):
48+
query_a = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind, workspace_id=self.workspace_id)
49+
self.assertIn(str(self.board_name), query_a)
50+
self.assertNotIn(str(self.board_kind), query_a)
51+
self.assertIn(str(self.board_kind.value), query_a)
52+
self.assertIn(str(self.workspace_id), query_a)
53+
query_b = create_board_by_workspace_query(board_name=self.board_name, board_kind=self.board_kind)
54+
self.assertIn(str(self.board_name), query_b)
55+
self.assertNotIn(str(self.board_kind), query_b)
56+
self.assertIn(str(self.board_kind.value), query_b)
57+
self.assertNotIn(str(self.workspace_id), query_b)

monday/tests/test_case_resource.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import unittest
22

3+
from monday.resources.types import BoardKind, BoardState, BoardsOrderBy
4+
35

46
class BaseTestCase(unittest.TestCase):
57

68
def setUp(self):
79
self.group_name = "my_group"
810
self.item_name = "Nerd"
911
self.item_id = 24
12+
self.board_name = "my_board"
1013
self.board_id = 12
11-
self.board_kind = "public"
14+
self.board_kind = BoardKind.PUBLIC
15+
self.board_state = BoardState.ACTIVE
16+
self.boards_order_by = BoardsOrderBy.USED_AT
1217
self.group_id = 7
1318
self.column_id = "file_column"
1419
self.user_ids = [1287123, 1230919]

0 commit comments

Comments
 (0)