Skip to content

Commit

Permalink
Merge 20a6b08 into ab45150
Browse files Browse the repository at this point in the history
  • Loading branch information
gbastien committed Mar 16, 2021
2 parents ab45150 + 20a6b08 commit 3e4b608
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 22 deletions.
5 changes: 3 additions & 2 deletions CHANGES.rst
Expand Up @@ -4,8 +4,9 @@ Changelog
0.49 (unreleased)
-----------------

- Nothing changed yet.

- Added possibility to filter displayed categorized elements on any attribute
of the categorized element.
[gbastien]

0.48 (2021-01-19)
-----------------
Expand Down
6 changes: 3 additions & 3 deletions buildout.cfg
Expand Up @@ -37,7 +37,7 @@ eggs = createcoverage
recipe = plone.recipe.codeanalysis
directory = ${buildout:directory}/src/collective
flake8-exclude = bootstrap.py,bootstrap-buildout.py,docs,*.egg.,omelette
flake8-max-complexity = 15
flake8-max-complexity = 18
flake8-max-line-length = 120
flake8-extensions =
flake8-blind-except
Expand Down Expand Up @@ -125,12 +125,12 @@ plone.api = 1.4.11
plone.formwidget.querystring = 1.1.5
plone.recipe.codeanalysis = 2.2
pyflakes = 1.0.0
setuptools =
setuptools = 18.6.1
watchdog = 0.8.3
z3c.jbot = 0.7.2
z3c.json = 0.5.5
z3c.table = 2.0.1
zc.buildout = 2.10.0
zc.buildout = 2.5.3
zc.recipe.egg = 2.0.2

eea.faceted.vocabularies = 6.6
Expand Down
Expand Up @@ -94,7 +94,7 @@ function categorizedChildsInfos(options={}) {
selector = options.selector || '.tooltipster-childs-infos';
tooltipster_helper(selector=selector,
view_name='@@categorized-childs-infos',
data_parameters=['category_uid']);
data_parameters=['category_uid', 'filters']);

}

Expand Down
Expand Up @@ -7,7 +7,8 @@
tal:attributes="href string:#${element/id}_${context/UID|context/getId};
title element/title;
data-category_uid string:${element/uid};
data-base_url string:${context/absolute_url};">
data-base_url string:${context/absolute_url};
data-filters string:${view/_filters_json};">
<span tal:content="element/counts"></span>
<img src=""
alt=""
Expand Down
31 changes: 19 additions & 12 deletions src/collective/iconifiedcategory/browser/views.py
Expand Up @@ -24,6 +24,8 @@
from zope.component import getMultiAdapter
from zope.component.interfaces import ComponentLookupError

import json


class CategorizedChildView(BrowserView):
""" """
Expand All @@ -32,10 +34,20 @@ def __init__(self, context, request):
super(CategorizedChildView, self).__init__(context, request)
self.portal_url = api.portal.get().absolute_url()

@property
def _filters(self):
"""Overridable method to define custom filters."""
return {}

def _filters_json(self):
"""Filters are stored in template as json."""
return json.dumps(self._filters)

def update(self):
self.categorized_elements = get_categorized_elements(
self.context,
portal_type=self.portal_type,
filters=self._filters
)

def __call__(self, portal_type=None, show_nothing=True):
Expand Down Expand Up @@ -72,21 +84,16 @@ def __init__(self, context, request):
self.have_details_to_show = False

def update(self):
uids = self._find_uids()
self.categorized_elements = get_categorized_elements(self.context,
uids=uids)

def _find_uids(self):
""" """
uids = []
for k, v in getattr(self.context, 'categorized_elements', {}).items():
if v['category_uid'] == self.category_uid:
uids.append(k)
return uids
filters = self.filters
filters['category_uid'] = self.category_uid
self.categorized_elements = get_categorized_elements(
self.context,
filters=self.filters)

def __call__(self, category_uid):
def __call__(self, category_uid, filters):
""" """
self.category_uid = category_uid
self.filters = json.loads(filters)
self.update()
return super(CategorizedChildInfosView, self).__call__()

