Skip to content

Commit 34a9746

Browse files
[3.3.x] [Fixes #8690] Custom filters available for the “ResourceBase” opaque filters (#8733)
* [Fixes #8689] Extend the ResourceBase metadata model with an opaque JSONField * [Fixes #8689] Fix missing resource_type for new form instances * [Fixes #8689] Add test and UI fix for doc, maps and geoapps * [Fixes #8689] Fix flakee8 formatting * [Fixes #8689] Extra metadata json saved with format * [Fixes #8689] Refactor validation def, start defining endpoint for API * [Fixes #8689] Definition of extra-metadata endpoints for resources * [Fixes #8689] Converting metadata from jsonfield to manytomany relation * [Fixes #8689] Fix views with new relation and prettify json on UI * [Fixes #8689] Fix serializer * [Fixes #8689] Fix custom metadata endpoint, update metadata schema * [Fixes #8689] Fix flake8 issues * [Fixes #8689] Remove endpoint from each resorce, keep it only on base resource * [Fixes #8689] Fix broken tests * [Fixes #8689] Add metadata filtering in API v1 * [Fixes #8689] Add test for metadata filtering in API v1 * [Fixes #8689] Fix some of broken tests * [Fixes #8689] fix flake8 * [Fixes #8689] fix tests * [Fixes #8689] removed typo on settings.py * [Fixes #8689] fix broken build * [Fixes #8689] fix minor error on filter convertion * [Fixes #8690] first implementation for dynamic filtering * [Fixes #8690] first implementation for dynamic filtering * [Fixes #8689] fix flake8 * [Fixes #8689] Update default schema structure * [Fixes #8690] first implementation for dynamic filtering * [Fixes #8690] Dynamic metadata facet filtering * [Fixes #8690] Minor fix for geoapps * [Fixes #8690] Flake8 format fix
1 parent 6d2fe7f commit 34a9746

4 files changed

Lines changed: 72 additions & 3 deletions

File tree

geonode/api/resourcebase_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ def build_filters(self, filters=None, ignore_bad_filters=False, **kwargs):
169169
orm_filters.update({'polymorphic_ctype__model__in': [filt.lower() for filt in filters.getlist('app_type__in')]})
170170
if 'extent' in filters:
171171
orm_filters.update({'extent': filters['extent']})
172-
_metadata = {f"metadata__{_k}": _v for _k, _v in filters.items() if _k.startswith('metadata__')}
172+
# getting metadata filters
173+
_metadata = {f"metadata__{k}__in": filters.getlist(k) for k in filter(lambda x: x.startswith('metadata__'), filters)}
173174
if _metadata:
174175
orm_filters.update({"metadata_filters": _metadata})
175176
orm_filters['f_method'] = filters['f_method'] if 'f_method' in filters else 'and'

geonode/base/templatetags/base_tags.py

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#
1818
#########################################################################
1919

20+
from enum import Enum
2021
import logging
2122

2223
from django import template
@@ -31,7 +32,7 @@
3132
from pinax.ratings.models import Rating
3233
from guardian.shortcuts import get_objects_for_user
3334

34-
from geonode.base.models import ResourceBase
35+
from geonode.base.models import ExtraMetadata, ResourceBase
3536
from geonode.base.bbox_utils import filter_bbox
3637
from geonode.layers.models import Layer
3738
from geonode.maps.models import Map
@@ -41,7 +42,9 @@
4142
HierarchicalKeyword, Menu, MenuItem
4243
)
4344
from geonode.security.utils import get_visible_resources
44-
from collections import OrderedDict
45+
from collections import OrderedDict, Counter
46+
47+
from geonode.utils import get_geoapps_models
4548

4649
logger = logging.getLogger(__name__)
4750

@@ -56,6 +59,13 @@
5659
}
5760

5861

62+
class FACET_TO_RESOURCE_TYPE(Enum):
63+
layers = 'layer'
64+
maps = 'map'
65+
documents = 'document'
66+
geoapps = 'geoapp'
67+
68+
5969
@register.filter(name='template_trans')
6070
def template_trans(text):
6171
try:
@@ -495,3 +505,42 @@ def get_layer_count_by_services(service_id, user):
495505
queryset=Layer.objects.filter(remote_service=service_id),
496506
user=user
497507
).count()
508+
509+
510+
@register.simple_tag(takes_context=True)
511+
def dynamic_metadata_filters(context):
512+
513+
facet_type = context.get('facet_type', 'all')
514+
515+
metadata_available = ExtraMetadata.objects.all()
516+
517+
if facet_type != 'all':
518+
resource_type = [getattr(FACET_TO_RESOURCE_TYPE, facet_type).value]
519+
if 'geoapp' in resource_type:
520+
resource_type = [''.join(list(x.models)) for x in get_geoapps_models()]
521+
metadata_available = metadata_available\
522+
.filter(resource__polymorphic_ctype__model__in=resource_type)
523+
524+
if not metadata_available.exists():
525+
return []
526+
527+
categories = metadata_available.values_list('metadata__filter_header', flat=True).distinct()
528+
529+
output = {}
530+
531+
for _cat in categories:
532+
output[_cat] = _get_filter_by_category(_cat, metadata_available)
533+
534+
return output
535+
536+
537+
def _get_filter_by_category(category, metadata_available):
538+
metadata_for_category = metadata_available\
539+
.filter(metadata__filter_header=category)
540+
541+
counters = Counter(metadata_for_category.values_list('metadata__field_name', 'metadata__field_value'))
542+
out = []
543+
for _el in metadata_for_category.distinct("metadata__field_name", "metadata__field_value"):
544+
cnt = counters.get((_el.metadata['field_name'], _el.metadata['field_value']), 0)
545+
out.append({**{"id": _el.id, "count": cnt}, **_el.metadata})
546+
return out
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{% load i18n %}
2+
{% load base_tags %}
3+
{% dynamic_metadata_filters as data %}
4+
{% for key, values in data.items %}
5+
<nav class="filter">
6+
<h4><a href="#" class="toggle toggle-nav"><i class="fa fa-chevron-right"></i>{{key}}</a></h4>
7+
<ul class="nav closed" id="dynamic_filter_{{ key|slugify }}">
8+
{% for el in values %}
9+
<li>
10+
<a id="dynamic_filter_{{ el.id }}" data-value="{{ el.field_value }}" data-filter="metadata__field_value" ng-click="multiple_choice_listener($event)">
11+
{{ el.field_label }}
12+
<span class="badge pull-right">{{el.count}}</span>
13+
</a>
14+
</li>
15+
{% endfor %}
16+
</ul>
17+
</nav>
18+
{% endfor %}

geonode/templates/search/_search_content.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
{% if SEARCH_FILTERS.EXTENT_ENABLED %}
4949
{% include "search/_extent_filter.html" %}
5050
{% endif %}
51+
{% include "search/_dynamic_metadata_filter.html" %}
5152
{% endblock search_facet_lists %}
5253
</div>
5354
{% endif %}

0 commit comments

Comments
 (0)