예제 #1
0
  def afterSetUp(self):
    if not self.skin:
      raise NotImplementedError('Subclasses must define skin')

    gender = self.portal.portal_categories.gender
    if 'male' not in gender.objectIds():
      gender.newContent(id='male')
      self.portal.portal_caches.clearAllCache()

    self.auth = 'ERP5TypeTestCase:'
    person_module = self.portal.person_module
    if person_module._getOb('pers', None) is None:
      person_module.newContent(id='pers', portal_type='Person')
      self.tic()
    person_module.pers.setFirstName('Bob')
    person_module.pers.setGender(None)
    person_module.pers.setCareerRole(None)

    if person_module.pers._getOb('img', None) is None:
      person_module.pers.newContent(portal_type='Embedded File', id='img')

    if person_module._getOb('pers_without_image', None) is None:
      person = person_module.newContent(
                              portal_type='Person',
                              id = 'pers_without_image',
                              first_name = 'Test')
      self.tic()

    self.portal.changeSkin(self.skin)
    self.validator = Validator()
    # make sure selections are empty
    name = 'person_module_selection'
    self.portal.portal_selections.setSelectionFor(name, Selection(name))
예제 #2
0
  def test_InvoiceViewAsODT(self):
    """Create ODT printout """
    resource = self.portal.getDefaultModule(
        self.resource_portal_type).newContent(
                    portal_type=self.resource_portal_type,
                    title='Resource',)
    client = self.portal.organisation_module.newContent(
                              portal_type='Organisation', title='Client')
    vendor = self.portal.organisation_module.newContent(
                              portal_type='Organisation', title='Vendor')
    invoice = self.portal.getDefaultModule(self.invoice_portal_type).newContent(
                              portal_type=self.invoice_portal_type,
                              specialise=self.business_process,
                              start_date=DateTime(2008, 12, 31),
                              title='Invoice',
                              source_value=vendor,
                              source_section_value=vendor,
                              destination_value=client,
                              destination_section_value=client)
    line = invoice.newContent(portal_type=self.invoice_line_portal_type,
                            resource_value=resource,
                            quantity=10,
                            price=3)
    invoice.confirm()
    self.tic()

    odt = invoice.Invoice_viewAsODT()
    from Products.ERP5OOo.tests.utils import Validator
    odf_validator = Validator()
    err_list = odf_validator.validate(odt)
    if err_list:
      self.fail(''.join(err_list))
예제 #3
0
 def test_report_view(self):
     self.loginAsUser('bob')
     self.portal.changeSkin('Deferred')
     response = self.publish(
         '/%s/person_module/pers/Base_viewHistory?deferred_portal_skin=%s' %
         (self.portal.getId(), self.skin),
         '%s:%s' % (self.username, self.password))
     self.tic()
     last_message = self.portal.MailHost._last_message
     self.assertNotEquals((), last_message)
     mfrom, mto, message_text = last_message
     self.assertEqual(
         '"%s" <%s>' % (self.first_name, self.recipient_email_address),
         mto[0])
     mail_message = email.message_from_string(message_text)
     for part in mail_message.walk():
         content_type = part.get_content_type()
         file_name = part.get_filename()
         if content_type == self.content_type:
             # "History" is the title of Base_viewHistory form
             file_name = part.get_filename()
             expected_file_name = 'History%s' % self.attachment_file_extension
             self.assertEqual(expected_file_name, file_name)
             self.assertEqual(
                 'attachment; filename="%s"' % expected_file_name,
                 part.get('Content-Disposition'))
             data = part.get_payload(decode=True)
             error_list = Validator().validate(data)
             if error_list:
                 self.fail(''.join(error_list))
             break
     else:
         self.fail('Attachment not found in email\n%s' % message_text)
예제 #4
0
 def test_normal_form(self):
     self.loginAsUser('bob')
     # simulate a big request, for which Base_callDialogMethod will not issue a
     # redirect
     response = self.publish(
         '/%s/person_module/pers/Base_callDialogMethod?deferred_portal_skin=%s&'
         'dialog_method=Person_view&dialog_id=Person_view&'
         'deferred_style:int=1&junk=%s' %
         (self.portal.getId(), self.skin, 'X' * 2000),
         '%s:%s' % (self.username, self.password))
     self.tic()
     last_message = self.portal.MailHost._last_message
     self.assertNotEquals((), last_message)
     mfrom, mto, message_text = last_message
     self.assertEqual(
         '"%s" <%s>' % (self.first_name, self.recipient_email_address),
         mto[0])
     mail_message = email.message_from_string(message_text)
     for part in mail_message.walk():
         content_type = part.get_content_type()
         if content_type == self.content_type:
             # "Person" is the title of Person_view form
             file_name = part.get_filename()
             expected_file_name = 'Person%s' % self.attachment_file_extension
             self.assertEqual(expected_file_name, file_name)
             self.assertEqual(
                 'attachment; filename="%s"' % expected_file_name,
                 part.get('Content-Disposition'))
             data = part.get_payload(decode=True)
             error_list = Validator().validate(data)
             if error_list:
                 self.fail(''.join(error_list))
             break
     else:
         self.fail('Attachment not found in email\n%s' % message_text)
