Commit 2c433fa9 authored by Jérome Perrin's avatar Jérome Perrin

Support scriptable URLs for matrixbox cells, similar to listbox URL columns

(with the difference that matrixbox does not make automatically and URL to the
document if no URL column are defined).


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@37277 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 89acf9fa
...@@ -27,8 +27,11 @@ ...@@ -27,8 +27,11 @@
# #
############################################################################## ##############################################################################
import sys
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from AccessControl.ZopeGuards import guarded_getattr from AccessControl.ZopeGuards import guarded_getattr
from ZODB.POSException import ConflictError
from zLOG import LOG, WARNING
from Products.Formulator.DummyField import fields from Products.Formulator.DummyField import fields
from Products.Formulator import Widget, Validator from Products.Formulator import Widget, Validator
from Products.Formulator.Errors import FormValidationError, ValidationError from Products.Formulator.Errors import FormValidationError, ValidationError
...@@ -55,8 +58,7 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -55,8 +58,7 @@ class MatrixBoxWidget(Widget.Widget):
['cell_base_id', 'cell_portal_type', 'lines', 'columns', ['cell_base_id', 'cell_portal_type', 'lines', 'columns',
'tabs', 'as_cell_range_script_id', 'getter_method', 'tabs', 'as_cell_range_script_id', 'getter_method',
'editable_attributes', 'global_attributes', 'editable_attributes', 'global_attributes',
'cell_getter_method', 'cell_getter_method', 'update_cell_range', 'url_cells' ]
'update_cell_range' ]
default = fields.TextAreaField('default', default = fields.TextAreaField('default',
title='Default', title='Default',
...@@ -182,6 +184,14 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -182,6 +184,14 @@ class MatrixBoxWidget(Widget.Widget):
"The cell range should be updated upon edit."), "The cell range should be updated upon edit."),
default=0) default=0)
url_cells = fields.ListTextAreaField('url_cells',
title="URL Cells",
description=(
"An optional list of cells which can provide a custom URL."
"If no url cell is used, then no link is displayed."),
default=[],
required=0)
def render(self, field, key, value, REQUEST, render_format='html', render_prefix=None): def render(self, field, key, value, REQUEST, render_format='html', render_prefix=None):
""" """
This is where most things happen. This method renders a list This is where most things happen. This method renders a list
...@@ -237,6 +247,8 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -237,6 +247,8 @@ class MatrixBoxWidget(Widget.Widget):
else: else:
cell_getter_method = context.getCell cell_getter_method = context.getCell
editable_attributes = field.get_value('editable_attributes') editable_attributes = field.get_value('editable_attributes')
url_cells = field.get_value('url_cells')
url_cell_dict = dict(url_cells)
# This is required when we have no tabs # This is required when we have no tabs
if len(tabs) == 0: if len(tabs) == 0:
...@@ -335,7 +347,7 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -335,7 +347,7 @@ class MatrixBoxWidget(Widget.Widget):
list_result_lines = [ str(l[1]) ] list_result_lines = [ str(l[1]) ]
for c in columns: for c in columns:
has_error = 0 has_error = False
column_id = c[0] column_id = c[0]
if (column_id is not None) and \ if (column_id is not None) and \
(not isinstance(column_id, (list, tuple))): (not isinstance(column_id, (list, tuple))):
...@@ -352,8 +364,28 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -352,8 +364,28 @@ class MatrixBoxWidget(Widget.Widget):
REQUEST['cell'] = cell REQUEST['cell'] = cell
cell_body = '' cell_body = ''
cell_url = None
for attribute_id in editable_attribute_ids: for attribute_id in editable_attribute_ids:
if attribute_id in url_cell_dict:
url_method_id = url_cell_dict[attribute_id]
if url_method_id not in (None, ''):
url_method = getattr(cell, url_method_id, None)
if url_method is not None:
try:
cell_url = url_method(brain=cell,
cell_index=kw,
cell_position=((i,j,k) + extra_dimension_position))
except (ConflictError, RuntimeError):
raise
except:
LOG('MatrixBox', WARNING, 'Could not evaluate the url '
'method %r with %r' % (url_method, cell),
error=sys.exc_info())
else:
LOG('MatrixBox', WARNING,
'Could not find the url method %s' % (url_method_id,))
my_field_id = '%s_%s' % (field.id, attribute_id) my_field_id = '%s_%s' % (field.id, attribute_id)
if form.has_field(my_field_id): if form.has_field(my_field_id):
my_field = form.get_field(my_field_id) my_field = form.get_field(my_field_id)
...@@ -361,7 +393,7 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -361,7 +393,7 @@ class MatrixBoxWidget(Widget.Widget):
if cell is not None: if cell is not None:
attribute_value = my_field.get_value('default', attribute_value = my_field.get_value('default',
cell=cell, cell_index=kw, cell_position = ((i,j,k)+extra_dimension_position)) cell=cell, cell_index=kw, cell_position = ((i,j,k)+extra_dimension_position))
if render_format=='html': if render_format=='html':
display_value = attribute_value display_value = attribute_value
if field_errors: if field_errors:
...@@ -372,20 +404,24 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -372,20 +404,24 @@ class MatrixBoxWidget(Widget.Widget):
attribute_value) attribute_value)
else: else:
display_value = attribute_value display_value = attribute_value
cell_html = my_field.render(value=display_value,
REQUEST=REQUEST,
key=key)
if cell_url:
# don't make a link if widget is editable
if not my_field.get_value('editable',
cell=cell, cell_index=kw,
cell_position=((i,j,k)+extra_dimension_position)):
cell_html = "<a href='%s'>%s</a>" % (cell_url,
cell_html)
if field_errors.has_key(key): if field_errors.has_key(key):
# Display error message if this cell has an error # Display error message if this cell has an error
has_error = 1 has_error = True
cell_body += '<span class="input">%s</span>%s' % ( cell_body += '<span class="input">%s</span>%s' % (
my_field.render(value=display_value, cell_html, translateString(field_errors[key].error_text))
REQUEST=REQUEST,
key=key),
translateString(field_errors[key].error_text))
else: else:
cell_body += '<span class="input">%s</span>' %\ cell_body += '<span class="input">%s</span>' % (
my_field.render( cell_html )
value=display_value,
REQUEST=REQUEST,
key=key)
elif render_format == 'list': elif render_format == 'list':
if not my_field.get_value('hidden'): if not my_field.get_value('hidden'):
...@@ -405,7 +441,7 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -405,7 +441,7 @@ class MatrixBoxWidget(Widget.Widget):
display_value = attribute_value display_value = attribute_value
if field_errors.has_key(key): if field_errors.has_key(key):
# Display error message if this cell has an error # Display error message if this cell has an error
has_error = 1 has_error = True
cell_body += '<span class="input">%s</span>%s' % ( cell_body += '<span class="input">%s</span>%s' % (
my_field.render(value=display_value, my_field.render(value=display_value,
REQUEST=REQUEST, REQUEST=REQUEST,
...@@ -421,7 +457,7 @@ class MatrixBoxWidget(Widget.Widget): ...@@ -421,7 +457,7 @@ class MatrixBoxWidget(Widget.Widget):
list_result_lines.append(None) list_result_lines.append(None)
css = td_css css = td_css
if has_error : if has_error:
css = 'error' css = 'error'
list_body = list_body + \ list_body = list_body + \
('<td class=\"%s\">%s</td>' % (css, cell_body)) ('<td class=\"%s\">%s</td>' % (css, cell_body))
......
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