예제 #1
0
  def addListField(field_id, field_title):
    # this one is for categories
    request_key = field_id
    field_id = 'your_%s_relative_url' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category_list'))
    field._surcharged_edit(dict(title=field_title), ['title'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_%s_relative_url | '
              'here/portal_selections/%s/dialog_strict_%s_relative_url | nothing'
                                    % (selection_name, request_key,
                                       selection_name, request_key)),
            items=TALESMethod('python: getattr(here.portal_categories["%s"],'
                             'here.portal_preferences.getPreference("'
                             'preferred_category_child_item_list_method_id",'
                             '"getCategoryChildCompactLogicalPathItemList"))('
                             'checked_permission="View", base=1,'
                             'display_none_category=False,'
                             'local_sort_id="int_index")' % request_key)),
            ['title', 'items', 'default'])

    field_id = 'your_%s_relative_url_is_strict_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewFieldLibrary',
        field_id='your_checkbox'))
    field._surcharged_edit(dict(title='%s Strict' % field_title), ['title'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_strict_%s_relative_url | nothing'
                                    % (selection_name, request_key,))),
        ['title', 'default'])

    field_id = 'your_%s_relative_url_is_excluded_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewFieldLibrary',
        field_id='your_checkbox'))
    field._surcharged_edit(dict(title='%s Excluded' % field_title), ['title'])
    from zLOG import LOG
    LOG("selection_name %r, request_key %r" %(selection_name, request_key), 300, field_id)
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_excluded_%s_relative_url | nothing'
                                    % (selection_name, request_key,))),
        ['title', 'default'])
예제 #2
0
    def test_proxifyParallelListField(self):
        """ParallelListField has its own get_value method and the method does
    different from the original one. This test checks if ProxyField can
    behave the same as ParallelListField.
    """
        # Setup
        if getattr(self.portal.portal_categories, 'colour', None) is None:
            self.portal.portal_categories.newContent('colour')
        if getattr(self.portal.portal_categories, 'size', None) is None:
            self.portal.portal_categories.newContent('size')

        portal_skins = self.getSkinsTool()
        # Create skin folder
        portal_skins.manage_addProduct['OFSP'].manage_addFolder('erp5_geek')
        skin_folder = portal_skins._getOb('erp5_geek')

        skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
            'Base_viewGeek1', 'View')
        skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
            'Base_viewGeek2', 'View')

        form_1 = skin_folder.Base_viewGeek1
        # Add a parallel list field
        form_1.manage_addField('my_field', '', 'ParallelListField')
        form_1.my_field.manage_tales_xmlrpc(
            dict(
                default="python:['colour/blue']",
                items=
                "python: [['Blue', 'colour/blue'], ['Red', 'colour/red'], ['Large', 'size/large'], ['Small', 'size/small']]"
            ))
        form_1.my_field.manage_edit_xmlrpc(
            dict(hash_script_id="Base_getMultiListFieldPropertyDictList"))

        form_2 = skin_folder.Base_viewGeek2
        # Add a proxy field which has the same configuration as above field.
        form_2.manage_addField('my_field', '', 'ProxyField')
        form_2.my_field.manage_edit_xmlrpc(
            dict(form_id='Base_viewFieldLibrary',
                 field_id='my_parallel_list_field'))
        form_2.my_field._surcharged_edit(
            dict(hash_script_id="Base_getMultiListFieldPropertyDictList"),
            ['hash_script_id'])
        form_2.my_field._surcharged_tales(
            dict(
                default=TALESMethod("python:['colour/blue']"),
                items=TALESMethod(
                    "python: [['Blue', 'colour/blue'], ['Red', 'colour/red'], ['Large', 'size/large'], ['Small', 'size/small']]"
                )), ['default', 'items', 'hash_script_id'])

        # Compare
        # XXX Remove new lines. An extra new line is inserted by unknown reason.
        form_1_html = form_1.my_field.render(REQUEST=self.app.REQUEST).replace(
            '\n', '')
        form_2_html = form_2.my_field.render(REQUEST=self.app.REQUEST).replace(
            '\n', '')
        self.assertEqual(form_1_html, form_2_html)
예제 #3
0
    def _test_list_items(self, list_field_type):
        """ test if a list of values returned by TALES (override) expressions
        is interpreted properly.
        If a TALES tab returns a sequence of items and some item is
        actually a string of length 2 (e.g. "ok"), this previously
        has lead to a item text of 'o' and a display value of 'k'
        (as the this is actually a sequence of length 2 ...)
         See http://sourceforge.net/mailarchive/forum.php?thread_id=1359918&forum_id=1702
        """

        self.form.manage_addField('list_field', 'Test List Field',
                                  list_field_type)

        self.form.override_test = PythonScript('override_test')
        self.form.override_test.write("return ['ok', 'no']\n")

        list_field = self.form.list_field
        list_field.values['items'] = [('ok', 'ok'), ('no', 'no')]

        list_field.values['first_item'] = 'on'

        items1 = list_field.render()

        # test TALES
        list_field.tales['items'] = TALESMethod("python:['ok', 'no']")
        items2 = list_field.render()

        # test render
        self.assertEquals(items1, items2)
        # test render_view
        self.assertEquals('ok', list_field.render_view('ok'))
        # test validation ... fake request with a dictionary ...
        list_field.validate({'field_list_field': 'ok'})

        # test override (most probably superfluous)
        del list_field.tales['items']
        list_field.overrides['items'] = Method('override_test')
        items2 = list_field.render()

        self.assertEquals(items1, items2)

        # missing: if returning a list of int,
        # rendering does work here, but validation fails.
        # maybe it should fail, but on the other hand this is a FAQ on the list ...
        del list_field.overrides['items']
        # test when TALES returns a list of e.g. int
        list_field.values['items'] = [('42', '42'), ('88', '88')]

        items1 = list_field.render()

        list_field.tales['items'] = TALESMethod("python:[42, 88]")
        items2 = list_field.render()

        self.assertEquals(items1, items2)

        list_field.validate({'field_list_field': '42'})
