diff --git a/geonode/base/api/filters.py b/geonode/base/api/filters.py index a2428bfdc65..e06f5fea00e 100644 --- a/geonode/base/api/filters.py +++ b/geonode/base/api/filters.py @@ -131,3 +131,33 @@ def filter_queryset(self, request, queryset, _): _filter["id__in"] = [_facet.id for _facet in queryset if not _facet.resourcebase_set.exists()] return queryset.filter(**_filter) + + +class AdvertisedFilter(BaseFilterBackend): + def filter_queryset(self, request, queryset, view): + # advertised + # if superuser, all resources will be visible, otherwise only the advertised one and + # the resource which the user is owner will be returned + + if getattr(view, "action", None) == "retrieve": + return queryset + + user = request.user + try: + _filter = request.query_params.get("advertised", "None") + advertised = strtobool(_filter) if _filter.lower() != "all" else "all" + except Exception: + advertised = None + + if advertised == "all": + pass + elif advertised is not None: + queryset = queryset.filter(advertised=advertised) + else: + is_admin = user.is_superuser if user and user.is_authenticated else False + if not is_admin and user and not user.is_anonymous: + queryset = (queryset.filter(advertised=True) | queryset.filter(owner=user)).distinct() + elif not user or user.is_anonymous: + queryset = queryset.filter(advertised=True) + + return queryset diff --git a/geonode/base/api/views.py b/geonode/base/api/views.py index a584f24decc..045a5da1b7e 100644 --- a/geonode/base/api/views.py +++ b/geonode/base/api/views.py @@ -65,6 +65,7 @@ FacetVisibleResourceFilter, FavoriteFilter, TKeywordsFilter, + AdvertisedFilter, ) from geonode.groups.models import GroupProfile, Group from geonode.security.permissions import get_compact_perms_list, PermSpec @@ -308,6 +309,7 @@ class ResourceBaseViewSet(ApiPresetsInitializer, DynamicModelViewSet, Advertised permission_classes = [IsAuthenticatedOrReadOnly, UserHasPerms] filter_backends = [ TKeywordsFilter, + AdvertisedFilter, DynamicFilterBackend, DynamicSortingFilter, DynamicSearchFilter, diff --git a/geonode/facets/views.py b/geonode/facets/views.py index 974e79cf636..225e2fa9d4b 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 @@ -86,13 +85,16 @@ def _prefilter_topics(cls, request): 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) + + queryset = viewset.filter_queryset(viewset.get_queryset()) + return get_visible_resources(queryset=queryset, user=request.user) @classmethod def _resolve_language(cls, request) -> (str, bool):