Commit aafe0c55 authored by Yoshinori Okuji's avatar Yoshinori Okuji

Make it possible to use domain trees with documents.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@5739 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 9789f4c0
...@@ -77,7 +77,10 @@ def getAsList(a): ...@@ -77,7 +77,10 @@ def getAsList(a):
l.append(e) l.append(e)
return l return l
def makeTreeBody(form, root_dict, domain_path, depth, total_depth, unfolded_list, form_id, selection_name): def makeTreeBody(form = None, root_dict = None, domain_path = '',
depth = 0, total_depth = None, unfolded_list = (),
form_id = None, selection_name = None,
base_category = None):
""" """
This method builds a report tree This method builds a report tree
...@@ -90,34 +93,40 @@ def makeTreeBody(form, root_dict, domain_path, depth, total_depth, unfolded_list ...@@ -90,34 +93,40 @@ def makeTreeBody(form, root_dict, domain_path, depth, total_depth, unfolded_list
#LOG('makeTreeBody domain_path', 0, str(domain_path)) #LOG('makeTreeBody domain_path', 0, str(domain_path))
#LOG('makeTreeBody unfolded_list', 0, str(unfolded_list)) #LOG('makeTreeBody unfolded_list', 0, str(unfolded_list))
#LOG('makeTreeBody', 0, 'form = %r, root_dict = %r, domain_path = %r, depth = %r, total_depth = %r, unfolded_list = %r, form_id = %r, selection_name = %r, base_category = %r' % (form, root_dict, domain_path, depth, total_depth, unfolded_list, form_id, selection_name, base_category))
if total_depth is None: if total_depth is None:
total_depth = max(1, len(unfolded_list)) total_depth = max(1, len(unfolded_list))
if type(domain_path) is type('a'): domain_path = domain_path.split('/') if isinstance(domain_path, str):
domain_path = domain_path.split('/')
if form_id is None:
form_id = form.id
portal_categories = getattr(form, 'portal_categories', None) portal_categories = getattr(form, 'portal_categories', None)
portal_domains = getattr(form, 'portal_domains', None) portal_domains = getattr(form, 'portal_domains', None)
portal_object = form.portal_url.getPortalObject() portal_object = form.portal_url.getPortalObject()
if len(domain_path): if base_category is None and len(domain_path):
base_category = domain_path[0] base_category = domain_path[0]
else:
base_category = None
if root_dict is None: if root_dict is None:
root_dict = {} root_dict = {}
#LOG('makeTreeBody', 0, 'domain_path = %r, base_category = %r' % (domain_path, base_category))
is_empty_level = 1 is_empty_level = 1
category = base_category
while is_empty_level: while is_empty_level:
if not root_dict.has_key(base_category): if category not in root_dict:
root = None root = None
if portal_categories is not None: if portal_categories is not None:
if base_category in portal_categories.objectIds(): if category in portal_categories.objectIds():
root = root_dict[base_category] = root_dict[None] = portal_categories[base_category] root = root_dict[category] = root_dict[None] = portal_categories[category]
domain_path = domain_path[1:] domain_path = domain_path[1:]
if root is None and portal_domains is not None: if root is None and portal_domains is not None:
if base_category in portal_domains.objectIds(): if category in portal_domains.objectIds():
root = root_dict[base_category] = root_dict[None] = portal_domains[base_category] root = root_dict[category] = root_dict[None] = portal_domains[category]
domain_path = domain_path[1:] domain_path = domain_path[1:]
if root is None: if root is None:
try: try:
...@@ -126,30 +135,40 @@ def makeTreeBody(form, root_dict, domain_path, depth, total_depth, unfolded_list ...@@ -126,30 +135,40 @@ def makeTreeBody(form, root_dict, domain_path, depth, total_depth, unfolded_list
root = None root = None
domain_path = () domain_path = ()
else: else:
root = root_dict[None] = root_dict[base_category] root = root_dict[None] = root_dict[category]
if len(domain_path) >= 1: if len(domain_path) >= 1:
domain_path = domain_path[1:] domain_path = domain_path[1:]
else: else:
domain_path = () domain_path = ()
is_empty_level = root is not None and (root.objectCount() == 0) and (len(domain_path) != 0) is_empty_level = root is not None and (root.objectCount() == 0) and (len(domain_path) != 0)
if is_empty_level: base_category = domain_path[0] if is_empty_level:
category = domain_path[0]
#LOG('makeTreeBody', 0, 'root = %r, depth = %r, category = %r' % (root, depth, category))
tree_body = '' tree_body = ''
if root is None: return tree_body if root is None: return tree_body
for o in root.objectValues(): for o in root.objectValues():
tree_body += '<TR>' + '<TD WIDTH="16" NOWRAP>' * depth tree_body += '<TR>' + '<TD WIDTH="16" NOWRAP>' * depth
if o.getRelativeUrl() in unfolded_list: relative_url = o.getRelativeUrl()
if base_category is not None and not relative_url.startswith(base_category + '/'):
url = '%s/%s' % (base_category, relative_url)
else:
url = relative_url
if url in unfolded_list:
tree_body += """<TD NOWRAP VALIGN="TOP" ALIGN="LEFT" COLSPAN="%s"> tree_body += """<TD NOWRAP VALIGN="TOP" ALIGN="LEFT" COLSPAN="%s">
<a href="portal_selections/foldDomain?domain_url=%s&form_id=%s&list_selection_name=%s&domain_depth:int=%s" >- <b>%s</b></a> <a href="portal_selections/foldDomain?domain_url=%s&form_id=%s&list_selection_name=%s&domain_depth:int=%s" >- <b>%s</b></a>
</TD>""" % (total_depth - depth + 1, o.getRelativeUrl() , form_id, selection_name, depth, o.id) </TD>""" % (total_depth - depth + 1, url, form_id, selection_name, depth, o.id)
new_root_dict = root_dict.copy() new_root_dict = root_dict.copy()
new_root_dict[None] = new_root_dict[base_category] = o new_root_dict[None] = new_root_dict[base_category] = o
tree_body += makeTreeBody(form, new_root_dict, domain_path, depth + 1, total_depth, unfolded_list, form_id, selection_name) tree_body += makeTreeBody(form = form, root_dict = new_root_dict, domain_path = domain_path,
depth = depth + 1, total_depth = total_depth, unfolded_list = unfolded_list,
selection_name = selection_name, base_category = base_category)
else: else:
tree_body += """<TD NOWRAP VALIGN="TOP" ALIGN="LEFT" COLSPAN="%s"> tree_body += """<TD NOWRAP VALIGN="TOP" ALIGN="LEFT" COLSPAN="%s">
<a href="portal_selections/unfoldDomain?domain_url=%s&form_id=%s&list_selection_name=%s&domain_depth:int=%s" >+ %s</a> <a href="portal_selections/unfoldDomain?domain_url=%s&form_id=%s&list_selection_name=%s&domain_depth:int=%s" >+ %s</a>
</TD>""" % (total_depth - depth + 1, o.getRelativeUrl() , form_id, selection_name, depth, o.id) </TD>""" % (total_depth - depth + 1, url, form_id, selection_name, depth, o.id)
#tree_body += '</TD>' * depth + '</TR>'
return tree_body return tree_body
...@@ -1982,8 +2001,9 @@ onChange="submitAction(this.form,'%s/portal_selections/setDomainRoot')"> ...@@ -1982,8 +2001,9 @@ onChange="submitAction(this.form,'%s/portal_selections/setDomainRoot')">
try: try:
if selection_domain_path == ('portal_categories',): if selection_domain_path == ('portal_categories',):
selection_domain_path = default_selected selection_domain_path = default_selected
select_tree_body = makeTreeBody(form, None, selection_domain_path, select_tree_body = makeTreeBody(form = form, domain_path = selection_domain_path,
0, None, selection_domain_current, form.id, selection_name) unfolded_list = selection_domain_current,
selection_name = selection_name)
except KeyError: except KeyError:
select_tree_body = '' select_tree_body = ''
......
...@@ -382,6 +382,7 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent): ...@@ -382,6 +382,7 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent):
security.declareObjectPublic() security.declareObjectPublic()
def __init__(self, domain_dict = None): def __init__(self, domain_dict = None):
#LOG('DomainSelection', 0, '__init__ is called with %r' % (domain_dict,))
if domain_dict is not None: if domain_dict is not None:
self.domain_dict = domain_dict self.domain_dict = domain_dict
for k,v in domain_dict.items(): for k,v in domain_dict.items():
...@@ -405,7 +406,11 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent): ...@@ -405,7 +406,11 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent):
# Special treatment for parent # Special treatment for parent
select_expression.append(d.getParentSqlExpression(table='catalog', select_expression.append(d.getParentSqlExpression(table='catalog',
strict_membership=strict_membership)) strict_membership=strict_membership))
elif k is not None and getattr(aq_base(d), 'isCategory', 0): elif k is not None:
if getattr(aq_base(d), 'isPredicate', 0):
select_expression.append(d.asSqlExpression(table='%s_category' % k,
strict_membership=strict_membership))
else:
# This is a category, we must join # This is a category, we must join
select_expression.append('%s.%s = %s_category.uid' % \ select_expression.append('%s.%s = %s_category.uid' % \
(join_table, join_column, k)) (join_table, join_column, k))
...@@ -413,26 +418,28 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent): ...@@ -413,26 +418,28 @@ class DomainSelection(Acquisition.Implicit, Traversable, Persistent):
strict_membership=strict_membership)) strict_membership=strict_membership))
# XXX We should take into account k explicitely # XXX We should take into account k explicitely
# if we want to support category acquisition # if we want to support category acquisition
elif k is not None and getattr(aq_base(d), 'isPredicate', 0): if select_expression:
select_expression.append(d.asSqlExpression(table='%s_category' % k,
strict_membership=strict_membership))
result = "( %s )" % ' AND '.join(select_expression) result = "( %s )" % ' AND '.join(select_expression)
#LOG('asSqlExpression', 0, str(result)) else:
result = ''
#LOG('DomainSelection', 0, 'asSqlExpression returns %r' % (result,))
return result return result
security.declarePublic('asSqlJoinExpression') security.declarePublic('asSqlJoinExpression')
def asSqlJoinExpression(self, domain_id=None, exclude_domain_id=None): def asSqlJoinExpression(self, domain_id=None, exclude_domain_id=None):
join_expression = [] join_expression = []
#LOG('DomainSelection', 0, 'domain_id = %r, exclude_domain_id = %r, self.domain_dict = %r' % (domain_id, exclude_domain_id, self.domain_dict))
for k, d in self.domain_dict.items(): for k, d in self.domain_dict.items():
if k == 'parent': if k == 'parent':
pass pass
elif k is not None and getattr(aq_base(d), 'isCategory', 0): elif k is not None:
if getattr(aq_base(d), 'isPredicate', 0):
join_expression.append(d.asSqlJoinExpression(table='%s_category' % k))
else:
# This is a category, we must join # This is a category, we must join
join_expression.append('category AS %s_category' % k) join_expression.append('category AS %s_category' % k)
elif k is not None and getattr(aq_base(d), 'isPredicate', 0):
join_expression.append(d.asSqlJoinExpression(table='%s_category' % k))
result = "%s" % ' , '.join(join_expression) result = "%s" % ' , '.join(join_expression)
#LOG('asSqlJoinExpression', 0, str(result)) #LOG('DomainSelection', 0, 'asSqlJoinExpression returns %r' % (result,))
return result return result
security.declarePublic('asDomainDict') security.declarePublic('asDomainDict')
......
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