Commit 23bb0fd8 authored by Yoshinori Okuji's avatar Yoshinori Okuji

Heavy rewrite with Page Template.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@8147 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent dacb90c7
...@@ -50,6 +50,7 @@ from ZODB.POSException import ConflictError ...@@ -50,6 +50,7 @@ from ZODB.POSException import ConflictError
from Globals import InitializeClass, Persistent, Acquisition, get_request from Globals import InitializeClass, Persistent, Acquisition, get_request
from Products.PythonScripts.Utility import allow_class from Products.PythonScripts.Utility import allow_class
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import random import random
import md5 import md5
...@@ -102,6 +103,8 @@ class ReportTree: ...@@ -102,6 +103,8 @@ class ReportTree:
else: else:
self.domain_url = relative_url self.domain_url = relative_url
allow_class(ReportTree)
class ReportSection: class ReportSection:
"""This class describes a report section. """This class describes a report section.
""" """
...@@ -335,11 +338,19 @@ class ListBoxWidget(Widget.Widget): ...@@ -335,11 +338,19 @@ class ListBoxWidget(Widget.Widget):
list_action = fields.StringField('list_action', list_action = fields.StringField('list_action',
title='List Action', title='List Action',
description=('The id of the object action' description=('The id of the object action'
'to display the current list'), ' to display the current list'),
default='list', default='list',
required=1) required=1)
property_names.append('list_action') property_names.append('list_action')
page_template = fields.StringField('page_template',
title='Page Template',
description=('The id of a Page Template'
' to render the ListBox'),
default='',
required=0)
property_names.append('page_template')
def render_view(self, field, value, REQUEST=None, render_format='html', key='listbox'): def render_view(self, field, value, REQUEST=None, render_format='html', key='listbox'):
""" """
Render a ListBox in read-only. Render a ListBox in read-only.
...@@ -858,6 +869,13 @@ class ListBoxRenderer: ...@@ -858,6 +869,13 @@ class ListBoxRenderer:
getCheckedUidList = VolatileCachingMethod(getCheckedUidList) getCheckedUidList = VolatileCachingMethod(getCheckedUidList)
def getCheckedUidSet(self):
"""Return the set of checked uids.
"""
return set(self.getCheckedUidList())
getCheckedUidSet = VolatileCachingMethod(getCheckedUidSet)
def getSelectedColumnList(self): def getSelectedColumnList(self):
"""Return the list of selected columns. """Return the list of selected columns.
""" """
...@@ -1916,7 +1934,7 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine): ...@@ -1916,7 +1934,7 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine):
error = sys.exc_info()) error = sys.exc_info())
else: else:
try: try:
url = '%s/view?selection_index=%s&selection_name=%s&reset:int=1' % (brain.getPath(), self.index, selection_name) url = '%s/view?selection_index=%s&selection_name=%s&reset:int=1' % (brain.getPath(), self.index, selection_name)
except AttributeError: except AttributeError:
pass pass
...@@ -1930,6 +1948,19 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine): ...@@ -1930,6 +1948,19 @@ class ListBoxHTMLRendererLine(ListBoxRendererLine):
return html_list return html_list
allow_class(ListBoxHTMLRendererLine)
class ListBoxRendererContext(Acquisition.Explicit):
"""This class helps making a context for a Page Template,
because Page Template requires an acquisition context.
"""
def __init__(self, renderer):
self.renderer = renderer
# XXX this is a workaround for GlobalTranslationService.
self.Localizer = renderer.getContext().Localizer
def __getattr__(self, name):
return getattr(self.renderer, name)
class ListBoxHTMLRenderer(ListBoxRenderer): class ListBoxHTMLRenderer(ListBoxRenderer):
"""This class implements HTML rendering for ListBox. """This class implements HTML rendering for ListBox.
...@@ -1983,6 +2014,27 @@ class ListBoxHTMLRenderer(ListBoxRenderer): ...@@ -1983,6 +2014,27 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
return md5_string return md5_string
def getPhysicalRoot(self):
"""Return the physical root (an Application object). This method is required for
Page Template to make a context.
"""
return self.getContext().getPhysicalRoot()
asHTML = PageTemplateFile('www/ListBox_asHTML', globals())
def getPageTemplate(self):
"""Return a Page Template to render.
"""
context = ListBoxRendererContext(self)
# If a specific template is specified, use it.
method_id = self.field.get_value('page_template')
if method_id:
return getattr(context, method_id)
# Otherwise, use the default one.
return context.asHTML
def render(self, **kw): def render(self, **kw):
"""Render the data in HTML. """Render the data in HTML.
""" """
...@@ -1998,6 +2050,24 @@ class ListBoxHTMLRenderer(ListBoxRenderer): ...@@ -1998,6 +2050,24 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
selection.edit(method_path = method_path, list_url = list_url) selection.edit(method_path = method_path, list_url = list_url)
self.getSelectionTool().setSelectionFor(self.getSelectionName(), selection, REQUEST = self.request) self.getSelectionTool().setSelectionFor(self.getSelectionName(), selection, REQUEST = self.request)
pt = self.getPageTemplate()
return pt()
def original_render(self, **kw):
"""This is just a reference. Not used any longer.
"""
# Make it sure to store the current selection, only if a list method is defined.
list_method = self.getListMethod()
selection = self.getSelection()
if list_method is not None:
method_path = getPath(self.getContext()) + '/' + self.getListMethodName()
list_url = '%s?selection_name=%s' % (self.getUrl(), self.getRequestedSelectionName())
selection_index = self.getSelectionIndex()
if selection_index is not None:
list_url += '&selection_index=%s' % selection_index
selection.edit(method_path = method_path, list_url = list_url)
self.getSelectionTool().setSelectionFor(self.getSelectionName(), selection, REQUEST = self.request)
# Obtain the list of lines. # Obtain the list of lines.
line_list = self.query() line_list = self.query()
...@@ -2335,7 +2405,7 @@ class ListBoxHTMLRenderer(ListBoxRenderer): ...@@ -2335,7 +2405,7 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
if alias is not None: if alias is not None:
# Render the search field by a widget, if any. # Render the search field by a widget, if any.
if search_field: if search_field is not None:
search_field_html = search_field.render(value = param, key = alias) search_field_html = search_field.render(value = param, key = alias)
else: else:
search_field_html = """<input name="%s" size="8" value="%s" />""" % (alias, cgi.escape(param)) search_field_html = """<input name="%s" size="8" value="%s" />""" % (alias, cgi.escape(param))
...@@ -2356,7 +2426,7 @@ class ListBoxHTMLRenderer(ListBoxRenderer): ...@@ -2356,7 +2426,7 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
# Add data lines. # Add data lines.
selection = self.getSelection() selection = self.getSelection()
checked_uid_set = set(self.getCheckedUidList()) checked_uid_set = self.getCheckedUidSet()
for i, line in enumerate(line_list): for i, line in enumerate(line_list):
# Change the appearance of each line for visibility. # Change the appearance of each line for visibility.
...@@ -2503,6 +2573,8 @@ class ListBoxHTMLRenderer(ListBoxRenderer): ...@@ -2503,6 +2573,8 @@ class ListBoxHTMLRenderer(ListBoxRenderer):
return ''.join(html_list) return ''.join(html_list)
allow_class(ListBoxHTMLRenderer)
class ListBoxListRenderer(ListBoxRenderer): class ListBoxListRenderer(ListBoxRenderer):
"""This class implements list rendering for ListBox. """This class implements list rendering for ListBox.
""" """
...@@ -3047,7 +3119,7 @@ allow_class(ListBoxLine) ...@@ -3047,7 +3119,7 @@ allow_class(ListBoxLine)
# Psyco # Psyco
import psyco import psyco
psyco.bind(ListBoxWidget.render) #psyco.bind(ListBoxWidget.render)
psyco.bind(ListBoxValidator.validate) psyco.bind(ListBoxValidator.validate)
This diff is collapsed.
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