[Erp5-report] r25718 - in /erp5/trunk/products/ERP5OOo: ./ tests/ tests/test_document/ www/
nobody at svn.erp5.org
nobody at svn.erp5.org
Thu Feb 26 09:21:25 CET 2009
Author: tatuya
Date: Thu Feb 26 09:21:24 2009
New Revision: 25718
URL: http://svn.erp5.org?rev=25718&view=rev
Log:
Append a new feature to the ERP5OOoTemplate, to set a stylesheet
dinamically.
The feature can set a stylesheet by a script with a parameter.
Added:
erp5/trunk/products/ERP5OOo/tests/testOOoDynamicStyle.py
erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_en.odt (with props)
erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_ja.odt (with props)
Modified:
erp5/trunk/products/ERP5OOo/OOoTemplate.py
erp5/trunk/products/ERP5OOo/www/formSettings.zpt
Modified: erp5/trunk/products/ERP5OOo/OOoTemplate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/OOoTemplate.py?rev=25718&r1=25717&r2=25718&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/OOoTemplate.py [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/OOoTemplate.py [utf8] Thu Feb 26 09:21:24 2009
@@ -147,6 +147,7 @@
# Default Attributes
ooo_stylesheet = 'Base_getODTStyleSheet'
+ ooo_script_name = None
ooo_xml_file_id = 'content.xml'
# Default content type
@@ -225,13 +226,14 @@
self.write(text)
security.declareProtected('Change Page Templates', 'doSettings')
- def doSettings(self, REQUEST, title, xml_file_id, ooo_stylesheet):
+ def doSettings(self, REQUEST, title, xml_file_id, ooo_stylesheet, script_name=None):
"""
Change title, xml_file_id and ooo_stylesheet.
"""
if SUPPORTS_WEBDAV_LOCKS and self.wl_isLocked():
raise ResourceLockedError, "File is locked via WebDAV"
self.ooo_stylesheet = ooo_stylesheet
+ self.ooo_script_name = script_name
self.ooo_xml_file_id = xml_file_id
self.pt_setTitle(title)
#REQUEST.set('text', self.read()) # May not equal 'text'!
@@ -426,7 +428,13 @@
# This is a system error
raise ValueError, 'Can not render a template without a parent acquisition context'
# Retrieve master document
- ooo_document = getattr(here, self.ooo_stylesheet)
+ ooo_document = None
+ # If script is setting, call it
+ if (self.ooo_script_name is not None) and (self.ooo_script_name != ''):
+ ooo_script = getattr(here, self.ooo_script_name)
+ ooo_document = ooo_script(self.ooo_stylesheet)
+ else:
+ ooo_document = getattr(here, self.ooo_stylesheet)
format = request.get('format')
try:
# If style is dynamic, call it
Added: erp5/trunk/products/ERP5OOo/tests/testOOoDynamicStyle.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/testOOoDynamicStyle.py?rev=25718&view=auto
==============================================================================
--- erp5/trunk/products/ERP5OOo/tests/testOOoDynamicStyle.py (added)
+++ erp5/trunk/products/ERP5OOo/tests/testOOoDynamicStyle.py [utf8] Thu Feb 26 09:21:24 2009
@@ -1,0 +1,210 @@
+##############################################################################
+#
+# Copyright (c) 2009 Nexedi KK and Contributors. All Rights Reserved.
+# Tatuya Kamada <tatuya at nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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.
+#
+##############################################################################
+
+import os
+import sys
+import unittest
+from AccessControl.SecurityManagement import newSecurityManager
+from Products.ERP5Type.tests.utils import DummyLocalizer
+from zLOG import LOG
+from Products.ERP5OOo.tests.utils import Validator
+from Testing import ZopeTestCase
+from zipfile import ZipFile, ZIP_DEFLATED
+from StringIO import StringIO
+
+class TestOooDynamicStyle(ZopeTestCase.FunctionalTestCase):
+ manager_username = 'tatuya'
+ manager_password = 'tatuya'
+ content_type_writer = 'application/vnd.oasis.opendocument.text'
+ content = "<office:document-content xmlns:draw='urn:oasis:names:tc:opendocument:xmlns:drawing:1.0' xmlns:office='urn:oasis:names:tc:opendocument:xmlns:office:1.0' xmlns:text='urn:oasis:names:tc:opendocument:xmlns:text:1.0' xmlns:ooo='http://openoffice.org/2004/office' xmlns:number='urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0' xmlns:dc='http://purl.org/dc/elements/1.1/' xmlns:meta='urn:oasis:names:tc:opendocument:xmlns:meta:1.0' xmlns:table='urn:oasis:names:tc:opendocument:xmlns:table:1.0' xmlns:dr3d='urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0' xmlns:fo='urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0' xmlns:style='urn:oasis:names:tc:opendocument:xmlns:style:1.0' xmlns:xforms='http://www.w3.org/2002/xforms' xmlns:form='urn:oasis:names:tc:opendocument:xmlns:form:1.0' xmlns:script='urn:oasis:names:tc:opendocument:xmlns:script:1.0' xmlns:ooow='http://openoffice.org/2004/writer' xmlns:svg='urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0' xmlns:chart='urn:oasis:names:tc:opendocument:xmlns:chart:1.0' xmlns:dom='http://www.w3.org/2001/xml-events' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:oooc='http://openoffice.org/2004/calc' xmlns:math='http://www.w3.org/1998/Math/MathML' xmlns:tal='http://xml.zope.org/namespaces/tal'></office:document-content>"
+
+ def getTitle(self):
+ return "TestOOoDynamicStyle"
+
+ def login(self):
+ uf = self.folder.acl_users
+ uf._doAddUser(self.manager_username, self.manager_password, ['Manager'], [])
+ user = uf.getUserById(self.manager_username).__of__(uf)
+ newSecurityManager(None, user)
+
+ def afterSetUp(self):
+ self.login()
+ ZopeTestCase.installProduct('Localizer')
+ ZopeTestCase.installProduct('PythonScripts')
+ ZopeTestCase.installProduct('ERP5OOo')
+ self.folder.Localizer = DummyLocalizer()
+ self.validator = Validator()
+ en_file_path = os.path.join(os.path.dirname(__file__),
+ 'test_document',
+ 'DYNAMIC_STYLE_en.odt')
+ en_file = open(en_file_path, 'rb')
+ ja_file_path = os.path.join(os.path.dirname(__file__),
+ 'test_document',
+ 'DYNAMIC_STYLE_ja.odt')
+ ja_file = open(ja_file_path, 'rb')
+
+ addStyleSheet = self.folder.manage_addProduct['OFSP'].manage_addFile
+ addStyleSheet(id='Test_getODTStyleSheet_en', file=en_file, title='',
+ precondition='', content_type=self.content_type_writer)
+ addStyleSheet(id='Test_getODTStyleSheet_ja', file=ja_file, title='',
+ precondition='', content_type=self.content_type_writer)
+ script_body = """
+current_language = context.Localizer.get_selected_language()
+return getattr(context, "%s_%s" % (parameter, current_language))
+"""
+ dispatcher = self.folder.manage_addProduct['PythonScripts']
+ dispatcher.manage_addPythonScript('Base_getODTStyleSheetByLanguage')
+ script = self.folder.Base_getODTStyleSheetByLanguage
+ script.ZPythonScript_edit('parameter', script_body)
+
+ def _validate(self, odf_file_data):
+ error_list = self.validator.validate(odf_file_data)
+ if error_list:
+ self.fail(''.join(error_list))
+
+ def _create_odt_zip_file(self, zip_string):
+ zipped_io = StringIO()
+ zipped_io.write(zip_string)
+ try:
+ odt_zip_file = ZipFile(zipped_io, mode='r', compression=ZIP_DEFLATED)
+ except RuntimeError:
+ odt_zip_file = ZipFile(zipped_io, mode='r')
+ return odt_zip_file
+
+ def test_01_dynamic(self):
+ """
+ Test applying stylesheet dynamically, using a Python Script with
+ a stylesheet file name parameter.
+ """
+ request = self.app.REQUEST
+ addOOoTemplate = self.folder.manage_addProduct['ERP5OOo'].addOOoTemplate
+ addOOoTemplate(id='Dynamic_viewAsOdt', title='')
+ Dynamic_viewAsOdt = self.folder.Dynamic_viewAsOdt
+ # The stylesheet file 'Test_getODTStyleSheet' is not exist in this site.
+ # So, the 'Base_getODTStyleSheet', a python script creates dynamically
+ # exsited stylesheet file name.
+ self.assertFalse(self.folder.hasObject('Test_getODTStyleSheet'))
+ self.assertTrue(self.folder.hasObject('Test_getODTStyleSheet_ja'))
+ self.assertTrue(self.folder.hasObject('Test_getODTStyleSheet_en'))
+ Dynamic_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
+ ooo_stylesheet='Test_getODTStyleSheet',
+ script_name='Base_getODTStyleSheetByLanguage')
+ Dynamic_viewAsOdt.pt_edit(self.content, content_type='application/vnd.oasis.opendocument.text')
+
+ # 1. test a normal case, language: ja
+ self.folder.Localizer.changeLanguage('ja')
+ response = self.publish('/' + self.folder.Dynamic_viewAsOdt.absolute_url(1))
+ self.assertEqual('application/vnd.oasis.opendocument.text',
+ response.getHeader('content-type').split(';')[0])
+ self.assertEqual('inline;filename="Dynamic_viewAsOdt"',
+ response.getHeader('content-disposition'))
+ self._validate(response.getBody())
+ self.assertTrue(200, response.getStatus())
+
+ odt_zip_file = self._create_odt_zip_file(response.getBody())
+ styles_xml_body = odt_zip_file.read('styles.xml')
+ self.assertTrue(len(styles_xml_body) > 0)
+ # 'Style sheet ja' text is in the odt document header,
+ # and the header is in the 'styles.xml'.
+ self.assertTrue(styles_xml_body.find('Style sheet ja') > 0)
+
+ # 2. test a normal case, change the language to 'en',
+ # so that the stylesheet changes dynamically.
+ self.folder.Localizer.changeLanguage('en')
+ response = self.publish('/' + self.folder.Dynamic_viewAsOdt.absolute_url(1))
+ self._validate(response.getBody())
+ odt_zip_file = self._create_odt_zip_file(response.getBody())
+ styles_xml_body = odt_zip_file.read('styles.xml')
+ self.assertTrue(styles_xml_body.find('Style sheet en') > 0)
+
+ # 3. test a fail case, reset a not existed stylesheet
+ Dynamic_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
+ ooo_stylesheet='NotFound_getODTStyleSheet',
+ script_name='Base_getODTStyleSheet')
+ self.assertFalse(self.folder.hasObject('NotFound_getODTStyleSheet'))
+ self.assertFalse(self.folder.hasObject('NotFound_getODTStyleSheet_ja'))
+ self.assertFalse(self.folder.hasObject('NotFound_getODTStyleSheet_en'))
+ self.folder.Localizer.changeLanguage('en')
+ response = self.publish('/' + self.folder.Dynamic_viewAsOdt.absolute_url(1))
+ # then, it is not a zip stream
+ self.assertFalse(response.getBody().startswith('PK'))
+ self.assertTrue(500, response.getStatus())
+
+
+ def test_02_static(self):
+ """
+ Test applying stylesheet statically, using a stylesheet File object.
+ """
+ request = self.app.REQUEST
+ addOOoTemplate = self.folder.manage_addProduct['ERP5OOo'].addOOoTemplate
+ addOOoTemplate(id='Static_viewAsOdt', title='')
+ Static_viewAsOdt = self.folder.Static_viewAsOdt
+ # Test_getODTStyleSheet_ja is statically exist.
+ self.assertTrue(self.folder.hasObject('Test_getODTStyleSheet_ja'))
+ Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
+ ooo_stylesheet='Test_getODTStyleSheet_ja', script_name='')
+ Static_viewAsOdt.pt_edit(self.content, content_type='application/vnd.oasis.opendocument.text')
+
+ # 1. test a normal case
+ response = self.publish('/' + self.folder.Static_viewAsOdt.absolute_url(1))
+ self.assertTrue(200, response.getStatus())
+ self.assertEqual('application/vnd.oasis.opendocument.text',
+ response.getHeader('content-type').split(';')[0])
+ self.assertEqual('inline;filename="Static_viewAsOdt"',
+ response.getHeader('content-disposition'))
+ self._validate(response.getBody())
+ odt_zip_file = self._create_odt_zip_file(response.getBody())
+ styles_xml_body = odt_zip_file.read('styles.xml')
+ self.assertTrue(len(styles_xml_body) > 0)
+ self.assertTrue(styles_xml_body.find('Style sheet ja') > 0)
+
+ # 2. test a normal case, change the style sheet
+ self.assertTrue(self.folder.hasObject('Test_getODTStyleSheet_en'))
+ Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
+ ooo_stylesheet='Test_getODTStyleSheet_en', script_name='')
+ response = self.publish('/' + self.folder.Static_viewAsOdt.absolute_url(1))
+ self.assertTrue(200, response.getStatus())
+ self._validate(response.getBody())
+ odt_zip_file = self._create_odt_zip_file(response.getBody())
+ styles_xml_body = odt_zip_file.read('styles.xml')
+ self.assertTrue(len(styles_xml_body) > 0)
+ self.assertTrue(styles_xml_body.find('Style sheet en') > 0)
+
+ # 3. test a fail case
+ self.assertFalse(self.folder.hasObject('NotFound_getODTStyleSheet'))
+ Static_viewAsOdt.doSettings(request, title='', xml_file_id='content.xml',
+ ooo_stylesheet='NotFound_getODTStyleSheet', script_name='')
+ response = self.publish('/' + self.folder.Static_viewAsOdt.absolute_url(1))
+ self.assertFalse(response.getBody().startswith('PK'))
+ self.assertTrue(500, response.getStatus())
+
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestOooDynamicStyle))
+ return suite
Added: erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_en.odt
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_en.odt?rev=25718&view=auto
==============================================================================
Binary file - no diff available.
Propchange: erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_en.odt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_ja.odt
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_ja.odt?rev=25718&view=auto
==============================================================================
Binary file - no diff available.
Propchange: erp5/trunk/products/ERP5OOo/tests/test_document/DYNAMIC_STYLE_ja.odt
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Modified: erp5/trunk/products/ERP5OOo/www/formSettings.zpt
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/www/formSettings.zpt?rev=25718&r1=25717&r2=25718&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/www/formSettings.zpt [utf8] (original)
+++ erp5/trunk/products/ERP5OOo/www/formSettings.zpt [utf8] Thu Feb 26 09:21:24 2009
@@ -22,6 +22,12 @@
tal:attributes="value request/ooo_stylesheet | here/ooo_stylesheet | nothing"/></td>
</tr>
<tr>
+ <td class="form-label">OOo Stylesheet Script</td>
+ <td><input name="script_name" value="default_ooo_script" type="text" size="20"
+ tal:attributes="value request/ooo_script_name | here/ooo_script_name | nothing"/></td>
+ </tr>
+
+ <tr>
<td align="left" valign="top">
<div class="form-element">
<em tal:condition="here/wl_isLocked">Locked by WebDAV</em>
More information about the Erp5-report
mailing list