Expand Down
17 changes: 17 additions & 0 deletions src/collective/iconifiedcategory/tests/test_utils.py
Expand Up @@ -404,6 +404,23 @@ def test_get_categorized_elements(self):
api.content.delete(document2)
api.content.delete(category)

def test_get_categorized_elements_filters(self):
self.config.get('group-1').confidentiality_activated = True
createContentInContainer(
container=self.portal,
portal_type='Document',
title='Doc1',
content_category='config_-_group-1_-_category-1-1',
to_print=False,
confidential=True,
)
self.assertEqual(len(utils.get_categorized_elements(
self.portal, filters={'confidential': True})),
1)
self.assertEqual(len(utils.get_categorized_elements(
self.portal, filters={'confidential': False})),
0)

def test_update_categorized_elements(self):
document2 = createContentInContainer(
container=self.portal,
Expand Down
20 changes: 19 additions & 1 deletion src/collective/iconifiedcategory/tests/test_views.py
Expand Up @@ -7,6 +7,8 @@
from collective.iconifiedcategory.tests.base import BaseTestCase
from collective.iconifiedcategory.utils import get_category_object

import json


class TestCategorizedChildView(BaseTestCase):

Expand Down Expand Up @@ -70,7 +72,10 @@ class TestCategorizedChildInfosView(TestCategorizedChildView):
def setUp(self):
super(TestCategorizedChildInfosView, self).setUp()
self.viewinfos = self.portal.restrictedTraverse('@@categorized-childs-infos')
self.viewinfos.category_uid = self.config['group-1']['category-1-1'].UID()
category_uid = self.config['group-1']['category-1-1'].UID()
# filter format is json
filters = json.dumps({})
self.viewinfos(category_uid, filters)

def test__call__(self):
# the category and elements of category is displayed
Expand Down Expand Up @@ -128,6 +133,19 @@ def test_infos(self):
[e['title'] for e in infos[self.viewinfos.category_uid]],
)

def test_filters(self):
self.viewinfos.update()
self.assertEqual(len(self.viewinfos.categorized_elements), 2)
self.viewinfos.filters['id'] = 'file_txt'
self.viewinfos.update()
self.assertEqual(len(self.viewinfos.categorized_elements), 1)
self.assertEqual(self.viewinfos.categorized_elements[0]['id'], 'file_txt')
# filters are passed to viewinfos as json
self.viewinfos(category_uid=self.viewinfos.category_uid,
filters=json.dumps({"id": "image"}))
self.assertEqual(len(self.viewinfos.categorized_elements), 1)
self.assertEqual(self.viewinfos.categorized_elements[0]['id'], 'image')


class TestCanViewAwareDownload(BaseTestCase):

Expand Down
21 changes: 19 additions & 2 deletions src/collective/iconifiedcategory/utils.py
Expand Up @@ -268,11 +268,27 @@ def get_categorized_elements(context,
result_type='dict',
portal_type=None,
sort_on=None,
uids=[]):
uids=[],
filters={}):
"""Return categorized elements.
p_result_type may be :
- 'dict': default, essential metadata are returned as a dict;
- 'objects': categorized objects are returned."""
- 'objects': categorized objects are returned.
If some p_filters are given, the values will be filtered,
available filters are values stored in categorized_elements."""
def _check_filters(infos):
""" """
keep = True
for k, v in filters.items():
# manage case when stored value is a list or not
stored_value = infos[k]
if not hasattr(stored_value, '__iter__'):
stored_value = (stored_value, )
if v not in stored_value:
keep = False
break
return keep

elements = []
categorized_elements = _categorized_elements(context)
if not categorized_elements:
Expand All @@ -284,6 +300,7 @@ def get_categorized_elements(context,
for uid, infos in categorized_elements.items():
if uids and uid not in uids or \
portal_type and infos['portal_type'] != portal_type or \
not _check_filters(infos) or \
(infos['confidential'] and
not set(infos['allowedRolesAndUsers']).intersection(current_user_allowedRolesAndUsers)):
continue
Expand Down

0 comments on commit 3e4b608

Please sign in to comment.