예제 #4
0
  def addKeywordSearchStringField(column_id, column_title,
                                  default_search_key='ExactMatch'):
    addStringField(column_id, column_title)
    request_key = column_id
    field_id = 'your_%s_search_key' % column_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, column_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category'))
    field._surcharged_edit(dict(title=translateString('${key} ${usage}', mapping=dict(key=translateString(column_title), usage=translateString('Search Key'))),
                                description='',
                                items=[(translateString('Default (${search_key})',
                                            mapping=dict(search_key=
                                               translateString(default_search_key))), ''),
                                       (translateString('Exact Match'), 'ExactMatch' ),
                                       (translateString('Keyword'), 'Keyword'),
                                       ]),

                           ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/%s_search_key | nothing'
                      % (selection_name, request_key))),
            ['title', 'items', 'default'])
예제 #5
0
 def test_tales_none(self):
     # test that a TALES default of None is rendered
     # as the empty string in the field's value attribute
     # and not as "value"
     self.form.manage_addField('text', 'Text Field', 'StringField')
     text = self.form.text
     text.tales['default'] = TALESMethod('nothing')
     self.assertEquals(1, text.render().count('value=""'))
예제 #6
0
  def afterSetUp(self):
    # base field library
    self.container = Folder('container').__of__(self.portal)
    self.container.manage_addProduct['ERP5Form'].addERP5Form('Base_view', 'Base')
    base_view = self.base_view = self.container.Base_view
    base_view.manage_addField('my_string_field', 'String Field', 'StringField')
    base_view.manage_addField('my_list_field', 'List Field', 'ListField')
    base_view.manage_addField('my_relation_string_field', 'Old Relation String Field', 'RelationStringField')
    base_view.manage_addField('my_gender', 'Gender', 'ListField')
    base_view.manage_addField('my_custom_description', 'Description', 'TextAreaField')
    base_view.manage_addField('my_another_description', 'Description', 'TextAreaField')
    base_view.my_string_field.values['display_width'] = 30
    base_view.my_list_field.values['size'] = 1
    base_view.my_gender.values['items'] = [('Male', 'Male'), ('Female', 'Female')]
    base_view.my_another_description.values['editable'] = 0

    # old instance does not have recently added properties.
    del base_view.my_relation_string_field.values['proxy_listbox_ids']
    del base_view.my_relation_string_field.values['relation_form_id']

    # address view
    self.container.manage_addProduct['ERP5Form'].addERP5Form('Address_view', 'Address')
    address_view = self.address_view = self.container.Address_view
    address_view.manage_addField('my_region', 'Country', 'StringField')
    address_view.my_region.values['size'] = 1
    address_view.my_region.tales['items'] = TALESMethod('here/portal_categories/region/getCategoryChildTitleItemList')

    # person view
    self.container.manage_addProduct['ERP5Form'].addERP5Form('Person_view', 'Person')
    person_view = self.person_view = self.container.Person_view
    person_view.manage_addField('my_name', 'Name', 'StringField')
    person_view.manage_addField('my_default_region', 'Country', 'ListField')
    person_view.manage_addField('my_custom_description', 'Description', 'TextAreaField')
    person_view.manage_addField('my_custom_description2', 'Description', 'TextAreaField')
    person_view.manage_addField('my_another_description', 'Description', 'TextAreaField')
    person_view.my_name.values['display_maxwidth'] = 20
    person_view.my_default_region.values['size'] = 1
    person_view.my_default_region.tales['items'] = TALESMethod('here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList')
    person_view.my_default_region.values['scrap_variable'] = 'obsolete'
    person_view.manage_addField('my_career_subordination_title', 'Organisation', 'RelationStringField')
    person_view.my_career_subordination_title.values['base_category'] = 'subordination'
    person_view.my_career_subordination_title.values['portal_type'] = [('Organisation', 'Organisation')]
    person_view.my_career_subordination_title.values['proxy_listbox_ids'] = [('OrganisationModule_viewOrganisationList/listbox', 'Organisation')]
    person_view.my_custom_description.values['editable'] = 0
    person_view.my_another_description.values['editable'] = 0
예제 #7
0
 def get_recursive_tales(self, id):
     """
 Get tales expression method for id.
 """
     if id not in self.widget.property_names:
         self = self.getRecursiveTemplateField(id)
     tales = self.get_tales(id)
     if tales:
         return TALESMethod(tales._text)
예제 #8
0
 def manage_tales_xmlrpc(self, map):
     """Change TALES expressions through XMLRPC.
     """
     # BEWARE: there is no validation on the values passed through the map
     from Products.Formulator.TALESField import TALESMethod
     result = {}
     for key, value in map.items():
         result[key] = TALESMethod(value)
     self._edit_tales(result)
 def testGetDefault(self):
     pm = getUtility(IMetadataService)
     collection = pm.getCollection()
     set = collection.getMetadataSet(SET_ID)
     element = set.getElement('Title')
     element.field._edit_tales(
         {'default': TALESMethod('content/getPhysicalPath')})
     zoo = self.root.zoo
     defaults = set.getDefaults(content=zoo)
     binding = pm.getMetadata(zoo)
     self.assertEqual(defaults['Title'], zoo.getPhysicalPath())
     self.assertEqual(binding.get(SET_ID, 'Title'), zoo.getPhysicalPath())
