From b3f3764bdaaf5f58e57bb2a05f0839d2472ef6b5 Mon Sep 17 00:00:00 2001 From: etj Date: Mon, 17 Jul 2023 17:34:11 +0200 Subject: [PATCH] [Fixes #11273] Faceting: /facets loses some filters along the way --- geonode/facets/tests.py | 56 ++++++++++++++++++++++++++++++++++++++--- geonode/facets/views.py | 4 ++- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/geonode/facets/tests.py b/geonode/facets/tests.py index 50a7cef842c..127ada7cd7a 100644 --- a/geonode/facets/tests.py +++ b/geonode/facets/tests.py @@ -29,6 +29,7 @@ from geonode.base.models import Thesaurus, ThesaurusLabel, ThesaurusKeyword, ThesaurusKeywordLabel, ResourceBase, Region from geonode.facets.models import facet_registry +from geonode.facets.providers.baseinfo import FeaturedFacetProvider from geonode.facets.providers.region import RegionFacetProvider from geonode.tests.base import GeoNodeBaseTestSupport import geonode.facets.views as views @@ -136,13 +137,13 @@ def _create_resources(self): # RB19 -> T0K0 T0K1 FEAT if x % 2 == 1: - print(f"ADDING KEYWORDS {self.thesauri_k['0_0']} to RB {d}") + logger.debug(f"ADDING KEYWORDS {self.thesauri_k['0_0']} to RB {d}") d.tkeywords.add(self.thesauri_k["0_0"]) if x % 2 == 1 and x > 10: - print(f"ADDING KEYWORDS {self.thesauri_k['0_1']} to RB {d}") + logger.debug(f"ADDING KEYWORDS {self.thesauri_k['0_1']} to RB {d}") d.tkeywords.add(self.thesauri_k["0_1"]) if x < 10: - print(f"ADDING KEYWORDS {self.thesauri_k['1_0']} to RB {d}") + logger.debug(f"ADDING KEYWORDS {self.thesauri_k['1_0']} to RB {d}") d.tkeywords.add(self.thesauri_k["1_0"]) if 7 < x < 13: d.tkeywords.add(self.thesauri_k["1_1"]) @@ -335,6 +336,55 @@ def test_prefiltering(self): self.assertEqual(totals, obj["topics"]["total"], f"Bad totals for facet '{facet} and filter {filters}") self.assertEqual(count0, obj["topics"]["items"][0]["count"], f"Bad count0 for facet '{facet}") + def test_prefiltering_tkeywords(self): + regname = RegionFacetProvider().name + featname = FeaturedFacetProvider().name + t1filter = facet_registry.get_provider("t_1").get_info()["filter"] + tkey_1_1 = self.thesauri_k["1_1"].id + + expected_region = {"R1": 1} + expected_feat = {True: 2, False: 3} + + # Run the single requests + for facet, params, items in ( + (regname, {t1filter: tkey_1_1}, expected_region), + (featname, {t1filter: tkey_1_1}, expected_feat), + ): + req = self.rf.get(reverse("get_facet", args=[facet]), data=params) + res: JsonResponse = views.get_facet(req, facet) + obj = json.loads(res.content) + + self.assertEqual( + len(items), + len(obj["topics"]["items"]), + f"Bad count for items '{facet} \n PARAMS: {params} \n RESULT: {obj} \n EXPECTED: {items}", + ) + # search item + for item in items.keys(): + found = next((i for i in obj["topics"]["items"] if i["key"] == item), None) + self.assertIsNotNone(found, f"Topic '{item}' not found in facet {facet} -- {obj}") + self.assertEqual(items[item], found.get("count", None), f"Bad count for facet '{facet}:{item}") + + # Run the single request + req = self.rf.get(reverse("list_facets"), data={"include_topics": 1, t1filter: tkey_1_1}) + res: JsonResponse = views.list_facets(req) + obj = json.loads(res.content) + + facets_list = obj["facets"] + fmap = self._facets_to_map(facets_list) + + for name, items in ( + (regname, expected_region), + (featname, expected_feat), + ): + self.assertIn(name, fmap) + facet = fmap[name] + + for item in items.keys(): + found = next((i for i in facet["topics"]["items"] if i["key"] == item), None) + self.assertIsNotNone(found, f"Topic '{item}' not found in facet {facet} -- {facet}") + self.assertEqual(items[item], found.get("count", None), f"Bad count for facet '{facet}:{item}") + def test_config(self): for facet, type, order in ( ("resourcetype", None, None), diff --git a/geonode/facets/views.py b/geonode/facets/views.py index e3a8185ae4c..b6e876f1a4d 100644 --- a/geonode/facets/views.py +++ b/geonode/facets/views.py @@ -53,6 +53,7 @@ def list_facets(request, **kwargs): include_config = _resolve_boolean(request, PARAM_INCLUDE_CONFIG, False) facets = [] + prefiltered = None for provider in facet_registry.get_providers(): logger.debug("Fetching data from provider %r", provider) @@ -68,7 +69,8 @@ def list_facets(request, **kwargs): info["link"] = f"{reverse('get_facet', args=[info['name']])}?{urlencode(link_args)}" if include_topics: - info["topics"] = _get_topics(provider, queryset=_prefilter_topics(request), lang=lang) + prefiltered = prefiltered or _prefilter_topics(request) + info["topics"] = _get_topics(provider, queryset=prefiltered, lang=lang) facets.append(info)