[Erp5-report] r15372 - in /erp5/trunk/products/ERP5OOo: ./ Document/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jul 27 20:33:24 CEST 2007


Author: rie
Date: Fri Jul 27 20:33:23 2007
New Revision: 15372

URL: http://svn.erp5.org?rev=15372&view=rev
Log:
implement batch_mode correctly and test it.

Added:
    erp5/trunk/products/ERP5OOo/tests/PersonSpreadsheetStylesheet   (with props)
    erp5/trunk/products/ERP5OOo/tests/testOOoBatchMode.py
Modified:
    erp5/trunk/products/ERP5OOo/Document/OOoDocument.py
    erp5/trunk/products/ERP5OOo/OOoTemplate.py
    erp5/trunk/products/ERP5OOo/OOoUtils.py

Modified: erp5/trunk/products/ERP5OOo/Document/OOoDocument.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/Document/OOoDocument.py?rev=15372&r1=15371&r2=15372&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/Document/OOoDocument.py (original)
+++ erp5/trunk/products/ERP5OOo/Document/OOoDocument.py Fri Jul 27 20:33:23 2007
@@ -373,7 +373,7 @@
       if display is None or original_format not in STANDARD_IMAGE_FORMAT_LIST:
         self.setConversion(data, mime, format=format)
       else:
-        temp_image = self.portal_contributions.newContent(
+        self.portal_contributions.newContent(
                                        portal_type='Image',
                                        temp_object=1)
         temp_image._setData(data)

Modified: erp5/trunk/products/ERP5OOo/OOoTemplate.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/OOoTemplate.py?rev=15372&r1=15371&r2=15372&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/OOoTemplate.py (original)
+++ erp5/trunk/products/ERP5OOo/OOoTemplate.py Fri Jul 27 20:33:23 2007
@@ -51,6 +51,8 @@
 except ImportError:
   SUPPORTS_WEBDAV_LOCKS = 0
 
+from Products.ERP5.Document.Document import ConversionError
+
 # Constructors
 manage_addOOoTemplate = DTMLFile("dtml/OOoTemplate_add", globals())
 
@@ -63,11 +65,12 @@
   """
   # add actual object
   id = self._setObject(id, OOoTemplate(id, title))
-  file = REQUEST.form.get('file')
-  if file.filename:
-    # Get the template in the associated context and upload the file
-    getattr(self,id).pt_upload(REQUEST, file)
-  # respond to the add_and_edit button if necessary
+  if REQUEST is not None:
+    file = REQUEST.form.get('file')
+    if file.filename:
+      # Get the template in the associated context and upload the file
+      getattr(self,id).pt_upload(REQUEST, file)
+      # respond to the add_and_edit button if necessary
   add_and_edit(self, id, REQUEST)
   return ''
 
@@ -394,9 +397,8 @@
   def pt_render(self, source=0, extra_context={}):
     # Get request
     request = extra_context.get('REQUEST', None)
-    if not request:
-      request = get_request()
-
+    if request is None:
+      request = self.REQUEST
     # Get parent object (the one to render this template on)
     here = getattr(self, 'aq_parent', None)
     if here is None:
@@ -413,6 +415,7 @@
     ooo_builder = OOoBuilder(ooo_document)
     # Pass builder instance as extra_context
     extra_context['ooo_builder'] = ooo_builder
+    
     # And render page template
     doc_xml = ZopePageTemplate.pt_render(self, source=source, extra_context=extra_context)
 
@@ -423,6 +426,7 @@
       default_styles_text = ooo_builder.extract('styles.xml')
     except AttributeError:
       default_styles_text = None
+
     # Add the associated files
     for dir_name, document_dict in attachments_dict.iteritems():
       # Special case : the document is an OOo one
@@ -441,9 +445,6 @@
         ooo_builder.addFileEntry(full_path=dir_name,
                   media_type=document_dict['doc_type'], content = document_dict['document'] )
 
-    # Get request and batch_mode
-    batch_mode = extra_context.get('batch_mode', 0)
-
     # Debug mode
     if request.get('debug',0):
       return doc_xml
@@ -457,6 +458,12 @@
     except AttributeError:
       self.OLE_documents_zipstring = None
 
+    # Convert if necessary
+    opts = extra_context.get("options", None)
+
+    # Get request and batch_mode
+    batch_mode = opts.get('batch_mode', None)
+
     # If the file has embedded OLE documents, restore it
     if self.OLE_documents_zipstring:
       additional_builder = OOoBuilder( self.OLE_documents_zipstring )
@@ -467,24 +474,22 @@
     ooo_builder.updateManifest()
 
     # Produce final result
-    ooo = ooo_builder.render(self.title or self.id)
-
-    # Convert if necessary
-    opts = extra_context.get("options", None)
+    ooo = ooo_builder.render(name=self.title or self.id)
+    
     if opts is not None:
       format = opts.get('format', request.get('format', None))
       if format:
-        return self._asFormat(ooo, format, request)
-
-    # Do not send a RESPONSE if in batch_mode
-    if request and not batch_mode:
+        return self._asFormat(ooo, format, request, batch_mode)
+
+    if format is None and not batch_mode:
       request.RESPONSE.setHeader('Content-Type','%s;; charset=utf-8' % self.content_type)
-      request.RESPONSE.setHeader('Content-Length',len(ooo))
-      request.RESPONSE.setHeader('Content-Disposition','inline;filename=%s' %
-                                  self.title_or_id())
-
+      request.RESPONSE.setHeader('Content-disposition', 'inline;filename=%s' % self.title_or_id())
+    else:
+      request.RESPONSE.setHeader('Content-Type','%s;; charset=utf-8' % 'text/html')
+      request.RESPONSE.setHeader('Content-disposition', 'inline;filename=%s' % self.title_or_id())
+        
     return ooo
-
+  
   def om_icons(self):
     """Return a list of icon URLs to be displayed by an ObjectManager"""
     icons = ({'path': 'misc_/ERP5OOo/OOo.png',
@@ -503,8 +508,8 @@
     """
     return self._asFormat(ooo, 'pdf', REQUEST)
 
-  def _asFormat(self, ooo, format, REQUEST=None):
-    # now create a temp OOoDocument to convert data to pdf
+  def _asFormat(self, ooo, format, REQUEST=None, batch_mode=0):
+    # Now create a temp OOoDocument to convert data to pdf
     from Products.ERP5Type.Document import newTempOOoDocument
     tmp_ooo = newTempOOoDocument(self, self.title_or_id())
     tmp_ooo.edit(base_data=ooo,
@@ -512,30 +517,30 @@
                  source_reference=self.title_or_id(),
                  base_content_type=self.content_type,)
     tmp_ooo.oo_data = ooo
-    
-    if format == 'pdf':
-      # slightly different implementation
+    if format == 'pdf' and not batch_mode:
+      # Slightly different implementation
       # now convert it to pdf
       tgts = [x[1] for x in tmp_ooo.getTargetFormatItemList()
               if x[1].endswith('pdf')]
       if len(tgts) > 1:
-          raise ValueError, 'multiple pdf formats found - this shouldnt happen'
+        REQUEST.RESPONSE.setHeader('Content-type', 'text/html')
+        REQUEST.RESPONSE.setHeader('Content-disposition', 'inline;filename=%s.pdf' % self.title_or_id())
+        raise ValueError, 'multiple pdf formats found - this shouldnt happen'
       if len(tgts) == 0:
-          raise ValueError, 'no pdf format found'
+        REQUEST.RESPONSE.setHeader('Content-type', 'text/html')
+        REQUEST.RESPONSE.setHeader('Content-disposition', 'inline;filename=%s.pdf' % self.title_or_id())    
+        raise ValueError, 'no pdf format found'
       fmt = tgts[0]
       mime, data = tmp_ooo.convert(fmt)
       if REQUEST is not None:
-        REQUEST.RESPONSE.setHeader('Content-type', 'application/pdf')
-        REQUEST.RESPONSE.setHeader('Content-disposition',
-                       'attachment;; filename="%s.pdf"' % self.title_or_id())
+          REQUEST.RESPONSE.setHeader('Content-type', 'application/pdf')
+          REQUEST.RESPONSE.setHeader('Content-disposition', 'attachment;filename=%s.pdf' % self.title_or_id())
       return data
-
-    mime, data = tmp_ooo.convert(format)
+    mime , data = tmp_ooo.convert(format)
     if REQUEST is not None:
       REQUEST.RESPONSE.setHeader('Content-type', mime)
-      REQUEST.RESPONSE.setHeader('Content-disposition',
-               'attachment;; filename="%s.%s"' % (self.title_or_id(),format))
-      # FIXME the above lines should return zip format when html was requested
+      REQUEST.RESPONSE.setHeader('Content-disposition', 'attachment;filename=%s.%s' % (self.title_or_id(),format))
+        # FIXME the above lines should return zip format when html was requested
     return data
 
 InitializeClass(OOoTemplate)

Modified: erp5/trunk/products/ERP5OOo/OOoUtils.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/OOoUtils.py?rev=15372&r1=15371&r2=15372&view=diff
==============================================================================
--- erp5/trunk/products/ERP5OOo/OOoUtils.py (original)
+++ erp5/trunk/products/ERP5OOo/OOoUtils.py Fri Jul 27 20:33:23 2007
@@ -176,7 +176,6 @@
     """ Add a path to the manifest """
     MANIFEST_FILENAME = 'META-INF/manifest.xml'
     meta_infos = self.extract(MANIFEST_FILENAME)
-
     # prevent some duplicates
     for meta_line in meta_infos.split('\n'):
         for new_meta_line in self._manifest_additions_list:
@@ -207,9 +206,9 @@
     returns the OOo document
     """
     request = get_request()
-    request.response.setHeader('Content-type', OOo_mimeType_dict.get(extension, 'application/vnd.sun.xml.writer'))
     if name:
-      request.response.setHeader('Content-Disposition', 'attachment; filename=%s.%s' % (name, extension))
+      request.response.setHeader('Content-Disposition', 'inline; filename=%s.%s' % (name, extension))
+
     self._document.seek(0)
     return self._document.read()
 

Added: erp5/trunk/products/ERP5OOo/tests/PersonSpreadsheetStylesheet
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/PersonSpreadsheetStylesheet?rev=15372&view=auto
==============================================================================
Binary file - no diff available.

Propchange: erp5/trunk/products/ERP5OOo/tests/PersonSpreadsheetStylesheet
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: erp5/trunk/products/ERP5OOo/tests/testOOoBatchMode.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5OOo/tests/testOOoBatchMode.py?rev=15372&view=auto
==============================================================================
--- erp5/trunk/products/ERP5OOo/tests/testOOoBatchMode.py (added)
+++ erp5/trunk/products/ERP5OOo/tests/testOOoBatchMode.py Fri Jul 27 20:33:23 2007
@@ -1,0 +1,124 @@
+##############################################################################
+#
+# Copyright (c) 2004, 2005, 2006 Nexedi SARL and Contributors. 
+# All Rights Reserved.
+##
+# 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 Zope
+from AccessControl.SecurityManagement import newSecurityManager
+from Testing import ZopeTestCase
+from Products.PageTemplates.GlobalTranslationService import setGlobalTranslationService
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Testing.makerequest import makerequest
+from Products.ERP5.Document.Document import ConversionError
+from App.config import getConfiguration
+
+class TestOoodResponse(ERP5TypeTestCase):
+
+  manager_username = 'rie'
+  manager_password = 'rie'
+  quiet = 1
+  run_all_test = 1  
+
+  def getTitle(self):
+    return "TestOOoBatchMode"
+
+  def login(self, quiet=0, run=run_all_test):
+    uf = self.getPortal().acl_users
+    uf._doAddUser(self.manager_username, self.manager_password, ['Manager'], [])
+    user = uf.getUserById(self.manager_username).__of__(uf)
+    newSecurityManager(None, user)
+
+  def getBusinessTemplateList(self):
+    return ()
+
+  def afterSetUp(self):
+    self.login()
+    portal_skins = self.getSkinsTool()
+    portal_skins.custom.REQUEST.RESPONSE.setHeader('content-type', 'text/html')
+    try:
+      import_file_path = os.path.join(getConfiguration().instancehome,
+                                      'Products',
+                                      'ERP5OOo',
+                                      'tests',
+                                      'PersonSpreadsheetStylesheet' )
+    except IOError:
+      import_file_path = os.path.join(getConfiguration().softwarehome,
+                                      'Products',
+                                      'ERP5OOo',
+                                      'tests',
+                                      'PersonSpreadsheetStylesheet')
+      
+    import_file = open(import_file_path)
+    addStyleSheet = portal_skins.custom.manage_addProduct['OFSP'].manage_addFile
+    addStyleSheet(id='Base_getODTStyleSheet', file=import_file, title='', precondition='', content_type='application/vnd.oasis.opendocument.text')
+    addOOoTemplate = portal_skins.custom.manage_addProduct['ERP5OOo'].addOOoTemplate
+    addOOoTemplate(id='ERP5Site_viewNothingAsOdt', title='')
+    portal_skins.changeSkin(skinname=None)
+    ERP5Site_viewNothingAsOdt = self.getPortal().ERP5Site_viewNothingAsOdt
+    text = "<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>"
+    content_type = 'application/vnd.oasis.opendocument.text'
+    ERP5Site_viewNothingAsOdt.pt_edit(text, content_type)
+
+  def test_01_noExcNoFormatNoBatchMode(self):
+    portal_skins = self.getSkinsTool()
+    portal_skins.custom.REQUEST.RESPONSE.setHeader('content-type', 'text/html')
+    ERP5Site_viewNothingAsOdt = self.getPortal().ERP5Site_viewNothingAsOdt
+    ERP5Site_viewNothingAsOdt(batch_mode=0)
+    self.assertEqual('application/vnd.oasis.opendocument.text', portal_skins.custom.REQUEST.RESPONSE.getHeader('content-type').split(';')[0])
+    self.assertEqual('inline;filename=ERP5Site_viewNothingAsOdt', portal_skins.custom.REQUEST.RESPONSE.getHeader('content-disposition'))
+    
+  def test_02_noExcNoFormatBatchMode(self):
+    portal_skins = self.getSkinsTool()
+    portal_skins.custom.REQUEST.RESPONSE.setHeader('content-type', 'text/html')
+    ERP5Site_viewNothingAsOdt = self.getPortal().ERP5Site_viewNothingAsOdt
+    ERP5Site_viewNothingAsOdt(batch_mode=1)
+    self.assertEqual('text/html', portal_skins.custom.REQUEST.RESPONSE.getHeader('content-type').split(';')[0])
+    
+  def test_03_excPdfFormatNoBatchMode(self):
+    portal_skins = self.getSkinsTool()
+    portal_skins.custom.REQUEST.RESPONSE.setHeader('content-type', 'text/html')
+    ERP5Site_viewNothingAsOdt = self.getPortal().ERP5Site_viewNothingAsOdt
+    self.assertRaises(ConversionError, ERP5Site_viewNothingAsOdt, batch_mode=0, format='pdf') 
+    self.assertEqual('text/html', portal_skins.custom.REQUEST.RESPONSE.getHeader('content-type').split(';')[0])
+
+  def test_04_excPdfFormatBatchMode(self):
+    portal_skins = self.getSkinsTool()
+    portal_skins.custom.REQUEST.RESPONSE.setHeader('content-type', 'text/html')
+    ERP5Site_viewNothingAsOdt = self.getPortal().ERP5Site_viewNothingAsOdt
+    self.assertRaises(ConversionError, ERP5Site_viewNothingAsOdt, batch_mode=1, format='pdf')
+    self.assertEqual('text/html', portal_skins.custom.REQUEST.RESPONSE.getHeader('content-type').split(';')[0])
+
+if __name__ == '__main__':
+    framework()
+else:
+    import unittest
+    def test_suite():
+        suite = unittest.TestSuite()
+        suite.addTest(unittest.makeSuite(TestOoodResponse))
+        return suite
+




More information about the Erp5-report mailing list