예제 #10
0
 def get_tales_expression(self, id):
     field = self
     while True:
         if (id in field.widget.property_names
                 or not field.is_delegated(id)):
             tales = field.get_tales(id)
             if tales:
                 return TALESMethod(tales._text)
             else:
                 return None
         proxied_field = field.getTemplateField()
         if proxied_field.__class__ == ProxyField:
             field = proxied_field
         elif proxied_field is None:
             raise ValueError, "Can't find the template field of %s" % self.id
         else:
             tales = proxied_field.get_tales(id)
             if tales:
                 return TALESMethod(tales._text)
             else:
                 return None
예제 #11
0
  def addFloatField(field_id, field_title):
    request_key = field_id
    field_id = 'your_%s' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_money_quantity'))
    field._surcharged_edit(dict(title=field_title), ['title'])
    field._surcharged_tales(
        dict(default=TALESMethod(
            'here/portal_selections/%s/%s_value_ | nothing'
                % (selection_name, request_key))), ['title', 'default'])
    field_id = 'your_%s_usage_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category'))
    field._surcharged_edit(dict(
      title=translateString('${key} ${usage}',
                            mapping=dict(key=translateString(column_title),
                                         usage=translateString('Usage'))),
      items=[(translateString('Equal to'), ''),
             (translateString('Greater than'), '>'),
             (translateString('Less than'), '<'),
             (translateString('Greater than or Equal to'), '>='),
             (translateString('Less than or Equal to'), '<='),
             ]),

                           ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/%s_usage_ | nothing'
                  % (selection_name, request_key))),
            ['title', 'items', 'default'])
예제 #12
0
    def afterSetUp(self):
        self.root = self.portal
        self.root.form = ERP5Form('form', 'Form')
        self.root.getProperty = lambda key, d=None: \
          dict(on_memory_field='123').get(key, d)

        form = self.root.form

        def addField(field):
            form._setObject(field.id, field, set_owner=0, suppress_events=1)

        addField(StringField('field'))
        form.field._p_oid = makeDummyOid()
        # method field
        form.field.values['external_validator'] = Method('this_is_a_method')
        # on-memory field (not in zodb)
        addField(StringField('my_on_memory_field'))
        form.my_on_memory_field._p_oid = None
        addField(StringField('my_on_memory_tales_field'))
        form.my_on_memory_tales_field.manage_tales_xmlrpc(
            {'default': 'python: repr(here)'})
        form.my_on_memory_field._p_oid = None
        # proxy field
        addField(ProxyField.ProxyField('proxy_field'))
        form.proxy_field._p_oid = makeDummyOid()
        form.proxy_field.values['form_id'] = 'form'
        form.proxy_field.values['field_id'] = 'field'
        # proxy field with tales
        addField(ProxyField.ProxyField('proxy_field_tales'))
        form.proxy_field_tales._p_oid = makeDummyOid()
        form.proxy_field_tales.tales['form_id'] = TALESMethod('string:form')
        form.proxy_field_tales.tales['field_id'] = TALESMethod('string:field')
        # datetime field (input style is list)
        addField(DateTimeField('datetime_field'))
        form.datetime_field._p_oid = makeDummyOid()
        form.datetime_field._edit(dict(input_style='list'))
        for i in form.datetime_field._get_sub_form().fields.values():
            i._p_oid = makeDummyOid()
예제 #13
0
파일: testForm.py 프로젝트: poses/erp5
    def _test_list_values(self):
        """ test if a list of values returned by TALES (override) expressions
        is interpreted properly.
        If a TALES tab returns a sequence of items and some item is
        actually a string of length 2 (e.g. "ok"), this previously
        has lead to a item text of 'o' and a display value of 'k'
        (as the this is actually a sequence of length 2 ...)
         See http://sourceforge.net/mailarchive/forum.php?thread_id=1359918&forum_id=1702
         
        Actually the original problem still does not work,
        as passing a list of int's is not yet supported.
        If it should, please uncomment the second part of the test.
        """

        # XXX deactivated: this maybe should not be fixed at all

        self.form.manage_addField('list_field', 'Test List Field', 'ListField')

        # adding a python script to be called by the override tab
        # FIXME: the following does not work, as the fake-request
        # does not have a "form" atribute (?)
        #self.root.manage_addProduct['PythonScripts'] \
        #         .manage_addPythonScript('override_test', 'Test for override')
        #
        #self.root._getOb('override_test').write("return ['ok', 'no']\n")

        self.form.override_test = PythonScript('override_test')
        self.form.override_test.write("return ['ok', 'no']\n")
        # ps._makeFunction()

        
        list_field = getattr(self.form, 'list_field')
        list_field.values['items'] = [ ('ok', 'ok'), ('no', 'no') ]

        items1 = list_field.render()

        # test TALES
        list_field.tales['items'] = TALESMethod("python:['ok', 'no']")
        items2 = list_field.render()

        self.assertEquals(items1, items2)

        # test override
        del list_field.tales['items']
        list_field.overrides['items'] = Method('override_test')
        items2 = list_field.render()
        
        self.assertEquals(items1, items2)
