Commit 68723415 authored by Jérome Perrin's avatar Jérome Perrin

CMFCategory: new disable_{node,leave} API

This allow filtering category item lists so that user can only select nodes /
leaves in a way similar to filter_{node,leave} but instead of removing the
items, keep them with None as relative URL. This is something Formulator
understand, categories are displayed with disable attribute set on the select
option, which allows to visualize the category hierarchical structure, while
not allowing user to select {nodes,leaves}
parent f5f322a5
......@@ -64,32 +64,26 @@ class Filter(Implicit):
self.filter_node = filter_node
self.filter_leave = filter_leave
def _isNode(self, context):
return bool(context.contentIds(filter={'portal_type' : 'Category'}))
def test(self, context):
"""
Test filter on a context
"""
#LOG('Filter test', 0, 'context = %s' % repr(context))
is_node = None
if self.filter_node:
is_node = len(context.contentIds(filter={'portal_type' : 'Category'}))
if is_node:
return 0
if self.filter_leave:
if is_node is None:
# Only recalculate is_node if not already done
is_node = len(context.contentIds(filter={'portal_type' : 'Category'}))
if not is_node:
return 0
if self.filter_node and self._isNode(context):
return False
if self.filter_leave and not self._isNode(context):
return False
for k, v in self.filter_dict.items():
#LOG('Filter test', 0, "k = %s, v = %s" % (repr(k), repr(v)))
if type(v) in (type([]), type(())):
if context.getProperty(k) not in v:
return 0
return False
elif context.getProperty(k) != v:
return 0
return False
if self.filter_method is not None:
return self.filter_method(context)
return 1
return True
def asDict(self):
......
......@@ -43,7 +43,8 @@ class Renderer(Filter):
def __init__(self, spec = None, filter = None, portal_type = None,
display_id = None, sort_id = None,
display_method = None, sort_method = None, filter_method = None,
filter_node=0, filter_leave=0,
filter_node=0, disable_node=0,
filter_leave=0, disable_leave=0,
is_right_display = 0, translate_display = 0,
translatation_domain = None, display_base_category = 0,
base_category = None, base = 1,
......@@ -58,8 +59,12 @@ class Renderer(Filter):
- *filter_node*: do not keep node categories
- *disable_node*: return node categories as disabled (ie. None instead of their relative URL)
- *filter_leave*: do not keep leave categories
- *disable_leave*: return leave categories as disabled (ie. None instead of their relative URL)
- *sort_id*: the id of the attribute to "call" to calculate the value used for sorting.
Sorting is only applied to default ItemList items.
......@@ -99,7 +104,8 @@ class Renderer(Filter):
"""
Filter.__init__(self, spec=spec, filter=filter,
portal_type=portal_type, filter_method=filter_method,
filter_node=filter_node, filter_leave=filter_leave)
filter_node=filter_node and not disable_node,
filter_leave=filter_leave and not disable_leave)
self.display_id = display_id
self.sort_id = sort_id
self.display_method = display_method
......@@ -111,6 +117,8 @@ class Renderer(Filter):
self.base_category = base_category
self.base = base
self.display_none_category = display_none_category
self.disable_node = disable_node
self.disable_leave = disable_leave
def getObjectList(self, value_list):
new_value_list = []
......@@ -222,6 +230,11 @@ class Renderer(Filter):
bc_title = getattr(bc, base_category_display_method_id)()
label = '%s/%s' % (bc_title, label)
if self.disable_node and self._isNode(value):
url = None
if self.disable_leave and not self._isNode(value):
url = None
if self.is_right_display:
item = [url, label]
else:
......
......@@ -755,6 +755,58 @@ class TestCMFCategory(ERP5TypeTestCase):
whitespace_number = self.portal.portal_preferences.getPreferredWhitespaceNumberForChildItemIndentation()
self.assertEqual(NBSP_UTF8 * whitespace_number + 'The Sub Title', sub_cat.getIndentedTitle())
def test_CategoryChildTitleItemListFilterNodeFilterLeave(self):
base_cat = self.getCategoryTool().newContent(portal_type='Base Category')
base_cat.newContent(
portal_type='Category',
id='the_id',
title='The Title'
).newContent(
portal_type='Category',
id='the_sub_id',
title='The Sub Title')
self.assertEqual(
base_cat.getCategoryChildTitleItemList(filter_node=True),
[
['', ''],
['The Sub Title', 'the_id/the_sub_id'],
]
)
self.assertEqual(
base_cat.getCategoryChildTitleItemList(filter_leave=True),
[
['', ''],
['The Title', 'the_id'],
]
)
def test_CategoryChildTitleItemListDisableNodeDisableLeave(self):
base_cat = self.getCategoryTool().newContent(portal_type='Base Category')
base_cat.newContent(
portal_type='Category',
id='the_id',
title='The Title'
).newContent(
portal_type='Category',
id='the_sub_id',
title='The Sub Title')
self.assertEqual(
base_cat.getCategoryChildTitleItemList(disable_node=True),
[
['', ''],
['The Title', None],
['The Sub Title', 'the_id/the_sub_id'],
]
)
self.assertEqual(
base_cat.getCategoryChildTitleItemList(disable_leave=True),
[
['', ''],
['The Title', 'the_id'],
['The Sub Title', None],
]
)
def test_20_CategoryChildTitleAndIdItemList(self):
"""Tests getCategoryChildTitleAndIdItemList."""
base_cat = self.getCategoryTool().newContent(portal_type='Base Category')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment