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 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)
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'})
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'])
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=""'))
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
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)
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())
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
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 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()
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)
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 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')
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'))
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', )))
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)
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
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
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')
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