diff --git a/darwin/future/core/items/set_item_layout.py b/darwin/future/core/items/set_item_layout.py new file mode 100644 index 000000000..7ca4fdc85 --- /dev/null +++ b/darwin/future/core/items/set_item_layout.py @@ -0,0 +1,29 @@ +from __future__ import annotations + +from darwin.future.core.client import ClientCore +from darwin.future.core.types.common import JSONType +from darwin.future.data_objects.item import ItemLayout + + +def set_item_layout( + client: ClientCore, + team_slug: str, + dataset_ids: int | list[int], + layout: ItemLayout, + params: JSONType, +) -> JSONType: + assert ( + params + ), "No parameters provided, please provide at least one non-dataset id filter" + assert isinstance(params, dict), "Parameters must be a dictionary of filters" + payload = { + "filters": { + "dataset_ids": dataset_ids + if isinstance(dataset_ids, list) + else [dataset_ids], + **params, + }, + "layout": dict(layout), + } + + return client.post(f"/v2/teams/{team_slug}/items/layout", data=payload) diff --git a/darwin/future/tests/core/items/fixtures.py b/darwin/future/tests/core/items/fixtures.py index b0fcb9402..92d57a026 100644 --- a/darwin/future/tests/core/items/fixtures.py +++ b/darwin/future/tests/core/items/fixtures.py @@ -3,7 +3,14 @@ import pytest -from darwin.future.data_objects.item import Folder, Item +from darwin.future.data_objects.item import Folder, Item, ItemLayout + + +@pytest.fixture +def base_layout() -> ItemLayout: + return ItemLayout( + slots=["slot1", "slot2"], type="grid", layout_shape=[2, 1], version=2 + ) @pytest.fixture diff --git a/darwin/future/tests/core/items/test_set_item_layout.py b/darwin/future/tests/core/items/test_set_item_layout.py new file mode 100644 index 000000000..98cb9ba1f --- /dev/null +++ b/darwin/future/tests/core/items/test_set_item_layout.py @@ -0,0 +1,86 @@ +import pytest +import responses +from requests import HTTPError + +from darwin.future.core.client import ClientCore +from darwin.future.core.items.set_item_layout import set_item_layout +from darwin.future.core.types.common import JSONType +from darwin.future.data_objects.item import ItemLayout +from darwin.future.tests.core.fixtures import * +from darwin.future.tests.core.items.fixtures import * + + +@responses.activate +def test_set_item_layout_returns_blank_object( + base_client: ClientCore, base_layout: ItemLayout +) -> None: + dataset_ids = [1, 2, 3] + params = {"param1": "value1", "param2": "value2"} + team_slug = "my_team" + responses.add( + responses.POST, + f"{base_client.config.api_endpoint}v2/teams/{team_slug}/items/layout", + json={}, + status=200, + ) + + response = set_item_layout(base_client, team_slug, dataset_ids, base_layout, params) + + assert response == {} + + +@responses.activate +def test_set_item_layout_raises_on_incorrect_parameters( + base_client: ClientCore, base_layout: ItemLayout +) -> None: + team_slug = "my_team" + dataset_ids = [1, 2, 3] + params: JSONType = {} + + with pytest.raises(AssertionError): + set_item_layout(base_client, team_slug, dataset_ids, base_layout, params) + + +@responses.activate +def test_set_item_layout_raises_on_4xx_status_code( + base_client: ClientCore, base_layout: ItemLayout +) -> None: + team_slug = "my_team" + dataset_ids = [1, 2, 3] + params = {"param1": "value1", "param2": "value2"} + + responses.add( + responses.POST, + f"{base_client.config.api_endpoint}v2/teams/{team_slug}/items/layout", + json={"error": "Bad Request"}, + status=400, + ) + + with pytest.raises(HTTPError): + set_item_layout(base_client, team_slug, dataset_ids, base_layout, params) + + +@responses.activate +def test_set_item_layout_sends_correct_payload( + base_client: ClientCore, base_layout: ItemLayout +) -> None: + team_slug = "my_team" + dataset_ids = [1, 2, 3] + params = {"param1": "value1", "param2": "value2"} + + responses.add( + responses.POST, + f"{base_client.config.api_endpoint}v2/teams/{team_slug}/items/layout", + json={}, + status=200, + match=[ + responses.json_params_matcher( + { + "filters": {"dataset_ids": dataset_ids, **params}, + "layout": dict(base_layout), + } + ) + ], + ) + + set_item_layout(base_client, team_slug, dataset_ids, base_layout, params)