From 81d5d14c0c2435da35350a21a390ce47564646ff Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 2 Dec 2021 17:53:48 +0100 Subject: [PATCH] opengis: add test button for indexing template (#58360) --- passerelle/apps/opengis/forms.py | 7 +++++ .../0012_query_indexing_template.py | 1 - passerelle/apps/opengis/models.py | 1 - .../opengis/templates/opengis/query_form.html | 16 +++++++++++ .../widgets/indexing_template_widget.html | 7 +++++ passerelle/apps/opengis/urls.py | 5 ++++ passerelle/apps/opengis/views.py | 28 +++++++++++++++++-- tests/test_opengis.py | 21 ++++++++++++++ 8 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 passerelle/apps/opengis/templates/opengis/widgets/indexing_template_widget.html diff --git a/passerelle/apps/opengis/forms.py b/passerelle/apps/opengis/forms.py index 3d1e08c8..4dba1b2d 100644 --- a/passerelle/apps/opengis/forms.py +++ b/passerelle/apps/opengis/forms.py @@ -41,6 +41,13 @@ class QueryForm(BaseQueryFormMixin, forms.ModelForm): fields = '__all__' exclude = ['resource', 'computed_properties'] + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + if self.instance.pk: + self.fields[ + 'indexing_template' + ].widget.template_name = 'opengis/widgets/indexing_template_widget.html' + def clean_filter_expression(self): filter_expression = self.cleaned_data['filter_expression'] if filter_expression: diff --git a/passerelle/apps/opengis/migrations/0012_query_indexing_template.py b/passerelle/apps/opengis/migrations/0012_query_indexing_template.py index 91d418b4..fa5552b2 100644 --- a/passerelle/apps/opengis/migrations/0012_query_indexing_template.py +++ b/passerelle/apps/opengis/migrations/0012_query_indexing_template.py @@ -26,7 +26,6 @@ class Migration(migrations.Migration): name='indexing_template', field=models.TextField( blank=True, - help_text='Template used to generate contents used in fulltext search.', verbose_name='Indexing template', ), ), diff --git a/passerelle/apps/opengis/models.py b/passerelle/apps/opengis/models.py index 2eb929ac..815a88c5 100644 --- a/passerelle/apps/opengis/models.py +++ b/passerelle/apps/opengis/models.py @@ -488,7 +488,6 @@ class Query(BaseQuery): filter_expression = models.TextField(_('XML filter'), blank=True) indexing_template = models.TextField( verbose_name=_('Indexing template'), - help_text=_('Template used to generate contents used in fulltext search.'), blank=True, ) computed_properties = JSONField(blank=True, default=dict) diff --git a/passerelle/apps/opengis/templates/opengis/query_form.html b/passerelle/apps/opengis/templates/opengis/query_form.html index a5f171e9..7164aa82 100644 --- a/passerelle/apps/opengis/templates/opengis/query_form.html +++ b/passerelle/apps/opengis/templates/opengis/query_form.html @@ -27,4 +27,20 @@ + {% endblock %} diff --git a/passerelle/apps/opengis/templates/opengis/widgets/indexing_template_widget.html b/passerelle/apps/opengis/templates/opengis/widgets/indexing_template_widget.html new file mode 100644 index 00000000..bc3a57fa --- /dev/null +++ b/passerelle/apps/opengis/templates/opengis/widgets/indexing_template_widget.html @@ -0,0 +1,7 @@ +{% load i18n %} + + +
{% trans 'Template used to generate contents used in fulltext search.' %}
+ + diff --git a/passerelle/apps/opengis/urls.py b/passerelle/apps/opengis/urls.py index deb4ee7e..e77eed62 100644 --- a/passerelle/apps/opengis/urls.py +++ b/passerelle/apps/opengis/urls.py @@ -26,4 +26,9 @@ management_urlpatterns = [ views.QueryDelete.as_view(), name='opengis-query-delete', ), + url( + r'^(?P[\w,-]+)/query/(?P\d+)/test-indexing-template/$', + views.TestIndexingTemplate.as_view(), + name='opengis-query-test-indexing-template', + ), ] diff --git a/passerelle/apps/opengis/views.py b/passerelle/apps/opengis/views.py index 565fdccc..09630b05 100644 --- a/passerelle/apps/opengis/views.py +++ b/passerelle/apps/opengis/views.py @@ -14,10 +14,12 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.http import HttpResponseRedirect -from django.views.generic import CreateView, DeleteView, UpdateView +from django.http import HttpResponseRedirect, JsonResponse +from django.template import Context, Template, TemplateSyntaxError +from django.views.generic import CreateView, DeleteView, DetailView, UpdateView from passerelle.base.mixins import ResourceChildViewMixin +from passerelle.utils.conversion import simplify from . import models from .forms import ComputedPropertyFormSet, QueryForm @@ -87,3 +89,25 @@ class QueryEdit(QueryMixin, ResourceChildViewMixin, UpdateView): class QueryDelete(ResourceChildViewMixin, DeleteView): model = models.Query + + +class TestIndexingTemplate(ResourceChildViewMixin, DetailView): + model = models.Query + + def get(self, request, *args, **kwargs): + template = request.GET.get('template') + if not template: + return JsonResponse({'data': []}) + + try: + template = Template(template) + except TemplateSyntaxError: + return JsonResponse({'data': []}) + + results = [] + features = self.get_object().features.values_list('data', flat=True)[:3] + for feature in features: + context = Context(feature.get('properties', {})) + results.append(simplify(template.render(context))) + + return JsonResponse({'data': results}) diff --git a/tests/test_opengis.py b/tests/test_opengis.py index 1b7c8291..13be9dd0 100644 --- a/tests/test_opengis.py +++ b/tests/test_opengis.py @@ -1013,3 +1013,24 @@ def test_opengis_export_import(query): import_site(serialization) assert OpenGIS.objects.count() == 1 assert Query.objects.count() == 1 + + +@mock.patch('passerelle.utils.Request.get') +def test_opengis_test_indexing_template_view(mocked_get, admin_user, app, connector, query): + url = '/manage/opengis/%s/query/%s/test-indexing-template/' % (connector.slug, query.pk) + mocked_get.side_effect = geoserver_geolocated_responses + query.update_cache() + + app = login(app) + resp = app.get(url + '?template=') + assert resp.json['data'] == [] + + resp = app.get(url + '?template={{a}b}}') + assert resp.json['data'] == [] + + resp = app.get(url + '?template={{nom_commune}} {{nom_voie}}') + assert resp.json['data'] == ['grenoble', 'grenoble', 'grenoble place victor hugo'] + + resp = app.get('/manage/opengis/%s/query/%s/' % (connector.slug, query.pk)) + assert url in resp.text + assert 'Test template' in resp.text -- 2.30.2