diff --git a/geonode/api/resourcebase_api.py b/geonode/api/resourcebase_api.py index ba72c21689f..ce9cc9adf97 100644 --- a/geonode/api/resourcebase_api.py +++ b/geonode/api/resourcebase_api.py @@ -169,7 +169,8 @@ def build_filters(self, filters=None, ignore_bad_filters=False, **kwargs): orm_filters.update({'polymorphic_ctype__model__in': [filt.lower() for filt in filters.getlist('app_type__in')]}) if 'extent' in filters: orm_filters.update({'extent': filters['extent']}) - _metadata = {f"metadata__{_k}": _v for _k, _v in filters.items() if _k.startswith('metadata__')} + # getting metadata filters + _metadata = {f"metadata__{k}__in": filters.getlist(k) for k in filter(lambda x: x.startswith('metadata__'), filters)} if _metadata: orm_filters.update({"metadata_filters": _metadata}) orm_filters['f_method'] = filters['f_method'] if 'f_method' in filters else 'and' diff --git a/geonode/base/templatetags/base_tags.py b/geonode/base/templatetags/base_tags.py index 1472acade16..6629ed76db8 100644 --- a/geonode/base/templatetags/base_tags.py +++ b/geonode/base/templatetags/base_tags.py @@ -17,6 +17,7 @@ # ######################################################################### +from enum import Enum import logging from django import template @@ -31,7 +32,7 @@ from pinax.ratings.models import Rating from guardian.shortcuts import get_objects_for_user -from geonode.base.models import ResourceBase +from geonode.base.models import ExtraMetadata, ResourceBase from geonode.base.bbox_utils import filter_bbox from geonode.layers.models import Layer from geonode.maps.models import Map @@ -41,7 +42,9 @@ HierarchicalKeyword, Menu, MenuItem ) from geonode.security.utils import get_visible_resources -from collections import OrderedDict +from collections import OrderedDict, Counter + +from geonode.utils import get_geoapps_models logger = logging.getLogger(__name__) @@ -56,6 +59,13 @@ } +class FACET_TO_RESOURCE_TYPE(Enum): + layers = 'layer' + maps = 'map' + documents = 'document' + geoapps = 'geoapp' + + @register.filter(name='template_trans') def template_trans(text): try: @@ -495,3 +505,42 @@ def get_layer_count_by_services(service_id, user): queryset=Layer.objects.filter(remote_service=service_id), user=user ).count() + + +@register.simple_tag(takes_context=True) +def dynamic_metadata_filters(context): + + facet_type = context.get('facet_type', 'all') + + metadata_available = ExtraMetadata.objects.all() + + if facet_type != 'all': + resource_type = [getattr(FACET_TO_RESOURCE_TYPE, facet_type).value] + if 'geoapp' in resource_type: + resource_type = [''.join(list(x.models)) for x in get_geoapps_models()] + metadata_available = metadata_available\ + .filter(resource__polymorphic_ctype__model__in=resource_type) + + if not metadata_available.exists(): + return [] + + categories = metadata_available.values_list('metadata__filter_header', flat=True).distinct() + + output = {} + + for _cat in categories: + output[_cat] = _get_filter_by_category(_cat, metadata_available) + + return output + + +def _get_filter_by_category(category, metadata_available): + metadata_for_category = metadata_available\ + .filter(metadata__filter_header=category) + + counters = Counter(metadata_for_category.values_list('metadata__field_name', 'metadata__field_value')) + out = [] + for _el in metadata_for_category.distinct("metadata__field_name", "metadata__field_value"): + cnt = counters.get((_el.metadata['field_name'], _el.metadata['field_value']), 0) + out.append({**{"id": _el.id, "count": cnt}, **_el.metadata}) + return out diff --git a/geonode/templates/search/_dynamic_metadata_filter.html b/geonode/templates/search/_dynamic_metadata_filter.html new file mode 100644 index 00000000000..252c4fa9ecb --- /dev/null +++ b/geonode/templates/search/_dynamic_metadata_filter.html @@ -0,0 +1,18 @@ +{% load i18n %} +{% load base_tags %} + {% dynamic_metadata_filters as data %} + {% for key, values in data.items %} + +{% endfor %} diff --git a/geonode/templates/search/_search_content.html b/geonode/templates/search/_search_content.html index 8e031fa133b..296b423a805 100644 --- a/geonode/templates/search/_search_content.html +++ b/geonode/templates/search/_search_content.html @@ -48,6 +48,7 @@ {% if SEARCH_FILTERS.EXTENT_ENABLED %} {% include "search/_extent_filter.html" %} {% endif %} + {% include "search/_dynamic_metadata_filter.html" %} {% endblock search_facet_lists %} {% endif %}