From 860da9f29bbd4ae549aa1f79a8595d8ad41089dd Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Sun, 19 Jan 2025 01:25:15 +0000 Subject: [PATCH 1/4] Enable to get items considering with Alias name This commit update /entity/api/v2 API handler to be able to get item considering with related item. --- CHANGELOG.md | 2 ++ entity/api_v2/views.py | 15 ++++++++++++++- entity/tests/test_api_v2.py | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3fcc61e9..8b9434005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## In development ### Added +* Enable to get items considering with Alias name (by simple solution) + Contributed by @userlocalhost ### Changed diff --git a/entity/api_v2/views.py b/entity/api_v2/views.py index 495c000d6..1318fe0d0 100644 --- a/entity/api_v2/views.py +++ b/entity/api_v2/views.py @@ -192,11 +192,24 @@ def destroy(self, request: Request, *args, **kwargs) -> Response: return Response(status=status.HTTP_202_ACCEPTED) +class AliasSearchFilter(filters.SearchFilter): + def get_search_fields(self, view, request): + original_fields = super().get_search_fields(view, request) + + # update search_fields when "with_alias" parameter was specified + # to consier aliases that are related with target item + # filtered by specified "search" parameter + if request.query_params.get("with_alias"): + return original_fields + ["aliases__name"] + else: + return original_fields + + class EntityEntryAPI(viewsets.ModelViewSet): queryset = Entry.objects.all() pagination_class = PageNumberPagination permission_classes = [IsAuthenticated & EntityPermission] - filter_backends = [DjangoFilterBackend, filters.OrderingFilter, filters.SearchFilter] + filter_backends = [DjangoFilterBackend, filters.OrderingFilter, AliasSearchFilter] filterset_fields = ["is_active"] ordering_fields = ["name", "updated_time"] search_fields = ["name"] diff --git a/entity/tests/test_api_v2.py b/entity/tests/test_api_v2.py index 7c182f38a..ad06eb5ce 100644 --- a/entity/tests/test_api_v2.py +++ b/entity/tests/test_api_v2.py @@ -2902,6 +2902,23 @@ def test_list_entry_with_invalid_param(self): self.assertEqual(resp.status_code, 404) self.assertEqual(resp.json(), {"code": "AE-230000", "message": "Not found."}) + def test_list_entry_when_alias_is_related(self): + # create items and set alias at one of them + ALIAS_NAME = "test alias" + items = [self.add_entry(self.user, "e-%i" % i, self.entity) for i in range(3)] + items[0].add_alias(ALIAS_NAME) + + # search item by alias name + resp = self.client.get("/entity/api/v2/%d/entries/?search=%s&with_alias=1" % ( + self.entity.id, ALIAS_NAME + )) + self.assertEqual(resp.status_code, 200) + + # then only item that alias is set was returned + self.assertEqual(resp.json()["count"], 1) + self.assertEqual(resp.json()["results"][0]["name"], "e-0") + self.assertEqual(resp.json()["results"][0]["aliases"][0]["name"], ALIAS_NAME) + @mock.patch("entry.tasks.create_entry_v2.delay", mock.Mock(side_effect=create_entry_v2)) def test_create_entry(self): attr = {} From 64d2d37e1820d2488b6b4b1522b89f35c8a5833a Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Sun, 19 Jan 2025 19:07:32 +0000 Subject: [PATCH 2/4] Updated UI to be able to search item using alias at list page of alias --- entity/api_v2/views.py | 5 +++++ frontend/src/pages/ListAliasEntryPage.tsx | 10 ++++++---- frontend/src/repository/AironeApiClient.ts | 4 +++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/entity/api_v2/views.py b/entity/api_v2/views.py index 1318fe0d0..a6588b603 100644 --- a/entity/api_v2/views.py +++ b/entity/api_v2/views.py @@ -205,6 +205,11 @@ def get_search_fields(self, view, request): return original_fields +@extend_schema( + parameters=[ + OpenApiParameter("with_alias", OpenApiTypes.STR, OpenApiParameter.QUERY), + ], +) class EntityEntryAPI(viewsets.ModelViewSet): queryset = Entry.objects.all() pagination_class = PageNumberPagination diff --git a/frontend/src/pages/ListAliasEntryPage.tsx b/frontend/src/pages/ListAliasEntryPage.tsx index cb39688b5..7b28d0bad 100644 --- a/frontend/src/pages/ListAliasEntryPage.tsx +++ b/frontend/src/pages/ListAliasEntryPage.tsx @@ -50,10 +50,12 @@ export const ListAliasEntryPage: FC = ({}) => { }, [entityId]); useEffect(() => { - aironeApiClient.getEntries(entityId, true, page, query).then((res) => { - setEntries(res.results); - setTotalCount(res.count); - }); + aironeApiClient + .getEntries(entityId, true, page, query, true) + .then((res) => { + setEntries(res.results); + setTotalCount(res.count); + }); }, [page, query]); const handleChangeQuery = (newQuery?: string) => { diff --git a/frontend/src/repository/AironeApiClient.ts b/frontend/src/repository/AironeApiClient.ts index 673cbe4bc..6429fe8de 100644 --- a/frontend/src/repository/AironeApiClient.ts +++ b/frontend/src/repository/AironeApiClient.ts @@ -624,7 +624,8 @@ class AironeApiClient { entityId: number, isActive = true, pageNumber = 1, - keyword: string + keyword: string, + withAlias?: boolean ): Promise { //return await this.entry.entryApiV2EntriesList(entityId, isActive, pageNumber); // ToDo: This method must pass "isActive" parameter by manupirating DRF API's declaration. @@ -634,6 +635,7 @@ class AironeApiClient { isActive: isActive, search: keyword, ordering: "name", + withAlias: withAlias ? "1" : "", }); } From 594f831cab7c1220e657850735181c1194915720 Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Sun, 19 Jan 2025 19:10:08 +0000 Subject: [PATCH 3/4] Run ruff --fix to pass lint check at CI processing --- entity/tests/test_api_v2.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entity/tests/test_api_v2.py b/entity/tests/test_api_v2.py index ad06eb5ce..9badf0f55 100644 --- a/entity/tests/test_api_v2.py +++ b/entity/tests/test_api_v2.py @@ -2909,9 +2909,9 @@ def test_list_entry_when_alias_is_related(self): items[0].add_alias(ALIAS_NAME) # search item by alias name - resp = self.client.get("/entity/api/v2/%d/entries/?search=%s&with_alias=1" % ( - self.entity.id, ALIAS_NAME - )) + resp = self.client.get( + "/entity/api/v2/%d/entries/?search=%s&with_alias=1" % (self.entity.id, ALIAS_NAME) + ) self.assertEqual(resp.status_code, 200) # then only item that alias is set was returned From 6c021b20806a923d31cac127d142b4c3c80b44b6 Mon Sep 17 00:00:00 2001 From: Hiroyasu OHYAMA Date: Sun, 19 Jan 2025 19:16:42 +0000 Subject: [PATCH 4/4] Bump up pagoda-core react version because of updating EntityApiV2EntriesListRequest format --- apiclient/typescript-fetch/package.json | 2 +- package-lock.json | 14 +++++++------- package.json | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apiclient/typescript-fetch/package.json b/apiclient/typescript-fetch/package.json index 1d2942ede..9bacdba08 100644 --- a/apiclient/typescript-fetch/package.json +++ b/apiclient/typescript-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@dmm-com/airone-apiclient-typescript-fetch", - "version": "0.2.2", + "version": "0.3.0", "description": "AirOne APIv2 client in TypeScript", "main": "src/autogenerated/index.ts", "scripts": { diff --git a/package-lock.json b/package-lock.json index 32306a4f2..0385dabfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@date-io/date-fns": "^1.3.13", - "@dmm-com/airone-apiclient-typescript-fetch": "^0.2.2", + "@dmm-com/airone-apiclient-typescript-fetch": "^0.3.0", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0", @@ -2021,9 +2021,9 @@ } }, "node_modules/@dmm-com/airone-apiclient-typescript-fetch": { - "version": "0.2.2", - "resolved": "https://npm.pkg.github.com/download/@dmm-com/airone-apiclient-typescript-fetch/0.2.2/b74690d0a2f1ceed6d80705dcb48b0ba75a973df", - "integrity": "sha512-LeNIh/OnT4wBcF+kbWEYch+ovLId2dVqBIDREgm279mRv8KuLzwEsAb1ghqtXNzZPLZ0nHKD/mdwJckck51xXg==", + "version": "0.3.0", + "resolved": "https://npm.pkg.github.com/download/@dmm-com/airone-apiclient-typescript-fetch/0.3.0/978eb71cd20d8dd3379b13cb1ac5ca206caad56f", + "integrity": "sha512-jQ2GS4XSWbEgJppLA0fw2PCt6wkEbBGmfYYyxzngfafXtqlEpnKwk7RJK//10GmBak5Q3tUtBld/Nc4akzIW9Q==", "dev": true, "license": "ISC" }, @@ -19338,9 +19338,9 @@ "dev": true }, "@dmm-com/airone-apiclient-typescript-fetch": { - "version": "0.2.2", - "resolved": "https://npm.pkg.github.com/download/@dmm-com/airone-apiclient-typescript-fetch/0.2.2/b74690d0a2f1ceed6d80705dcb48b0ba75a973df", - "integrity": "sha512-LeNIh/OnT4wBcF+kbWEYch+ovLId2dVqBIDREgm279mRv8KuLzwEsAb1ghqtXNzZPLZ0nHKD/mdwJckck51xXg==", + "version": "0.3.0", + "resolved": "https://npm.pkg.github.com/download/@dmm-com/airone-apiclient-typescript-fetch/0.3.0/978eb71cd20d8dd3379b13cb1ac5ca206caad56f", + "integrity": "sha512-jQ2GS4XSWbEgJppLA0fw2PCt6wkEbBGmfYYyxzngfafXtqlEpnKwk7RJK//10GmBak5Q3tUtBld/Nc4akzIW9Q==", "dev": true }, "@dnd-kit/accessibility": { diff --git a/package.json b/package.json index 28a71dfe1..26c68a493 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-react": "^7.12.10", "@date-io/date-fns": "^1.3.13", - "@dmm-com/airone-apiclient-typescript-fetch": "^0.2.2", + "@dmm-com/airone-apiclient-typescript-fetch": "^0.3.0", "@dnd-kit/core": "^6.1.0", "@dnd-kit/modifiers": "^7.0.0", "@dnd-kit/sortable": "^8.0.0",