Exemplo n.º 1
0
  def pt_render(self, source=0, extra_context={}):
    # Get request
    request = extra_context.get('REQUEST', self.REQUEST)
    # Get parent object (the one to render this template on)
    here = getattr(self, 'aq_parent', None)
    if here is None:
      # This is a system error
      raise ValueError, 'Can not render a template without a parent acquisition context'
    # Retrieve master document
    ooo_document = None
    # If script is setting, call it
    if 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
      if getattr(aq_base(ooo_document), '__call__', None) is not None:
        request.set('format', None)
        ooo_document = ooo_document()
    finally:
      request.set('format', format)
    # Create a new builder instance
    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)
    if isinstance(doc_xml, unicode):
      doc_xml = doc_xml.encode('utf-8')

    # Replace the includes
    (doc_xml,attachments_dict) = self.renderIncludes(here, doc_xml,
                                                     extra_context, request)

    try:
      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
      if document_dict['doc_type'].startswith(self._OOo_content_type_root) or \
         document_dict['doc_type'].startswith(self._ODF_content_type_root):
        ooo_builder.addFileEntry(full_path=dir_name,
                                 media_type=document_dict['doc_type'])
        ooo_builder.addFileEntry(full_path=dir_name + '/content.xml',
                                 media_type='text/xml', content=document_dict['document'])
        styles_text = default_styles_text
        if document_dict.has_key('stylesheet') and document_dict['stylesheet']:
          styles_text = document_dict['stylesheet']
        if styles_text:
          ooo_builder.addFileEntry(full_path=dir_name + '/styles.xml',
                                   media_type='text/xml', content=styles_text)
      else: # Generic case
        ooo_builder.addFileEntry(full_path=dir_name,
                                 media_type=document_dict['doc_type'],
                                 content=document_dict['document'])

    # Replace content.xml in master openoffice template
    ooo_builder.replace(self.ooo_xml_file_id, doc_xml)

    # Old templates correction
    try:
      self.OLE_documents_zipstring
    except AttributeError:
      self.OLE_documents_zipstring = None

    # Convert if necessary
    opts = extra_context.get("options", dict())

    # Get 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 )
      for name in additional_builder.getNameList():
        ooo_builder.replace(name, additional_builder.extract(name) )

    # Update the META informations
    ooo_builder.updateManifest()

    # Produce final result
    if batch_mode:
      ooo = ooo_builder.render()
    else:
      ooo = ooo_builder.render(name=self.title or self.id, source=source)

    if DevelopmentMode:
      # Validate XML in development mode
      from Products.ERP5OOo.tests.utils import Validator
      err_list = Validator().validate(ooo)
      if err_list:
        LOG('ERP5OOo', PROBLEM,
            'Validation of %s failed:\n%s' % (self.getId(), ''.join(err_list)))

    extension = None
    mimetype = ooo_builder.getMimeType()
    mimetypes_registry = self.getPortalObject().mimetypes_registry
    mimetype_object_list = mimetypes_registry.lookup(mimetype)
    for mimetype_object in mimetype_object_list:
      if mimetype_object.extensions:
        extension = mimetype_object.extensions[0]
        break
      elif mimetype_object.globs:
        extension = mimetype_object.globs.strip('*.')
        break
    if extension:
      filename = '%s.%s' % (self._getFileName(), extension)
    else:
      filename = self._getFileName()

    from Products.ERP5Type.Document import newTempOOoDocument
    tmp_ooo = newTempOOoDocument(self, self.title_or_id())
    tmp_ooo.edit(data=ooo,
                 filename=filename,
                 content_type=mimetype,)

    format = opts.get('format', request.get('format', None))
    if format:
      # Performance improvement:
      # We already have OOo format data, so we do not need to call
      # convertToBaseFormat(), but just copy it into base_data property.
      tmp_ooo.setBaseData(ooo)
      tmp_ooo.setBaseContentType(mimetype)

    if request is not None and not batch_mode and not source:
      return tmp_ooo.index_html(REQUEST=request,
                                RESPONSE=request.RESPONSE,
                                format=format)
    return tmp_ooo.convert(format)[1]