예제 #5
0
  def afterSetUp(self):
    self.login()
    self.getPortal().Localizer = DummyLocalizer()
    v12schema_url = os.path.join(os.path.dirname(__file__),
                                 'OpenDocument-v1.2-os-schema.rng')
    self.validator = Validator(schema_url=v12schema_url)
    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.getPortal().manage_addProduct['OFSP'].manage_addFile
    if getattr(self.getPortal(), 'Test_getODTStyleSheet_en', None) is None:
      addStyleSheet(id='Test_getODTStyleSheet_en', file=en_file, title='',
        precondition='', content_type=self.content_type_writer)
    if getattr(self.getPortal(), 'Test_getODTStyleSheet_ja', None) is None:
      addStyleSheet(id='Test_getODTStyleSheet_ja', file=ja_file, title='',
        precondition='', content_type=self.content_type_writer)
    if getattr(self.getPortal(), 'Base_getODTStyleSheetByLanguage', None) is None:
      script_body = """
current_language = context.Localizer.get_selected_language()
return getattr(context, "%s_%s" % (parameter, current_language))
"""
      dispatcher = self.getPortal().manage_addProduct['PythonScripts']
      dispatcher.manage_addPythonScript('Base_getODTStyleSheetByLanguage')
      script = self.getPortal().Base_getODTStyleSheetByLanguage
      script.ZPythonScript_edit('parameter', script_body)
예제 #6
0
    def afterSetUp(self):
        self.auth = 'ERP5TypeTestCase:'
        portal = self.getPortal()
        container = portal.portal_skins.custom
        if self.form_id not in container.objectIds():
            container.manage_addProduct['ERP5Form'].addERP5Form(
                self.form_id, 'View')
            form = getattr(container, self.form_id)

            # create some persons in person_module
            self.createPersons()
            # add a ListBox field
            form.manage_addField('listbox', 'listbox', 'ListBox')
            form.listbox.ListBox_setPropertyList(
                field_list_method='zCountDocumentPerOwner',
                field_count_method='',
                field_columns=[
                    'owner | Owner', 'owner_count | Owner Count',
                    'number_count | Reference Count'
                ],
            )

            # create a Field OOoChart
            form.manage_addField(self.ooo_chart_id, self.ooo_chart_id,
                                 'OOoChart')

            # create a Field OOoChart
            form.manage_addField('your_ooochart', 'your_ooochart', 'OOoChart')

            # create a ZSQL Method
            sql = """SELECT owner, count(uid) AS owner_count,
              count(reference) AS number_count
              FROM catalog
              WHERE portal_type = 'Person'
              GROUP BY owner ORDER BY owner_count DESC"""

            template = String(source_string=sql)
            container.manage_addProduct['ZSQLMethods'].manage_addZSQLMethod(
                'zCountDocumentPerOwner', 'zCountDocumentPerOwner',
                'erp5_sql_connection', '', template)
            # enable preference
            preference = self.getPortal(
            ).portal_preferences.default_site_preference
            preference.setPriority(1)
            if preference.getPreferenceState() == 'disabled':
                self.getWorkflowTool().doActionFor(ob=preference,
                                                   action='enable_action',
                                                   wf_id='preference_workflow')

        self.validator = Validator()
        self.tic()
예제 #7
0
    def afterSetUp(self):
        self.login()
        self.setSystemPreference()
        # XML validator
        v12schema_url = os.path.join(os.path.dirname(__file__),
                                     'OpenDocument-v1.2-os-schema.rng')
        self.validator = Validator(schema_url=v12schema_url)

        foo_file_path = os.path.join(os.path.dirname(__file__),
                                     'test_document', 'Foo_001.odg')
        foo_file = open(foo_file_path, 'rb')
        self._validate(foo_file.read())
        custom = self.portal.portal_skins.custom
        addStyleSheet = custom.manage_addProduct['OFSP'].manage_addFile
        if custom._getOb('Foo_getODGStyleSheet', None) is None:
            addStyleSheet(
                id='Foo_getODGStyleSheet',
                file=foo_file,
                title='',
                precondition='',
                content_type='application/vnd.oasis.opendocument.graphics')
        erp5OOo = custom.manage_addProduct['ERP5OOo']

        if custom._getOb('Foo_viewAsODGPrintout', None) is None:
            erp5OOo.addFormPrintout(id='Foo_viewAsODGPrintout',
                                    title='',
                                    form_name='Foo_view',
                                    template='Foo_getODGStyleSheet')
        if custom._getOb('Foo_viewProxyFieldAsODGPrintout', None) is None:
            erp5OOo.addFormPrintout(id='Foo_viewProxyFieldAsODGPrintout',
                                    title='',
                                    form_name='Foo_viewProxyField',
                                    template='Foo_getODGStyleSheet')
        if custom._getOb('FooReport_viewAsODGPrintout', None) is None:
            erp5OOo.addFormPrintout(id='FooReport_viewAsODGPrintout', title='')

        ## append 'test1' data to a listbox
        foo_module = self.portal.foo_module
        if foo_module._getOb('test1', None) is None:
            foo_module.newContent(id='test1', portal_type='Foo')
        test1 = foo_module.test1
        if test1._getOb("foo_1", None) is None:
            test1.newContent("foo_1",
                             title='Foo Line 1',
                             portal_type='Foo Line')
        if test1._getOb("foo_2", None) is None:
            test1.newContent("foo_2",
                             title='Foo Line 2',
                             portal_type='Foo Line')
        self.tic()
예제 #8
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 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)

        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]