From 552fe077cc1522d0dbb268385031e79e4aea36f6 Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:21:51 +0100 Subject: [PATCH 1/7] Replace deprecated `Model.construct` --- lib/galaxy/webapps/galaxy/api/histories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/api/histories.py b/lib/galaxy/webapps/galaxy/api/histories.py index c8b23b35c78a..410a62410dd1 100644 --- a/lib/galaxy/webapps/galaxy/api/histories.py +++ b/lib/galaxy/webapps/galaxy/api/histories.py @@ -191,7 +191,7 @@ def index( trans, serialization_params, filter_query_params, deleted_only=deleted, all_histories=all ) else: - payload = HistoryIndexQueryPayload.construct( + payload = HistoryIndexQueryPayload.model_construct( show_own=show_own, show_published=show_published, show_shared=show_shared, From 4fb3cbcd0e0c3bbd6e05b660c67ed4b49d9f8d5a Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:41:02 +0100 Subject: [PATCH 2/7] Fix missing serialization_params when listing histories in "query mode" --- lib/galaxy/webapps/galaxy/api/histories.py | 4 +++- lib/galaxy/webapps/galaxy/services/histories.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/api/histories.py b/lib/galaxy/webapps/galaxy/api/histories.py index 410a62410dd1..743d31a48ccb 100644 --- a/lib/galaxy/webapps/galaxy/api/histories.py +++ b/lib/galaxy/webapps/galaxy/api/histories.py @@ -201,7 +201,9 @@ def index( offset=offset, search=search, ) - entries, total_matches = self.service.index_query(trans, payload, include_total_count=True) + entries, total_matches = self.service.index_query( + trans, payload, serialization_params, include_total_count=True + ) response.headers["total_matches"] = str(total_matches) return entries diff --git a/lib/galaxy/webapps/galaxy/services/histories.py b/lib/galaxy/webapps/galaxy/services/histories.py index ab3fe0e69dc0..f759c97fa353 100644 --- a/lib/galaxy/webapps/galaxy/services/histories.py +++ b/lib/galaxy/webapps/galaxy/services/histories.py @@ -216,6 +216,7 @@ def index_query( self, trans, payload: HistoryIndexQueryPayload, + serialization_params: SerializationParams, include_total_count: bool = False, ) -> Tuple[List[AnyHistoryView], int]: """Return a list of History accessible by the user @@ -223,7 +224,6 @@ def index_query( :rtype: list :returns: dictionaries containing History details """ - serialization_params = SerializationParams(default_view="detailed") entries, total_matches = self.manager.index_query(trans, payload, include_total_count) return ( [self._serialize_history(trans, entry, serialization_params) for entry in entries], From 2289f6766d0a48590c37b187c5c54889b5522787 Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:42:15 +0100 Subject: [PATCH 3/7] Use summary view in the rest of history lists --- client/src/components/Grid/configs/histories.ts | 1 + client/src/components/Grid/configs/historiesShared.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/client/src/components/Grid/configs/histories.ts b/client/src/components/Grid/configs/histories.ts index 8216cda71560..08201f24be0a 100644 --- a/client/src/components/Grid/configs/histories.ts +++ b/client/src/components/Grid/configs/histories.ts @@ -32,6 +32,7 @@ type SortKeyLiteral = "create_time" | "name" | "update_time" | undefined; */ async function getData(offset: number, limit: number, search: string, sort_by: string, sort_desc: boolean) { const { data, headers } = await historiesFetcher({ + view: "summary", limit, offset, search, diff --git a/client/src/components/Grid/configs/historiesShared.ts b/client/src/components/Grid/configs/historiesShared.ts index 65a65e8a54ac..df3fc1164381 100644 --- a/client/src/components/Grid/configs/historiesShared.ts +++ b/client/src/components/Grid/configs/historiesShared.ts @@ -22,6 +22,7 @@ type SortKeyLiteral = "create_time" | "name" | "update_time" | undefined; */ async function getData(offset: number, limit: number, search: string, sort_by: string, sort_desc: boolean) { const { data, headers } = await historiesFetcher({ + view: "summary", limit, offset, search, From b77ee5c54175d455c427ab6efd5214289b7574ba Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 14 Mar 2024 17:36:21 +0100 Subject: [PATCH 4/7] Set the default view as summary in index_query For consistency with the existing history index action. --- lib/galaxy/webapps/galaxy/services/histories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/services/histories.py b/lib/galaxy/webapps/galaxy/services/histories.py index f759c97fa353..3d75284d07ed 100644 --- a/lib/galaxy/webapps/galaxy/services/histories.py +++ b/lib/galaxy/webapps/galaxy/services/histories.py @@ -226,7 +226,7 @@ def index_query( """ entries, total_matches = self.manager.index_query(trans, payload, include_total_count) return ( - [self._serialize_history(trans, entry, serialization_params) for entry in entries], + [self._serialize_history(trans, entry, serialization_params, default_view="summary") for entry in entries], total_matches, ) From 216036cbdd0e52141f3ab208a4582b3ef9b2163d Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Thu, 14 Mar 2024 17:45:14 +0100 Subject: [PATCH 5/7] Add API tests for history index serialization In both modes --- lib/galaxy_test/api/test_histories.py | 50 +++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/lib/galaxy_test/api/test_histories.py b/lib/galaxy_test/api/test_histories.py index e263423b2b58..94aabebf5d8b 100644 --- a/lib/galaxy_test/api/test_histories.py +++ b/lib/galaxy_test/api/test_histories.py @@ -140,6 +140,56 @@ def test_index_query(self): assert len(index_response) == 1 assert index_response[0]["name"] == expected_history_name + def test_index_views(self): + # Make sure there is at least one history + self._create_history(f"TestHistoryForViews_{uuid4()}")["id"] + # By default the view is summary + index_response = self._get("histories").json() + for history in index_response: + assert "state" not in history + + # Change the view to detailed + index_response = self._get("histories?view=detailed").json() + for history in index_response: + assert "state" in history + + # Expect only specific keys + expected_keys = ["name"] + unexpected_keys = ["id", "deleted", "state"] + index_response = self._get(f"histories?keys={','.join(expected_keys)}").json() + for history in index_response: + for key in expected_keys: + assert key in history + for key in unexpected_keys: + assert key not in history + + def test_index_search_mode_views(self): + # Make sure there is at least one history + expected_name_contains = "SearchMode" + self._create_history(f"TestHistory{expected_name_contains}_{uuid4()}")["id"] + # By default the view is summary + data = dict(search=expected_name_contains, show_published=False) + index_response = self._get("histories", data=data).json() + for history in index_response: + assert "state" not in history + + # Change the view to detailed + data = dict(search=expected_name_contains, show_published=False) + index_response = self._get("histories?view=detailed", data=data).json() + for history in index_response: + assert "state" in history + + # Expect only specific keys + expected_keys = ["name"] + unexpected_keys = ["id", "deleted", "state"] + data = dict(search=expected_name_contains, show_published=False, keys=",".join(expected_keys)) + index_response = self._get("histories", data=data).json() + for history in index_response: + for key in expected_keys: + assert key in history + for key in unexpected_keys: + assert key not in history + def test_index_case_insensitive_contains_query(self): # Create the histories with a different user to ensure the test # is not conflicted with the current user's histories. From a7ea52841748437acfb172e11f513eed6f2fcceb Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Fri, 15 Mar 2024 13:10:36 +0100 Subject: [PATCH 6/7] Temporarily avoid checking id not present in API test Until the HistoryMinimal model gets replaced by the CustomHistory again. --- lib/galaxy_test/api/test_histories.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/galaxy_test/api/test_histories.py b/lib/galaxy_test/api/test_histories.py index 94aabebf5d8b..a3c8e28a9f89 100644 --- a/lib/galaxy_test/api/test_histories.py +++ b/lib/galaxy_test/api/test_histories.py @@ -155,7 +155,7 @@ def test_index_views(self): # Expect only specific keys expected_keys = ["name"] - unexpected_keys = ["id", "deleted", "state"] + unexpected_keys = ["deleted", "state"] index_response = self._get(f"histories?keys={','.join(expected_keys)}").json() for history in index_response: for key in expected_keys: @@ -181,7 +181,7 @@ def test_index_search_mode_views(self): # Expect only specific keys expected_keys = ["name"] - unexpected_keys = ["id", "deleted", "state"] + unexpected_keys = ["deleted", "state"] data = dict(search=expected_name_contains, show_published=False, keys=",".join(expected_keys)) index_response = self._get("histories", data=data).json() for history in index_response: From 3578159625585715ab1a3a7df0a6f93aa1c89269 Mon Sep 17 00:00:00 2001 From: davelopez <46503462+davelopez@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:19:39 +0100 Subject: [PATCH 7/7] Add missing keys expected by shared histories listing --- client/src/components/Grid/configs/historiesShared.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/components/Grid/configs/historiesShared.ts b/client/src/components/Grid/configs/historiesShared.ts index df3fc1164381..7052c4d3e356 100644 --- a/client/src/components/Grid/configs/historiesShared.ts +++ b/client/src/components/Grid/configs/historiesShared.ts @@ -23,6 +23,7 @@ type SortKeyLiteral = "create_time" | "name" | "update_time" | undefined; async function getData(offset: number, limit: number, search: string, sort_by: string, sort_desc: boolean) { const { data, headers } = await historiesFetcher({ view: "summary", + keys: "username,create_time", limit, offset, search,