Exemplo n.º 2
0
    def pt_render(self, source=0, extra_context={}):
        if source:
            return ZopePageTemplate.pt_render(self,
                                              source=source,
                                              extra_context=extra_context)
        # Get request
        request = extra_context.get('REQUEST', self.REQUEST)
        # Get parent object (the one to render this template on)
        here = getattr(self, 'aq_parent', None)
        if here is None:
            # This is a system error
            raise ValueError, 'Can not render a template without a parent acquisition context'
        # Retrieve master document
        ooo_document = None
        # If script is setting, call it
        if 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
            if getattr(aq_base(ooo_document), '__call__', None) is not None:
                request.set('format', None)
                ooo_document = ooo_document()
        finally:
            request.set('format', format)
        # Create a new builder instance
        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)
        if isinstance(doc_xml, unicode):
            doc_xml = doc_xml.encode('utf-8')

        # Replace the includes
        (doc_xml,
         attachments_dict) = self.renderIncludes(here, doc_xml, extra_context,
                                                 request)

        try:
            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
            if document_dict['doc_type'].startswith(self._OOo_content_type_root) or \
               document_dict['doc_type'].startswith(self._ODF_content_type_root):
                ooo_builder.addFileEntry(full_path=dir_name,
                                         media_type=document_dict['doc_type'])
                ooo_builder.addFileEntry(full_path=dir_name + '/content.xml',
                                         media_type='text/xml',
                                         content=document_dict['document'])
                styles_text = default_styles_text
                if document_dict.has_key(
                        'stylesheet') and document_dict['stylesheet']:
                    styles_text = document_dict['stylesheet']
                if styles_text:
                    ooo_builder.addFileEntry(full_path=dir_name +
                                             '/styles.xml',
                                             media_type='text/xml',
                                             content=styles_text)
            else:  # Generic case
                ooo_builder.addFileEntry(full_path=dir_name,
                                         media_type=document_dict['doc_type'],
                                         content=document_dict['document'])

        # Replace content.xml in master openoffice template
        ooo_builder.replace(self.ooo_xml_file_id, doc_xml)

        # Old templates correction
        try:
            self.OLE_documents_zipstring
        except AttributeError:
            self.OLE_documents_zipstring = None

        # Convert if necessary
        opts = extra_context.get("options", {})

        # Get batch_mode
        batch_mode = opts.get('batch_mode', None)

        # If the file has embedded OLE documents, restore them
        if self.OLE_documents_zipstring:
            additional_builder = OOoBuilder(self.OLE_documents_zipstring)
            for name in additional_builder.getNameList():
                if name not in ('META-INF/manifest.xml', ):
                    # We don't replace manifest
                    ooo_builder.replace(name, additional_builder.extract(name))

        # Update the META information
        ooo_builder.updateManifest()

        # Produce final result
        if batch_mode:
            ooo = ooo_builder.render()
        else:
            ooo = ooo_builder.render(name=self.title or self.id, source=source)

        extension = None
        mimetype = ooo_builder.getMimeType()
        mimetypes_registry = self.getPortalObject().mimetypes_registry
        mimetype_object_list = mimetypes_registry.lookup(mimetype)
        for mimetype_object in mimetype_object_list:
            if mimetype_object.extensions:
                extension = mimetype_object.extensions[0]
                break
            elif mimetype_object.globs:
                extension = mimetype_object.globs.strip('*.')
                break
        if extension:
            filename = '%s.%s' % (self._getFileName(), extension)
        else:
            filename = self._getFileName()

        from Products.ERP5Type.Document import newTempOOoDocument
        tmp_ooo = newTempOOoDocument(self, self.title_or_id())
        tmp_ooo.edit(
            data=ooo,
            filename=filename,
            content_type=mimetype,
        )

        format = opts.get('format', request.get('format', None))
        if format:
            # Performance improvement:
            # We already have OOo format data, so we do not need to call
            # convertToBaseFormat(), but just copy it into base_data property.
            tmp_ooo.setBaseData(ooo)
            tmp_ooo.setBaseContentType(mimetype)

        if request is not None and not batch_mode and not source:
            return tmp_ooo.index_html(REQUEST=request,
                                      RESPONSE=request.RESPONSE,
                                      format=format)
        return tmp_ooo.convert(format)[1]