Commit 46d3e992 authored by Tatuya Kamada's avatar Tatuya Kamada

- when using ReportSection recreate a element name

- fix the address in the GPL 
- append XML validation


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@26509 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent f12c3a54
......@@ -22,12 +22,12 @@
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
# USA.
##############################################################################
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.CMFCore.utils import _checkPermission, getToolByName
from Products.CMFCore.utils import _checkPermission
from Products.PythonScripts.Utility import allow_class
from Products.ERP5Type import PropertySheet, Permissions
from Products.ERP5Form.ListBox import ListBox
......@@ -316,14 +316,15 @@ class ODFStrategy(Implicit):
return ooo_builder
def _replaceXmlByForm(self, element_tree=None, form=None, here=None,
extra_context=None, ooo_builder=None):
extra_context=None, ooo_builder=None, iteration_index=0):
field_list = form.get_fields(include_disabled=1)
REQUEST = get_request()
for (count, field) in enumerate(field_list):
if isinstance(field, ListBox):
element_tree = self._appendTableByListbox(element_tree=element_tree,
listbox=field,
REQUEST=REQUEST)
REQUEST=REQUEST,
iteration_index=iteration_index)
elif isinstance(field, FormBox):
if not hasattr(here, field.get_value('formbox_target_id')):
continue
......@@ -332,23 +333,25 @@ class ODFStrategy(Implicit):
field=field,
form=sub_form,
extra_context=extra_context,
ooo_builder=ooo_builder)
ooo_builder=ooo_builder,
iteration_index=iteration_index)
elif isinstance(field, ImageField):
element_tree = self._replaceXmlByImageField(element_tree=element_tree,
image_field=field,
ooo_builder=ooo_builder)
ooo_builder=ooo_builder,
iteration_index=iteration_index)
else:
element_tree = self._replaceNodeViaReference(element_tree=element_tree,
field=field)
field=field, iteration_index=iteration_index)
return element_tree
def _replaceNodeViaReference(self, element_tree=None, field=None):
def _replaceNodeViaReference(self, element_tree=None, field=None, iteration_index=0):
"""replace nodes (e.g. paragraphs) via ODF reference"""
element_tree = self._replaceNodeViaRangeReference(element_tree=element_tree, field=field)
element_tree = self._replaceNodeViaPointReference(element_tree=element_tree, field=field)
return element_tree
def _replaceNodeViaPointReference(self, element_tree=None, field=None):
def _replaceNodeViaPointReference(self, element_tree=None, field=None, iteration_index=0):
"""replace via ODF point reference
point reference example:
......@@ -370,9 +373,14 @@ class ODFStrategy(Implicit):
paragraph_node.text = value
else:
self._appendParagraphsWithLineList(target_node=target_node, line_list=field_value)
# set when using report section
self._setUniqueElementName(base_name=field.id,
iteration_index=iteration_index,
xpath=reference_xpath,
element_tree=element_tree)
return element_tree
def _replaceNodeViaRangeReference(self, element_tree=None, field=None):
def _replaceNodeViaRangeReference(self, element_tree=None, field=None, iteration_index=0):
"""replace via ODF range reference
range reference example:
......@@ -395,6 +403,12 @@ class ODFStrategy(Implicit):
node.tail = ''
else:
self._appendParagraphsWithLineList(target_node=target_node, line_list=field_value)
# set when using report section
self._setUniqueElementName(base_name=field.id,
iteration_index=iteration_index,
xpath=range_reference_xpath,
element_tree=element_tree)
return element_tree
def _appendParagraphsWithLineList(self, target_node=None, line_list=None):
......@@ -459,39 +473,57 @@ class ODFStrategy(Implicit):
if index is 0:
office_body.remove(frame_paragraph)
else:
self._setReportSectionFrameName(report_method_name=report_method.__name__,
frame_paragraph_index=index,
frame_paragraph_element_tree=frame_paragraph_element_tree)
self._setUniqueElementName(base_name=report_method.__name__,
iteration_index=index,
xpath=report_section_frame_xpath,
element_tree=frame_paragraph_element_tree)
frame_paragraph_element_tree = self._replaceXmlByForm(element_tree=frame_paragraph_element_tree,
form=form,
here=here,
extra_context=extra_context,
ooo_builder=ooo_builder)
ooo_builder=ooo_builder,
iteration_index=index)
office_body.insert(frame_paragraph_index, frame_paragraph_element_tree)
frame_paragraph_index += 1
report_item.popReport(portal_object, render_prefix=None)
return element_tree
def _setReportSectionFrameName(self,
report_method_name='',
frame_paragraph_index=0,
frame_paragraph_element_tree=None):
report_section_frame_name = "%s_%s" % (report_method_name, frame_paragraph_index)
draw_name_attribute = '{%s}name' % frame_paragraph_element_tree.nsmap['draw']
report_section_frame = frame_paragraph_element_tree.xpath(
'draw:frame[@draw:name="%s"]' % report_method_name,
namespaces=frame_paragraph_element_tree.nsmap)
if len(report_section_frame) is 0:
def _setUniqueElementName(self, base_name='', iteration_index=0, xpath='', element_tree=None):
"""create a unique element name and set it to the element tree
Keyword arguments:
base_name -- the base name of the element
iteration_index -- iteration index
xpath -- xpath expression which was used to search the element
element_tree -- element tree
"""
if iteration_index is 0:
return
report_section_frame[0].set(draw_name_attribute, report_section_frame_name)
def getNameAttribute(target_element=None):
if target_element is None:
return None
attrib = target_element.attrib
for key in attrib.keys():
if key.endswith("}name"):
return key
return None
odf_element_name = "%s_%s" % (base_name, iteration_index)
result_list = element_tree.xpath(xpath, namespaces=element_tree.nsmap)
if len(result_list) is 0:
return
target_element = result_list[0]
name_attribute = getNameAttribute(target_element)
if name_attribute is not None:
target_element.set(name_attribute, odf_element_name)
def _replaceXmlByFormbox(self,
element_tree=None,
field=None,
form=None,
extra_context=None,
ooo_builder=None):
ooo_builder=None,
iteration_index=0):
field_id = field.id
enabled = field.get_value('enabled')
draw_xpath = '//draw:frame[@draw:name="%s"]/draw:text-box/*' % field_id
......@@ -504,14 +536,24 @@ class ODFStrategy(Implicit):
if not enabled:
office_body.remove(frame_paragraph)
return element_tree
# set when using report section
self._setUniqueElementName(base_name=field_id,
iteration_index=iteration_index,
xpath=draw_xpath,
element_tree=element_tree)
self._replaceXmlByForm(element_tree=frame_paragraph,
form=form,
here=extra_context['here'],
extra_context=extra_context,
ooo_builder=ooo_builder)
ooo_builder=ooo_builder,
iteration_index=iteration_index)
return element_tree
def _replaceXmlByImageField(self, element_tree=None, image_field=None, ooo_builder=None):
def _replaceXmlByImageField(self,
element_tree=None,
image_field=None,
ooo_builder=None,
iteration_index=0):
alt = image_field.get_value('description') or image_field.get_value('title')
image_xpath = '//draw:frame[@draw:name="%s"]/*' % image_field.id
image_list = element_tree.xpath(image_xpath, namespaces=element_tree.nsmap)
......@@ -531,6 +573,11 @@ class ODFStrategy(Implicit):
image_frame = image_node.getparent()
image_frame.set('{%s}width' % element_tree.nsmap['svg'], picture_size[0])
image_frame.set('{%s}height' % element_tree.nsmap['svg'], picture_size[1])
# set when using report section
self._setUniqueElementName(base_name=image_field.id,
iteration_index=iteration_index,
xpath=image_xpath,
element_tree=element_tree)
return element_tree
def _createOdfUniqueFileName(self, path='', picture_type=''):
......@@ -583,7 +630,8 @@ class ODFStrategy(Implicit):
def _appendTableByListbox(self,
element_tree=None,
listbox=None,
REQUEST=None):
REQUEST=None,
iteration_index=0):
table_id = listbox.id
table_xpath = '//table:table[@table:name="%s"]' % table_id
# this list should be one item list
......@@ -642,11 +690,21 @@ class ODFStrategy(Implicit):
row = self._updateColumnValue(row, listbox_column_list)
newtable.append(row)
self._setUniqueElementName(base_name=table_id,
iteration_index=iteration_index,
xpath=table_xpath,
element_tree=newtable)
parent_paragraph.insert(target_index, newtable)
return element_tree
def _copyRowStyle(self, table_row_list=[], has_header_rows=False):
def removeOfficeAttribute(row):
if row is None or has_header_rows: return
odf_cell_list = row.findall("{%s}table-cell" % row.nsmap['table'])
for odf_cell in odf_cell_list:
self._removeColumnValue(odf_cell)
row_top = None
row_middle = None
row_bottom = None
......@@ -667,6 +725,9 @@ class ODFStrategy(Implicit):
row_top = deepcopy(table_row_list[0])
row_middle = deepcopy(table_row_list[1])
row_bottom = deepcopy(table_row_list[-1])
# remove office attribute if create a new header row
removeOfficeAttribute(row_top)
return (row_top, row_middle, row_bottom)
def _updateColumnValue(self, row=None, listbox_column_list=[]):
......
......@@ -22,7 +22,8 @@
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
# USA.
#
##############################################################################
......@@ -144,6 +145,7 @@ class TestFormPrintout(ERP5TypeTestCase):
'application/vnd.oasis.opendocument.text; charset=utf-8')
self.assertEqual(request.RESPONSE.getHeader('content-disposition'),
'inline;filename="Foo_viewAsPrintout.odt"')
self._validate(odf_document)
# 2. Normal case: change the field value and check again the ODF document
test1.setTitle("Changed Title!")
......@@ -153,7 +155,8 @@ class TestFormPrintout(ERP5TypeTestCase):
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertTrue(content_xml.find("Changed Title!") > 0)
self._validate(odf_document)
# 3. False case: change the field name
test1.setTitle("you cannot find")
# rename id 'my_title' to 'xxx_title', then does not match in the ODF document
......@@ -164,6 +167,7 @@ class TestFormPrintout(ERP5TypeTestCase):
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertFalse(content_xml.find("you cannot find") > 0)
self._validate(odf_document)
# put back
foo_form.manage_renameObject('xxx_title', 'my_title', REQUEST=request)
......@@ -191,7 +195,8 @@ class TestFormPrintout(ERP5TypeTestCase):
self.assertTrue(content_xml.find("call!") > 0)
# when just call FormPrintout, it does not change content-type
self.assertEqual(request.RESPONSE.getHeader('content-type'), 'text/html')
self._validate(odf_document)
# 5. Normal case: utf-8 string
test1.setTitle("Français")
odf_document = foo_printout()
......@@ -199,7 +204,8 @@ class TestFormPrintout(ERP5TypeTestCase):
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertTrue(content_xml.find("Français") > 0)
self._validate(odf_document)
# 6. Normal case: unicode string
test1.setTitle(u'Français test2')
odf_document = foo_printout()
......@@ -207,7 +213,8 @@ class TestFormPrintout(ERP5TypeTestCase):
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertTrue(content_xml.find("Français test2") > 0)
self._validate(odf_document)
def test_02_Table_01_Normal(self, run=run_all_test):
"""To test listbox and ODF table mapping
......@@ -258,7 +265,8 @@ class TestFormPrintout(ERP5TypeTestCase):
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertTrue(content_xml.find("foo_title_1") > 0)
self._validate(odf_document)
def test_02_Table_02_SmallerThanListboxColumns(self, run=run_all_test):
"""2. Irregular case: listbox columns count smaller than table columns count"""
if not run: return
......@@ -300,6 +308,7 @@ class TestFormPrintout(ERP5TypeTestCase):
content_xml = builder.extract("content.xml")
self.assertFalse(content_xml.find("foo_title_1") > 0)
self.assertTrue(content_xml.find("foo_title_2") > 0)
self._validate(odf_document)
def test_02_Table_03_ListboxColumnsLargerThanTable(self, run=run_all_test):
"""3. Irregular case: listbox columns count larger than table columns count"""
......@@ -336,7 +345,8 @@ class TestFormPrintout(ERP5TypeTestCase):
content_xml = builder.extract("content.xml")
self.assertFalse(content_xml.find("foo_title_2") > 0)
self.assertTrue(content_xml.find("foo_title_3") > 0)
self._validate(odf_document)
def test_02_Table_04_ListboxHasNotStat(self, run=run_all_test):
"""4. Irregular case: listbox has not a stat line, but table has a stat line"""
if not run: return
......@@ -385,7 +395,8 @@ class TestFormPrintout(ERP5TypeTestCase):
span_attribute = "{%s}number-columns-spanned" % content.nsmap['table']
self.assertFalse(first_row_columns[0].attrib.has_key(span_attribute))
self.assertEqual(int(last_row_columns[0].attrib[span_attribute]), 2)
self._validate(odf_document)
def test_02_Table_05_NormalSameLayout(self, run=run_all_test):
"""5. Normal case: the listobx and the ODF table are same layout
......@@ -431,6 +442,7 @@ class TestFormPrintout(ERP5TypeTestCase):
content_xml = builder.extract("content.xml")
self.assertFalse(content_xml.find("foo_title_4") > 0)
self.assertTrue(content_xml.find("foo_title_5") > 0)
self._validate(odf_document)
# put back the field name
foo_form.manage_renameObject('listbox2', 'listbox', REQUEST=request)
......@@ -474,14 +486,15 @@ class TestFormPrintout(ERP5TypeTestCase):
self.assertTrue(listboxline_list[1].getColumnProperty('title') == "foo_title_6")
odf_document = foo_printout.index_html(REQUEST=request)
#test_output = open("/tmp/test_02_06_Table.odf", "w")
#test_output.write(odf_document)
test_output = open("/tmp/test_02_06_Table.odf", "w")
test_output.write(odf_document)
self.assertTrue(odf_document is not None)
builder = OOoBuilder(odf_document)
content_xml = builder.extract("content.xml")
self.assertFalse(content_xml.find("foo_title_5") > 0)
self.assertTrue(content_xml.find("foo_title_6") > 0)
self._validate(odf_document)
# put back the field name
foo_form.manage_renameObject('listbox3', 'listbox', REQUEST=request)
......@@ -530,7 +543,7 @@ class TestFormPrintout(ERP5TypeTestCase):
date_value_attrib = "{%s}date-value" % content.nsmap['office']
self.assertTrue(date_column.attrib.has_key(date_value_attrib))
self.assertEqual(date_column.attrib[date_value_attrib], '2009-04-20')
self._validate(odf_document)
def test_02_Table_08_Nodata(self, run=run_all_test):
"""7. Normal case: list box has no data"""
......@@ -564,7 +577,8 @@ class TestFormPrintout(ERP5TypeTestCase):
odf_table_rows = content.xpath(table_row_xpath, namespaces=content.nsmap)
# no rows
self.assertEqual(len(odf_table_rows), 0)
self._validate(odf_document)
def _test_03_Frame(self, run=run_all_test):
"""
Frame not supported yet
......@@ -667,7 +681,8 @@ return []
frame_list = content.xpath(frame_xpath, namespaces=content.nsmap)
# the frame was removed
self.assertEqual(len(frame_list), 0)
self._validate(odf_document)
def _test_05_Styles(self, run=run_all_test):
"""
styles.xml not tested yet
......
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