From 0aba24317d2d620d7100a091b779a8c94f4aee1a Mon Sep 17 00:00:00 2001 From: Marlon Keating Date: Tue, 25 Jun 2024 22:20:18 +0000 Subject: [PATCH] feat: add get_content_filter_hash endpoint style: fix pycodestyle issues chore: pylint disable=no-member chore: pycodestyle fix chore: add bad json error handling for get_content_filter_hash chore: address review comments chore: pycodestyle space issue --- .../apps/api/v1/tests/test_views.py | 19 +++++++++++++++++++ enterprise_catalog/apps/api/v1/urls.py | 5 +++++ .../apps/api/v1/views/catalog_query.py | 15 ++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/enterprise_catalog/apps/api/v1/tests/test_views.py b/enterprise_catalog/apps/api/v1/tests/test_views.py index ab7b9e5b7..9c26487a1 100644 --- a/enterprise_catalog/apps/api/v1/tests/test_views.py +++ b/enterprise_catalog/apps/api/v1/tests/test_views.py @@ -2589,6 +2589,25 @@ def test_get_query_by_hash_requires_hash(self): response_json = response.json() assert response_json == ['You must provide at least one of the following query parameters: hash.'] + def test_get_content_filter_hash(self): + """ + Test that get content filter hash returns md5 hash of query + """ + url = reverse('api:v1:get-content-filter-hash') + test_query = json.dumps({"content_type": ["political", "unit", "market"]}) + response = self.client.generic('GET', url, content_type='application/json', data=test_query) + assert response.json() == '35584b583415a5bd4e51cc70d898a0eb' # pylint: disable=no-member + + def test_get_content_filter_hash_bad_query(self): + """ + Test that get content filter hash returns md5 hash of query + """ + url = reverse('api:v1:get-content-filter-hash') + test_query = 'bad query' + response = self.client.generic('GET', url, content_type='application/json', data=test_query) + err_detail = "Failed to parse catalog query: JSON parse error - Expecting value: line 1 column 1 (char 0)" + assert response.json() == {"detail": err_detail} # pylint: disable=no-member + def test_catalog_query_retrieve(self): """ Test that the Catalog Query viewset supports retrieving individual queries diff --git a/enterprise_catalog/apps/api/v1/urls.py b/enterprise_catalog/apps/api/v1/urls.py index 8d655f592..a42140a11 100644 --- a/enterprise_catalog/apps/api/v1/urls.py +++ b/enterprise_catalog/apps/api/v1/urls.py @@ -115,6 +115,11 @@ CatalogQueryViewSet.as_view({'get': 'get_query_by_hash'}), name='get-query-by-hash' ), + path( + 'catalog-queries/get_content_filter_hash', + CatalogQueryViewSet.as_view({'get': 'get_content_filter_hash'}), + name='get-content-filter-hash' + ), ] urlpatterns += router.urls diff --git a/enterprise_catalog/apps/api/v1/views/catalog_query.py b/enterprise_catalog/apps/api/v1/views/catalog_query.py index b20e855b6..23aa2e496 100644 --- a/enterprise_catalog/apps/api/v1/views/catalog_query.py +++ b/enterprise_catalog/apps/api/v1/views/catalog_query.py @@ -3,7 +3,7 @@ from edx_rbac.mixins import PermissionRequiredForListingMixin from rest_framework import viewsets from rest_framework.decorators import action -from rest_framework.exceptions import NotFound +from rest_framework.exceptions import NotFound, ParseError from rest_framework.renderers import JSONRenderer from rest_framework.response import Response @@ -24,6 +24,7 @@ enterprises_with_admin_access, has_access_to_all_enterprises, ) +from enterprise_catalog.apps.catalog.utils import get_content_filter_hash class CatalogQueryViewSet(viewsets.ReadOnlyModelViewSet, BaseViewSet, PermissionRequiredForListingMixin): @@ -106,3 +107,15 @@ def get_query_by_hash(self, request, **kwargs): raise NotFound('Catalog query not found.') from exc serialized_data = self.serializer_class(query) return Response(serialized_data.data) + + @action(detail=True, methods=['get']) + def get_content_filter_hash(self, request, **kwargs): + """ + Get md5 hash of a catalog query + """ + try: + content_filter = request.data + content_filter_hash = get_content_filter_hash(content_filter) + except ParseError as exc: + raise ParseError(f"Failed to parse catalog query: {exc}") from exc + return Response(content_filter_hash)