예제 #14
0
 def addStringField(field_id, field_title):
     request_key = field_id
     field_id = 'your_%s' % field_id
     if field_id not in temp_form.objectIds():
         temp_form.manage_addField(field_id, field_title, 'ProxyField')
     field = temp_form._getOb(field_id)
     field.manage_edit_xmlrpc(
         dict(form_id='Base_viewDialogFieldLibrary', field_id='your_title'))
     field._surcharged_edit(dict(title=field_title, description=''),
                            ['title', 'description'])
     field._surcharged_tales(
         dict(default=TALESMethod('here/portal_selections/%s/%s/query |'
                                  'here/portal_selections/%s/%s | string:' %
                                  (selection_name, request_key,
                                   selection_name, request_key))),
         ['title', 'description', 'default'])
예제 #15
0
    def testCellKeywordInProxifiedListboxColumn(self):
        """
    Test that cell keyword is correctly interpreted when used in TALES
    to render a cell of a ListBox.
    First use cell in the ProxyField context, then use it in the listbox_xxx
    context
    """
        portal = self.getPortal()
        portal.ListBoxZuite_reset()

        form = portal.Foo_viewListBoxProxyField
        portal.foo_module.FooModule_createObjects()
        here = portal.foo_module['0']
        here.Foo_createObjects()

        request = get_request()
        request['here'] = here

        self.commit()

        listbox_title_column = form.listbox_title

        self.assertTrue(listbox_title_column.is_delegated('default'))
        self.assertEqual(
            listbox_title_column.get_recursive_tales('default')._text,
            'python: cell.getTitle()')
        listboxline_list = form.listbox.get_value('default',
                                                  render_format='list',
                                                  REQUEST=request)
        first_item = dict(listboxline_list[1].getColumnItemList())
        self.assertEqual(first_item['title'], 'Title 0')

        # Use "cell" locally
        listbox_title_column.manage_tales_surcharged_xmlrpc(
            dict(default=TALESMethod('python: cell.getTitle() + " local"')))

        listboxline_list = form.listbox.get_value('default',
                                                  render_format='list',
                                                  REQUEST=request)
        first_item = dict(listboxline_list[1].getColumnItemList())
        self.assertEqual(first_item['title'], 'Title 0 local')
예제 #16
0
def setupExtendedMetadataSet(context):
    # add some additional metadata fields
    pm = getUtility(IMetadataService)
    collection = pm.getCollection()
    set = collection.getMetadataSet(SET_ID)
    set.addMetadataElement('ModificationDate',
                           StandardFields.DateTimeField.meta_type, 'DateIndex',
                           1)
    element = set.getElement('ModificationDate')
    element.field._edit_tales(
        {'default': TALESMethod('content/bobobase_modification_time')})
    element.field._edit({'required': 0})
    set.addMetadataElement(
        'Languages',
        StandardFields.LinesField.meta_type,
        'KeywordIndex',
    )
    element = set.getElement('Languages')
    element.field._edit({'required': 0})
    ######
    set.initialize()
 def testGetDefaultWithTalesDelegate(self):
     mtool = getUtility(IMetadataService)
     mtoolId = mtool.getId()
     collection = mtool.getCollection()
     set = collection.getMetadataSet(SET_ID)
     zoo = self.root.zoo
     test_value = 'Rabbits4Ever'
     binding = mtool.getMetadata(zoo)
     binding.setValues(SET_ID, {'Title': test_value})
     element = set.getElement('Description')
     # yikes, narly tales expression
     method = "python: content.%s.getMetadata(content).get(" \
              "'%s', 'Title', no_defaults=1)" % (mtoolId, SET_ID)
     element.field._edit_tales({'default': TALESMethod(method)})
     value = binding.get(SET_ID, 'Description')
     self.assertEqual(value, test_value,
                      "Tales delegate for default didn't work")
     # make sure the right cached value was stored.
     value = binding.get(SET_ID, 'Description')
     self.assertEqual(value, test_value, "Wrong Data Object Cached")
     # test shortcut, too
     self.assertEqual(value,
                      mtool.getMetadataValue(zoo, SET_ID, 'Description'))
예제 #18
0
    def test_items_is_sequence(self):
        """ test that a multi list widget renders correctly,
        even if the items consist out of a tuple.
        this has bugged in some earlier version
        """
        # use a MultiCheckBoxField instead of a MultiListField just for variance
        self.form.manage_addField('list_field', 'Test List Field',
                                  'MultiCheckBoxField')

        list_field = self.form.list_field
        list_field.values['items'] = [('foo', 'foo'), ('bar', 'bar')]

        items1 = list_field.render(('foo', ))

        list_field.tales['items'] = TALESMethod("python:('foo', 'bar')")

        self.assertEquals(('foo', 'bar'), list_field.get_value('items'))

        items2 = list_field.render(('foo', ))

        # test render
        self.assertEquals(items1, items2)
        # test render_view
        self.assertEquals("foo", list_field.render_view(('foo', )))
