From 417fea77386c09a2ac778a3a38cba016ba86db08 Mon Sep 17 00:00:00 2001 From: Mirek Simek Date: Sun, 4 Oct 2020 22:02:36 +0200 Subject: [PATCH] callable aggregations --- oarepo_ui/ext.py | 2 +- oarepo_ui/facets.py | 29 +++++++++++++++++++++-------- oarepo_ui/filters.py | 2 +- pytest.ini | 2 +- tests/config.py | 11 +++++++++++ tests/test_views.py | 15 ++++++++++++--- 6 files changed, 47 insertions(+), 14 deletions(-) diff --git a/oarepo_ui/ext.py b/oarepo_ui/ext.py index 7d1b590a..850064f6 100644 --- a/oarepo_ui/ext.py +++ b/oarepo_ui/ext.py @@ -50,7 +50,7 @@ def _translate_facets(self, facets, index_name, **kwargs): elif callable(facet): translation = get_oarepo_attr(facet).get('translation', None) - if translation: + if translation is not None: if not (translation.permissions or self.permission_factory)( facets=facets, facet_name=k, facet=facet, index_name=index_name, **kwargs).can(): diff --git a/oarepo_ui/facets.py b/oarepo_ui/facets.py index 53f3ca44..3cc5b6ed 100644 --- a/oarepo_ui/facets.py +++ b/oarepo_ui/facets.py @@ -1,5 +1,5 @@ from oarepo_ui.constants import no_translation -from oarepo_ui.utils import partial_format, get_oarepo_attr +from oarepo_ui.utils import get_oarepo_attr, partial_format class TranslatedFacet(dict): @@ -19,12 +19,23 @@ def make_translated_facet(facet_val, label, value, translator, permissions): if callable(facet_val): oarepo = get_oarepo_attr(facet_val) oarepo['translation'] = TranslatedFacet({}, label, value, translator, permissions) + return facet_val else: return TranslatedFacet(facet_val, label, value, translator, permissions) + +def is_translated_facet(facet_val): + if callable(facet_val): + oarepo = get_oarepo_attr(facet_val) + translation = oarepo.get('translation', None) + return translation is not None and isinstance(translation, TranslatedFacet) + else: + return isinstance(facet_val, TranslatedFacet) + + def translate_facets(facets, label=None, value=None, translator=None, permissions=None): for facet_key, facet_val in list(facets.items()): - if not isinstance(facet_val, TranslatedFacet): + if not is_translated_facet(facet_val): facets[facet_key] = make_translated_facet( facet_val, label=partial_format(label, facet_key=facet_key) if label and label is not no_translation else label, @@ -36,12 +47,14 @@ def translate_facets(facets, label=None, value=None, translator=None, permission def translate_facet(facet, label=None, value=None, translator=None, permissions=None): - return make_translated_facet( - facet, - label=label, - value=value, - translator=translator, - permissions=permissions) + if not is_translated_facet(facet): + return make_translated_facet( + facet, + label=label, + value=value, + translator=translator, + permissions=permissions) + return facet def keep_facets(facets, **kwargs): diff --git a/oarepo_ui/filters.py b/oarepo_ui/filters.py index 17d77a26..51982cd6 100644 --- a/oarepo_ui/filters.py +++ b/oarepo_ui/filters.py @@ -1,5 +1,5 @@ from oarepo_ui.constants import no_translation -from oarepo_ui.utils import partial_format, get_oarepo_attr +from oarepo_ui.utils import get_oarepo_attr, partial_format class TranslatedFilter: diff --git a/pytest.ini b/pytest.ini index 56c82d31..5ee1f19f 100644 --- a/pytest.ini +++ b/pytest.ini @@ -8,5 +8,5 @@ [pytest] pep8maxlinelength = 99 pep8ignore = docs/conf.py ALL -addopts = --doctest-glob="*.rst" --doctest-modules --cov=oarepo_ui --cov-report=term-missing --ignore=setup.py +# addopts = --doctest-glob="*.rst" --doctest-modules --cov=oarepo_ui --cov-report=term-missing --ignore=setup.py testpaths = tests oarepo_ui diff --git a/tests/config.py b/tests/config.py index 95e3da66..b343b85e 100644 --- a/tests/config.py +++ b/tests/config.py @@ -26,6 +26,7 @@ def permission_factory(index_name, **kwargs): check_perms = request.args.get('perms', False) + class Inner: def can(self): return not check_perms or index_name.startswith('translate-') @@ -108,5 +109,15 @@ def can(self): 'filters': { 'category': translate_filter(terms_filter('category'), label='my.own.filter.label') } + }, + 'func': { + 'aggs': { + 'category': translate_facet(lambda: ({ + 'terms': { + 'field': 'category', + }, + }), label='my.own.facet.label', + permissions=permission_factory) + } } } diff --git a/tests/test_views.py b/tests/test_views.py index f50a92c4..c951c6d0 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -21,7 +21,10 @@ def test_views(app, client): 'translate-facets-filters-translator': {'facets': {'category': {'label': 'my.own.facet.category'}}, 'filters': {'category': {'label': 'my.own.filter.category'}}}, 'translate-filter': {'facets': {}, - 'filters': {'category': {'label': 'my.own.filter.label'}}}} + 'filters': {'category': {'label': 'my.own.filter.label'}}}, + 'func': {'facets': {'category': {'label': 'my.own.facet.label'}}, + 'filters': {}}, + } resp = client.get('/oarepo/indices/?ln=cs') assert resp.status_code == 200 @@ -45,7 +48,10 @@ def test_views(app, client): 'translate-facets-filters-translator': {'facets': {'category': {'label': 'můj.vlastní.facet.kategorie'}}, 'filters': {'category': {'label': 'můj.vlastní.filter.kategorie'}}}, 'translate-filter': {'facets': {}, - 'filters': {'category': {'label': 'můj.vlastní.filter.label'}}}} + 'filters': {'category': {'label': 'můj.vlastní.filter.label'}}}, + 'func': {'facets': {'category': {'label': 'můj.vlastní.facet.label'}}, + 'filters': {}}, + } def test_view(app, client): @@ -88,4 +94,7 @@ def test_perms(app, client): 'translate-facets-filters-translator': {'facets': {'category': {'label': 'my.own.facet.category'}}, 'filters': {'category': {'label': 'my.own.filter.category'}}}, 'translate-filter': {'facets': {}, - 'filters': {'category': {'label': 'my.own.filter.label'}}}} + 'filters': {'category': {'label': 'my.own.filter.label'}}}, + 'func': {'facets': {}, + 'filters': {}} + }