diff --git a/geonode/facets/tests.py b/geonode/facets/tests.py index 1cfc8ef6b4a..cc82d305780 100644 --- a/geonode/facets/tests.py +++ b/geonode/facets/tests.py @@ -694,3 +694,45 @@ def test_group_facets_are_filtered_by_words(self): self.assertEqual(200, response.status_code, response.json()) self.assertEqual(0, response.json().get("topics", {}).get("total", 0)) + + def test_anonymous_user_behaviour_with_no_filter_and_advertised_false(self): + # make sure the user authorization pre-filters the visible resources, + # including the advertised default behavior for anonymous users. + self.client.logout() + public_perm_spec = {"users": {"AnonymousUser": ["view_resourcebase"]}, "groups": {}} + + hidden_adv = ResourceBase.objects.create( + title="dataset_hidden_advertised", + uuid=str(uuid4()), + owner=self.user, + abstract="Should not be counted for anonymous default listing", + subtype="vector", + category=self.cats["C0"], + advertised=False, # advertised false + is_approved=True, + is_published=True, + ) + hidden_adv.set_permissions(public_perm_spec) + + # Category facet without extra filters (dropdown use-case) + facet_url = f"{reverse('get_facet', args=['category'])}" + facet_response = self.client.get(facet_url) + self.assertEqual(200, facet_response.status_code, facet_response.json()) + + facet_items = facet_response.json()["topics"]["items"] + c0_item = next((item for item in facet_items if item["key"] == "C0"), None) + self.assertIsNotNone(c0_item, f"C0 not found in facet payload: {facet_items}") + + # Resources API is the source of truth for visible resources list. + resources_url = ( + f"{reverse('base-resources-list')}?filter{{category.identifier.in}}=C0&filter{{metadata_only}}=false" + ) + resources_response = self.client.get(resources_url) + self.assertEqual(200, resources_response.status_code, resources_response.json()) + resources_total = resources_response.json()["total"] + + self.assertEqual( + resources_total, + c0_item["count"], + "Facet count must match resources list count for anonymous users when no facet filters are applied.", + ) diff --git a/geonode/facets/views.py b/geonode/facets/views.py index 974e79cf636..60b3bf00c71 100644 --- a/geonode/facets/views.py +++ b/geonode/facets/views.py @@ -27,7 +27,6 @@ from django.conf import settings from geonode.base.api.views import ResourceBaseViewSet -from geonode.base.models import ResourceBase from geonode.facets.models import FacetProvider, DEFAULT_FACET_PAGE_SIZE, facet_registry from geonode.security.utils import get_visible_resources @@ -85,14 +84,10 @@ def _prefilter_topics(cls, request): logger.debug("Filtering by user '%s'", request.user) filters = {k: vlist for k, vlist in request.query_params.lists() if k.startswith("filter{")} logger.warning(f"FILTERING BY {filters}") - - if filters: - viewset = ResourceBaseViewSet(request=request, format_kwarg={}, kwargs=filters) - viewset.initial(request) - return get_visible_resources(queryset=viewset.filter_queryset(viewset.get_queryset()), user=request.user) - else: - # return ResourceBase.objects - return get_visible_resources(ResourceBase.objects, request.user) + # kwargs will be {} if no filter applied + viewset = ResourceBaseViewSet(request=request, format_kwarg={}, kwargs=filters) + viewset.initial(request) + return get_visible_resources(queryset=viewset.filter_queryset(viewset.get_queryset()), user=request.user) @classmethod def _resolve_language(cls, request) -> (str, bool):