예제 #19
0
def XMLToForm(s, form, override_encoding=None):
    """Takes an xml string and changes formulator form accordingly.
    Heavily inspired by code from Nikolay Kim.

    If override_encoding is set, form data is read assuming given
    encoding instead of the one in the XML data itself. The form will
    have to be modified afterwards to this stored_encoding itself.
    """
    top = XMLObjects.XMLToObjectsFromString(s)
    # wipe out groups
    form.groups = {'Default': []}
    form.group_list = ['Default']

    if override_encoding is None:
        try:
            unicode_mode = top.first.form.first.unicode_mode.text
        except AttributeError:
            unicode_mode = 'false'
        # retrieve encoding information from XML
        if unicode_mode == 'true':
            # just use unicode strings being read in
            encoding = None
        else:
            # store strings as specified encoding
            try:
                encoding = top.first.form.first.stored_encoding.text
            except AttributeError:
                encoding = 'ISO-8859-1'
    else:
        if override_encoding == 'unicode':
            encoding = None
        else:
            encoding = override_encoding

    #  get the settings
    settings = [field.id for field in form.settings_form.get_fields()]
    for setting in settings:
        value = getattr(top.first.form.first, setting, None)
        if value is None:
            continue
        if setting == 'unicode_mode':
            v = value.text == 'true'
        elif setting == 'row_length':
            v = int(value.text)
        else:
            v = encode(value.text, encoding)
        setattr(form, setting, v)

    # create groups
    has_default = 0
    for group in top.first.form.first.groups.elements.group:
        # get group title and create group
        group_title = encode(group.first.title.text, encoding)
        if group_title == 'Default':
            has_default = 1
        form.add_group(group_title)
        # create fields in group
        if not hasattr(group.first.fields.elements, 'field'):
            # empty <fields> element
            continue
        for entry in group.first.fields.elements.field:
            id = str(encode(entry.first.id.text, encoding))
            meta_type = encode(entry.first.type.text, encoding)
            try:
                form._delObject(id)
            except (KeyError, AttributeError):
                pass
            form.manage_addField(id, '', meta_type)
            field = form._getOb(id)
            if group_title != 'Default':
                form.move_field_group([id], 'Default', group_title)
            # set values
            values = entry.first.values
            for name in values.getElementNames():
                value = getattr(values.first, name)
                if value.attributes.get('type') == 'float':
                    field.values[name] = float(value.text)
                elif value.attributes.get('type') == 'int':
                    field.values[name] = int(value.text)
                elif value.attributes.get('type') == 'method':
                    field.values[name] = Method(str(value.text))
                elif value.attributes.get('type') == 'list':
                    # XXX bare eval here (this may be a security leak ?)
                    field.values[name] = eval(encode(value.text, encoding))
                elif value.attributes.get('type') == 'interface':
                    field.values[name] = getUtility(IInterface,
                                                    name=value.text)
                elif value.attributes.get('type') == 'datetime':
                    field.values[name] = DateTime(value.text)
                else:
                    field.values[name] = encode(value.text, encoding)

            # special hack for the DateTimeField
            if field.meta_type == 'DateTimeField':
                field.on_value_input_style_changed(
                    field.get_value('input_style'))

            # set tales
            tales = entry.first.tales
            for name in tales.getElementNames():
                field.tales[name] = TALESMethod(
                    encode(getattr(tales.first, name).text, encoding))

            # set messages
            if hasattr(entry.first, 'messages'):
                messages = entry.first.messages
                entries = getattr(messages.elements, 'message', [])
                for entry in entries:
                    name = entry.attributes.get('name')
                    text = entry.text
                    # ignore messages that are identical to default
                    if (name in field.validator.message_names
                            and getattr(field.validator, name) == text):
                        continue
                    text = encode(text, encoding)
                    field.message_values[name] = text

            # for persistence machinery
            field.values = field.values
            field.tales = field.tales
            field.message_values = field.message_values

    # delete default group
    if not has_default:
        form.move_group_down('Default')
        form.remove_group('Default')

    # delete fields which did exist before setting the values in XML
    # but are not present in the XML
    old_ids = [ id for id in form.objectIds() if id not in \
                form.get_field_ids(include_disabled=1) ]
    if old_ids:
        form.manage_delObjects(old_ids)
예제 #20
0
def make_set(collection, set_node):
    from Products.Formulator.TALESField import TALESMethod

    # compatiblity.. ick
    if 'title' not in set_node:
        set_node['title'] = ''
    if 'description' not in set_node:
        set_node['description'] = ''
    if 'i18n_domain' not in set_node:
        set_node['i18n_domain'] = ''

    collection.addMetadataSet(
        set_node.id, set_node.ns_prefix, set_node.ns_uri, set_node.title,
        set_node.description, set_node.i18n_domain)

    set = collection._getOb(set_node.id)
    set.setCategory(set_node.get('category', ''))
    set.setMinimalRole(set_node.get('minimalrole', ''))

    for e_node in set_node.elements:

        # compatiblity.. ick
        if 'acquire_p' not in e_node:
            e_node['acquire_p'] = 0
        if 'read_only_p' not in e_node:
            e_node['read_only_p'] = 0
        if 'automatic_p' not in e_node:
            e_node['automatic_p'] = 0
        if 'index_p' not in e_node:
            e_node['index_p'] = 0
        if 'metadata_in_catalog_p' not in e_node:
            e_node['metadata_in_catalog_p'] = 0

        # type possible is string, convert to 'boolean'
        for p in ['index_p', 'acquire_p', 'read_only_p', 'automatic_p',
                  'metadata_in_catalog_p']:
            try:
                e_node[p] = not not int(e_node[p])
            except ValueError:
                e_node[p] = 0

        set.addMetadataElement(
            e_node.id, e_node.field_type, e_node.index_type, e_node.index_p,
            e_node.acquire_p, e_node.read_only_p, e_node.metadata_in_catalog_p,
            e_node.automatic_p)

        element = set.getElement(e_node.id)

        field = element.field
        for fv in e_node.field_values:
            k = fv.key
            v = fv.value
            t = fv.type
            if t == 'int':
                v = int(v)
            elif t == 'float':
                v = float(v)
            elif t == 'list':
                # XXX this is incomplete support for lists
                # the originial version of formulator xml support
                # did an eval here, which is not an option
                # XXX we'll make use of this option anyway
                # metadata sets are edited on the filesystem after all
                v = eval(v, {})

            field.values[k]=v

        # some sort of formulator hack
        if e_node.field_type == 'DateTimeField':
            field.on_value_input_style_changed(field.get_value('input_style'))

        for ft in e_node.field_tales:
            if ft.expr:
                field.tales[ft.key] = TALESMethod(ft.expr)

        for fm in e_node.field_messages:
            field.message_values[fm.name]=fm.text

        constructor_args = {}
        for iav in e_node.index_args:
            constructor_args[iav['key']]=iav['value']
        element.index_constructor_args = constructor_args
