From dca5fda5b33fd089d680323d590e0258aded8f76 Mon Sep 17 00:00:00 2001 From: John Wilkie Date: Fri, 10 Nov 2023 14:55:21 +0000 Subject: [PATCH 1/6] Fixed missing path parameter in core move items to folder method --- darwin/future/core/items/move_items_to_folder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/darwin/future/core/items/move_items_to_folder.py b/darwin/future/core/items/move_items_to_folder.py index db8c5c0cf..f84caaccb 100644 --- a/darwin/future/core/items/move_items_to_folder.py +++ b/darwin/future/core/items/move_items_to_folder.py @@ -45,6 +45,7 @@ def move_list_of_items_to_folder( else [dataset_ids], **filters, } + "path": path, } return client.post(f"/v2/teams/{team_slug}/items/path", data=payload) From ec09e4995cdf75bb9e23bc5f11cefc806dde2324 Mon Sep 17 00:00:00 2001 From: John Wilkie Date: Fri, 10 Nov 2023 14:57:46 +0000 Subject: [PATCH 2/6] Fixed missing priority parameter in core set item priority method --- darwin/future/core/items/set_item_priority.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/darwin/future/core/items/set_item_priority.py b/darwin/future/core/items/set_item_priority.py index b81bf5ccc..888686999 100644 --- a/darwin/future/core/items/set_item_priority.py +++ b/darwin/future/core/items/set_item_priority.py @@ -42,7 +42,8 @@ def set_item_priority( if isinstance(dataset_ids, list) else [dataset_ids], **filters, - } + }, + "priority": priority, } return client.post( From 49209eda27253b0a3d6227bc7cdb6edc5a896ef9 Mon Sep 17 00:00:00 2001 From: John Wilkie Date: Fri, 10 Nov 2023 15:03:55 +0000 Subject: [PATCH 3/6] Linting --- darwin/future/core/items/move_items_to_folder.py | 2 +- darwin/future/tests/core/datasets/test_list_datasets.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/darwin/future/core/items/move_items_to_folder.py b/darwin/future/core/items/move_items_to_folder.py index f84caaccb..04296d137 100644 --- a/darwin/future/core/items/move_items_to_folder.py +++ b/darwin/future/core/items/move_items_to_folder.py @@ -44,7 +44,7 @@ def move_list_of_items_to_folder( if isinstance(dataset_ids, list) else [dataset_ids], **filters, - } + }, "path": path, } diff --git a/darwin/future/tests/core/datasets/test_list_datasets.py b/darwin/future/tests/core/datasets/test_list_datasets.py index 58177b185..b31cb5713 100644 --- a/darwin/future/tests/core/datasets/test_list_datasets.py +++ b/darwin/future/tests/core/datasets/test_list_datasets.py @@ -45,4 +45,4 @@ def test_it_returns_an_error_if_the_client_returns_an_http_error( with pytest.raises(BadRequest) as execinfo: list_datasets(base_client) - assert execinfo.value.args[0].status_code == 400 + assert execinfo.value.args[0].status_code == 400 From 54880d358a7720a09179a0298d7dbb330fce6260 Mon Sep 17 00:00:00 2001 From: John Wilkie Date: Mon, 13 Nov 2023 16:05:36 +0000 Subject: [PATCH 4/6] Meta Item & ItemQuery functions to move between folders --- darwin/future/meta/objects/item.py | 13 +++++++ darwin/future/meta/queries/item.py | 22 +++++++++++ .../tests/meta/objects/test_itemmeta.py | 25 +++++++++++++ darwin/future/tests/meta/queries/test_item.py | 37 +++++++++++++++++++ 4 files changed, 97 insertions(+) diff --git a/darwin/future/meta/objects/item.py b/darwin/future/meta/objects/item.py index 7b438f721..33422e13c 100644 --- a/darwin/future/meta/objects/item.py +++ b/darwin/future/meta/objects/item.py @@ -4,6 +4,7 @@ from uuid import UUID from darwin.future.core.items.delete_items import delete_list_of_items +from darwin.future.core.items.move_items_to_folder import move_list_of_items_to_folder from darwin.future.data_objects.item import ItemCore, ItemLayout, ItemSlot from darwin.future.meta.objects.base import MetaBase @@ -53,6 +54,18 @@ def delete(self) -> None: filters = {"item_ids": [str(self.id)]} delete_list_of_items(self.client, team_slug, dataset_id, filters) + def move_to_folder(self, path: str) -> None: + team_slug, dataset_id = ( + self.meta_params["team_slug"], + self.meta_params["dataset_id"] + if "dataset_id" in self.meta_params + else self.meta_params["dataset_ids"], + ) + assert isinstance(team_slug, str) + dataset_id = cast(Union[int, List[int]], dataset_id) + filters = {"item_ids": [str(self.id)]} + move_list_of_items_to_folder(self.client, team_slug, dataset_id, path, filters) + @property def name(self) -> str: return self._element.name diff --git a/darwin/future/meta/queries/item.py b/darwin/future/meta/queries/item.py index 5fd13e0e1..e2f120d9e 100644 --- a/darwin/future/meta/queries/item.py +++ b/darwin/future/meta/queries/item.py @@ -3,6 +3,7 @@ from darwin.future.core.items.delete_items import delete_list_of_items from darwin.future.core.items.get import list_items +from darwin.future.core.items.move_items_to_folder import move_list_of_items_to_folder from darwin.future.core.types.common import QueryString from darwin.future.core.types.query import PaginatedQuery from darwin.future.meta.objects.item import Item @@ -59,3 +60,24 @@ def delete(self) -> None: ids = [item.id for item in self] filters = {"item_ids": [str(item) for item in ids]} delete_list_of_items(self.client, team_slug, dataset_ids, filters) + + def move_to_folder(self, path) -> None: + if "team_slug" not in self.meta_params: + raise ValueError("Must specify team_slug to query items") + if ( + "dataset_ids" not in self.meta_params + and "dataset_id" not in self.meta_params + ): + raise ValueError("Must specify dataset_ids to query items") + if not path: + raise ValueError("Must specify path to move items to") + dataset_ids = ( + self.meta_params["dataset_ids"] + if "dataset_ids" in self.meta_params + else self.meta_params["dataset_id"] + ) + team_slug = self.meta_params["team_slug"] + self.collect_all() + ids = [item.id for item in self] + filters = {"item_ids": [str(item) for item in ids]} + move_list_of_items_to_folder(self.client, team_slug, dataset_ids, path, filters) diff --git a/darwin/future/tests/meta/objects/test_itemmeta.py b/darwin/future/tests/meta/objects/test_itemmeta.py index ada047eb2..34133da95 100644 --- a/darwin/future/tests/meta/objects/test_itemmeta.py +++ b/darwin/future/tests/meta/objects/test_itemmeta.py @@ -44,3 +44,28 @@ def test_delete(item: Item) -> None: json={}, ) item.delete() + + +def test_move_to_folder(item: Item) -> None: + with responses.RequestsMock() as rsps: + team_slug = item.meta_params["team_slug"] + dataset_id = item.meta_params["dataset_id"] + path = "/new_folder" + rsps.add( + rsps.POST, + item.client.config.api_endpoint + f"v2/teams/{team_slug}/items/path", + status=200, + match=[ + json_params_matcher( + { + "filters": { + "item_ids": [str(item.id)], + "dataset_ids": [dataset_id], + }, + "path": path, + } + ) + ], + json={}, + ) + item.move_to_folder(path) diff --git a/darwin/future/tests/meta/queries/test_item.py b/darwin/future/tests/meta/queries/test_item.py index 3824a8788..461a8becb 100644 --- a/darwin/future/tests/meta/queries/test_item.py +++ b/darwin/future/tests/meta/queries/test_item.py @@ -70,3 +70,40 @@ def test_delete( json={}, ) item_query.delete() + + +def test_move_tofolderS( + item_query: ItemQuery, items_json: List[dict], items: List[Item] +) -> None: + with responses.RequestsMock() as rsps: + rsps.add( + rsps.GET, + item_query.client.config.api_endpoint + "v2/teams/test/items", + match=[ + query_param_matcher( + {"page[offset]": "0", "page[size]": "500", "dataset_ids": "1"} + ) + ], + json={"items": items_json, "errors": []}, + ) + team_slug = items[0].meta_params["team_slug"] + dataset_id = items[0].meta_params["dataset_id"] + path = "/new_folder" + rsps.add( + rsps.POST, + items[0].client.config.api_endpoint + f"v2/teams/{team_slug}/items/path", + status=200, + match=[ + json_params_matcher( + { + "filters": { + "item_ids": [str(item.id) for item in items], + "dataset_ids": [dataset_id], + }, + "path": path, + } + ) + ], + json={}, + ) + item_query.move_to_folder(path) From da5269a18179392ff16c2d609426f561cd37878b Mon Sep 17 00:00:00 2001 From: John Wilkie <124276291+JBWilkie@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:22:16 +0000 Subject: [PATCH 5/6] Update darwin/future/tests/meta/queries/test_item.py Co-authored-by: Owen Jones --- darwin/future/tests/meta/queries/test_item.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/darwin/future/tests/meta/queries/test_item.py b/darwin/future/tests/meta/queries/test_item.py index 461a8becb..dba226cb7 100644 --- a/darwin/future/tests/meta/queries/test_item.py +++ b/darwin/future/tests/meta/queries/test_item.py @@ -72,7 +72,7 @@ def test_delete( item_query.delete() -def test_move_tofolderS( +def test_move_to_folders( item_query: ItemQuery, items_json: List[dict], items: List[Item] ) -> None: with responses.RequestsMock() as rsps: From 5ab44b09ac5e9cbc5cec686a47d1ba741f25aa1c Mon Sep 17 00:00:00 2001 From: John Wilkie Date: Mon, 13 Nov 2023 21:35:54 +0000 Subject: [PATCH 6/6] Added sad path tests --- .../tests/meta/objects/test_itemmeta.py | 28 +++++++++++++ darwin/future/tests/meta/queries/test_item.py | 41 ++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/darwin/future/tests/meta/objects/test_itemmeta.py b/darwin/future/tests/meta/objects/test_itemmeta.py index 34133da95..39fe840e0 100644 --- a/darwin/future/tests/meta/objects/test_itemmeta.py +++ b/darwin/future/tests/meta/objects/test_itemmeta.py @@ -1,9 +1,11 @@ from uuid import UUID +import pytest import responses from responses import json_params_matcher from darwin.future.data_objects.item import ItemLayout, ItemSlot +from darwin.future.exceptions import BadRequest from darwin.future.meta.objects.item import Item from darwin.future.tests.meta.objects.fixtures import * @@ -69,3 +71,29 @@ def test_move_to_folder(item: Item) -> None: json={}, ) item.move_to_folder(path) + + +def test_move_to_folder_raises_on_incorrect_parameters(item: Item) -> None: + with responses.RequestsMock() as rsps: + team_slug = item.meta_params["team_slug"] + dataset_id = item.meta_params["dataset_id"] + path = 1234 + rsps.add( + rsps.POST, + item.client.config.api_endpoint + f"v2/teams/{team_slug}/items/path", + status=400, + match=[ + json_params_matcher( + { + "filters": { + "item_ids": [str(item.id)], + "dataset_ids": [dataset_id], + }, + "path": path, + } + ) + ], + json={}, + ) + with pytest.raises(BadRequest): + item.move_to_folder(path) diff --git a/darwin/future/tests/meta/queries/test_item.py b/darwin/future/tests/meta/queries/test_item.py index dba226cb7..314a353c8 100644 --- a/darwin/future/tests/meta/queries/test_item.py +++ b/darwin/future/tests/meta/queries/test_item.py @@ -5,6 +5,7 @@ from responses.matchers import json_params_matcher, query_param_matcher from darwin.future.core.client import ClientCore +from darwin.future.exceptions import BadRequest from darwin.future.meta.objects.item import Item from darwin.future.meta.queries.item import ItemQuery from darwin.future.tests.core.fixtures import * @@ -72,7 +73,7 @@ def test_delete( item_query.delete() -def test_move_to_folders( +def test_move_to_folder( item_query: ItemQuery, items_json: List[dict], items: List[Item] ) -> None: with responses.RequestsMock() as rsps: @@ -107,3 +108,41 @@ def test_move_to_folders( json={}, ) item_query.move_to_folder(path) + + +def test_move_to_folder_raises_on_incorrect_parameters( + item_query: ItemQuery, items_json: List[dict], items: List[Item] +) -> None: + with responses.RequestsMock() as rsps: + rsps.add( + rsps.GET, + item_query.client.config.api_endpoint + "v2/teams/test/items", + match=[ + query_param_matcher( + {"page[offset]": "0", "page[size]": "500", "dataset_ids": "1"} + ) + ], + json={"items": items_json, "errors": []}, + ) + team_slug = items[0].meta_params["team_slug"] + dataset_id = items[0].meta_params["dataset_id"] + path = 1234 + rsps.add( + rsps.POST, + items[0].client.config.api_endpoint + f"v2/teams/{team_slug}/items/path", + status=400, + match=[ + json_params_matcher( + { + "filters": { + "item_ids": [str(item.id) for item in items], + "dataset_ids": [dataset_id], + }, + "path": path, + } + ) + ], + json={}, + ) + with pytest.raises(BadRequest): + item_query.move_to_folder(path)