예제 #21
0
def getSearchDialog(self, REQUEST=None):
  """Generate a dynamic search dialog from a listbox.
  """
  request = get_request()
  portal = self.getPortalObject()
  category_tool = getToolByName(portal, 'portal_categories')
  types_tool = getToolByName(portal, 'portal_types')
  workflow_tool = getToolByName(portal, 'portal_workflow')

  default_view = self.getTypeInfo().getDefaultViewFor(self)
  listbox = default_view.listbox

  temp_form = self.newContent(temp_object=True,
                              portal_type='ERP5 Form',
                              id='Folder_viewSearchDialog',
                              title='Search')
  temp_form.pt = 'form_dialog'
  temp_form.action = 'Folder_search'

  selection_name = listbox.get_value('selection_name')
  request.set('selection_name', selection_name)
  request.set('form_id', default_view.getId())


  def addListField(field_id, field_title):
    # this one is for categories
    request_key = field_id
    field_id = 'your_%s_relative_url' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category_list'))
    field._surcharged_edit(dict(title=field_title), ['title'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_%s_relative_url | '
              'here/portal_selections/%s/dialog_strict_%s_relative_url | nothing'
                                    % (selection_name, request_key,
                                       selection_name, request_key)),
            items=TALESMethod('python: getattr(here.portal_categories["%s"],'
                             'here.portal_preferences.getPreference("'
                             'preferred_category_child_item_list_method_id",'
                             '"getCategoryChildCompactLogicalPathItemList"))('
                             'checked_permission="View", base=1,'
                             'display_none_category=False,'
                             'local_sort_id="int_index")' % request_key)),
            ['title', 'items', 'default'])

    field_id = 'your_%s_relative_url_is_strict_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewFieldLibrary',
        field_id='your_checkbox'))
    field._surcharged_edit(dict(title='%s Strict' % field_title), ['title'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_strict_%s_relative_url | nothing'
                                    % (selection_name, request_key,))),
        ['title', 'default'])

    field_id = 'your_%s_relative_url_is_excluded_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewFieldLibrary',
        field_id='your_checkbox'))
    field._surcharged_edit(dict(title='%s Excluded' % field_title), ['title'])
    from zLOG import LOG
    LOG("selection_name %r, request_key %r" %(selection_name, request_key), 300, field_id)
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/dialog_excluded_%s_relative_url | nothing'
                                    % (selection_name, request_key,))),
        ['title', 'default'])



  def addFloatField(field_id, field_title):
    request_key = field_id
    field_id = 'your_%s' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_money_quantity'))
    field._surcharged_edit(dict(title=field_title), ['title'])
    field._surcharged_tales(
        dict(default=TALESMethod(
            'here/portal_selections/%s/%s_value_ | nothing'
                % (selection_name, request_key))), ['title', 'default'])
    field_id = 'your_%s_usage_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category'))
    field._surcharged_edit(dict(
      title=translateString('${key} ${usage}',
                            mapping=dict(key=translateString(column_title),
                                         usage=translateString('Usage'))),
      items=[(translateString('Equal to'), ''),
             (translateString('Greater than'), '>'),
             (translateString('Less than'), '<'),
             (translateString('Greater than or Equal to'), '>='),
             (translateString('Less than or Equal to'), '<='),
             ]),

                           ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/%s_usage_ | nothing'
                  % (selection_name, request_key))),
            ['title', 'items', 'default'])

  def addDateTimeField(field_id, field_title):
    request_key = field_id
    field_id = 'your_%s' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_date'))
    field._surcharged_edit(dict(title=field_title), ['title'])
    field._surcharged_tales(
        dict(default=TALESMethod(
            'here/portal_selections/%s/%s_value_ | nothing'
                % (selection_name, request_key))), ['title', 'default'])
    field_id = 'your_%s_usage_' % request_key
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category'))
    field._surcharged_edit(dict(title=translateString('${key} ${usage}', mapping=dict(key=translateString(column_title), usage=translateString('Usage'))),
                                items=[(translateString('Equal to'), ''),
                                       (translateString('Greater than'), '>'),
                                       (translateString('Less than'), '<'),
                                       (translateString('Greater than or Equal to'), '>='),
                                       (translateString('Less than or Equal to'), '<='),
                                       ]),

                           ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/%s_usage_ | nothing'
                  % (selection_name, request_key))),
            ['title', 'items', 'default'])


  def addStringField(field_id, field_title):
    request_key = field_id
    field_id = 'your_%s' % field_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_title'))
    field._surcharged_edit(dict(title=field_title,
                                description=''), ['title', 'description'])
    field._surcharged_tales(
        dict(default=TALESMethod(
          'here/portal_selections/%s/%s/query |'
          'here/portal_selections/%s/%s | string:'
       % (selection_name, request_key, selection_name, request_key))),
        ['title', 'description', 'default'])


  def addFullTextStringField(field_id, field_title):
    addStringField(field_id, field_title)

  def addKeywordSearchStringField(column_id, column_title,
                                  default_search_key='ExactMatch'):
    addStringField(column_id, column_title)
    request_key = column_id
    field_id = 'your_%s_search_key' % column_id
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, column_title, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category'))
    field._surcharged_edit(dict(title=translateString('${key} ${usage}', mapping=dict(key=translateString(column_title), usage=translateString('Search Key'))),
                                description='',
                                items=[(translateString('Default (${search_key})',
                                            mapping=dict(search_key=
                                               translateString(default_search_key))), ''),
                                       (translateString('Exact Match'), 'ExactMatch' ),
                                       (translateString('Keyword'), 'Keyword'),
                                       ]),

                           ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/%s_search_key | nothing'
                      % (selection_name, request_key))),
            ['title', 'items', 'default'])


  base_category_list = set(category_tool.getBaseCategoryList())
  catalog_schema = portal.portal_catalog.schema()
  sql_catalog = portal.portal_catalog.getSQLCatalog()
  sql_catalog_keyword_search_keys = sql_catalog.sql_catalog_keyword_search_keys
  sql_catalog_full_text_search_keys =\
              sql_catalog.sql_catalog_full_text_search_keys

  column_list = ListBoxListRenderer(
                      listbox.widget, listbox, request).getAllColumnList()

  added_column_set = set()

  for column_id, column_title in column_list:
    if column_id in added_column_set:
      continue
    added_column_set.add(column_id)
    short_column_id = column_id
    # strip the usual default_ and _title that are on standard fields.
    if short_column_id.endswith('_translated_title'):
      short_column_id = short_column_id[:-len('_translated_title')]
    if short_column_id.endswith('_title'):
      short_column_id = short_column_id[:-len('_title')]
    if short_column_id.endswith('_reference') and short_column_id not in (
        'source_reference', 'destination_reference'):
      short_column_id = short_column_id[:-len('_reference')]
    if short_column_id.startswith('default_'):
      short_column_id = short_column_id[len('default_'):]
    # is it a base category ?
    if short_column_id in base_category_list:
      # is this base category empty ? then it might be used to relate documents,
      # in that case, simply provide a text input
      if not len(category_tool[short_column_id]):
        default_search_key = 'ExactMatch'
        if column_id in sql_catalog_keyword_search_keys:
          default_search_key = 'Keyword'
        addKeywordSearchStringField(column_id, column_title,
                                    default_search_key=default_search_key)
        continue
      else:
        addListField(short_column_id, column_title)
        continue


    if column_id in catalog_schema:
      if column_id.endswith('state') or column_id.endswith('state_title'):
        # this is a workflow state, it will be handled later
        continue
      elif 'date' in column_id:
        # is it date ? -> provide exact + range
        # TODO: do we need an API in catalog for this ?
        addDateTimeField(column_id, column_title)

      elif 'quantity' in column_id or 'price' in column_id:
        # is it float ? -> provide exact + range
        # TODO: do we need an API in catalog for this ?
        addFloatField(column_id, column_title)
      else:
        if column_id in sql_catalog_full_text_search_keys:
          addFullTextStringField(column_id, column_title)
        else:
          default_search_key = 'ExactMatch'
          if column_id in sql_catalog_keyword_search_keys:
            default_search_key = 'Keyword'
          addKeywordSearchStringField(column_id, column_title,
                          default_search_key=default_search_key)

  allowed_content_types = self.getTypeInfo().getTypeAllowedContentTypeList()
  # remember which workflow we already displayed
  workflow_set = set()
  # possible workflow states
  for type_name in allowed_content_types:
    for workflow in workflow_tool.getWorkflowValueListFor(type_name):
      workflow_id = workflow.getReference()
      state_var = workflow.getStateVariable()

      if state_var in workflow_set:
        continue

      workflow_set.add(state_var)
      state_list = workflow.getStateValueList()
      if state_list is None or \
                len(state_list) <= 1:
        continue

      field_id = 'your_%s' % state_var
      if field_id not in temp_form.objectIds():
        temp_form.manage_addField(field_id, field_id, 'ProxyField')
      field = temp_form._getOb(field_id)
      field.manage_edit_xmlrpc(dict(
          form_id='Base_viewDialogFieldLibrary',
          field_id='your_category_list'))
      items = sorted([(translateString(state.getTitle()), state.getReference()) for state in state_list],
                     key=lambda state:str(state[0]))
      field._surcharged_edit(
              dict(title=translateString(workflow.title),
                   items=items,
                   size=len(items)),
              ['title', 'items', 'size'])
      field._surcharged_tales(
          dict(
              default=TALESMethod(
                'here/portal_selections/%s/%s | python:[]'
                        % (selection_name, state_var))),
              ['title', 'items', 'size', 'default'])


  # if more than 1 allowed content types -> list possible content types
  if len(allowed_content_types) > 1:
    field_id = 'your_portal_type'
    if field_id not in temp_form.objectIds():
      temp_form.manage_addField(field_id, field_id, 'ProxyField')
    field = temp_form._getOb(field_id)
    field.manage_edit_xmlrpc(dict(
        form_id='Base_viewDialogFieldLibrary',
        field_id='your_category_list'))
    field._surcharged_edit(
            dict(title=translateString('Type'),
                 items=[(translateString(x), x) for x in allowed_content_types]),

            ['title', 'items'])
    field._surcharged_tales(
        dict(
            default=TALESMethod(
              'here/portal_selections/%s/portal_type | nothing'
                                    % selection_name)),
            ['title', 'items', 'default'])


  addFullTextStringField('SearchableText', 'Full Text Search')

  # Order fields
  default_group = temp_form.group_list[0]
  field_list = temp_form.get_fields()
  for field in field_list:
    field_id = field.getId()
    if field_id.endswith('search_key') or field_id.endswith('_usage_'):
      temp_form.move_field_group([field_id], default_group, 'right')
    elif field.get_value('field_id') in ('your_category_list',
                                         'your_checkbox') \
        or field_id == 'your_SearchableText':
      temp_form.move_field_group([field_id], default_group, 'center')

  if REQUEST is not None:
    # if called from the web, render the form, other wise return it (for
    # Base_callDialogMethod)
    return temp_form(REQUEST)
  return temp_form
예제 #22
0
파일: XMLToForm.py 프로젝트: yuanpli/erp5
def XMLToForm(s, form, override_encoding=None):
    """Takes an xml string and changes formulator form accordingly.
    Heavily inspired by code from Nikolay Kim.

    If override_encoding is set, form data is read assuming given
    encoding instead of the one in the XML data itself. The form will
    have to be modified afterwards to this stored_encoding itself.
    """
    top = XMLObjects.XMLToObjectsFromString(s)
    # wipe out groups
    form.groups = {'Default': []}
    form.group_list = ['Default']

    if override_encoding is None:
        try:
            unicode_mode = top.first.form.first.unicode_mode.text
        except AttributeError:
            unicode_mode = 'false'
        # retrieve encoding information from XML
        if unicode_mode == 'true':
            # just use unicode strings being read in
            encoding = None
        else:
            # store strings as specified encoding
            try:
                encoding = top.first.form.first.stored_encoding.text
            except AttributeError:
                encoding = 'ISO-8859-1'
    else:
        if override_encoding == 'unicode':
            encoding = None
        else:
            encoding = override_encoding

    #  get the settings
    settings = [field.id for field in form.settings_form.get_fields()]
    for setting in settings:
        value = getattr(top.first.form.first, setting, None)
        if value is None:
            continue
        if setting == 'unicode_mode':
            v = value.text == 'true'
        elif setting == 'row_length':
            v = int(value.text)
        else:
            v = encode(value.text, encoding)
        setattr(form, setting, v)

    # create groups
    has_default = 0
    for group in top.first.form.first.groups.elements.group:
        # get group title and create group
        group_title = encode(group.first.title.text, encoding)
        if group_title == 'Default':
            has_default = 1
        form.add_group(group_title)
        # create fields in group
        if not hasattr(group.first.fields.elements, 'field'):
            # empty <fields> element
            continue
        for entry in group.first.fields.elements.field:
            id = str(encode(entry.first.id.text, encoding))
            meta_type = encode(entry.first.type.text, encoding)
            try:
                form._delObject(id)
            except (KeyError, AttributeError):
                pass
            form.manage_addField(id, '', meta_type)
            field = form._getOb(id)
            if group_title != 'Default':
                form.move_field_group([id], 'Default', group_title)
            # set values
            values = entry.first.values
            for name in values.getElementNames():
                value = getattr(values.first, name)
                if value.attributes.get('type') == 'float':
                    field.values[name] = float(value.text)
                elif value.attributes.get('type') == 'int':
                    field.values[name] = int(value.text)
                elif value.attributes.get('type') == 'method':  # XXX Patch
                    field.values[name] = Method(value.text)  # XXX Patch
                elif value.attributes.get('type') == 'list':
                    # XXX bare eval here (this may be a security leak ?)
                    field.values[name] = eval(encode(value.text, encoding))
                else:
                    field.values[name] = encode(value.text, encoding)

            # set tales
            tales = entry.first.tales
            for name in tales.getElementNames():
                field.tales[name] = TALESMethod(
                    encode(getattr(tales.first, name).text, encoding))

            # set messages
            if hasattr(entry.first, 'messages'):
                messages = entry.first.messages
                entries = getattr(messages.elements, 'message', [])
                for entry in entries:
                    name = entry.attributes.get('name')
                    text = encode(entry.text, encoding)
                    field.message_values[name] = text

            # set delegated_list, mean ProxyField
            is_proxy_field = False
            if hasattr(entry.first, 'delegated_list'):
                delegated_list_element = entry.first.delegated_list
                delegated_list = delegated_list_element.getElementNames()
                field.delegated_list = delegated_list
                is_proxy_field = True
            # for persistence machinery
            field.values = field.values
            field.tales = field.tales
            field.message_values = field.message_values
            if is_proxy_field:
                field.delegated_list = field.delegated_list

    # delete default group
    if not has_default:
        form.move_group_down('Default')
        form.remove_group('Default')
예제 #23
0
파일: Form.py 프로젝트: poses/erp5
def copyMethod(value):
    if type(aq_base(value)) is Method:
      value = Method(value.method_name)
    elif type(aq_base(value)) is TALESMethod:
      value = TALESMethod(value._text)
    return value