def afterSetUp(self): self.container = Folder('container').__of__(self.portal) self.container._setObject( 'Base_viewProxyFieldLibrary', ERP5Form('Base_viewProxyFieldLibrary', 'Proxys')) self.container._setObject('Base_view', ERP5Form('Base_view', 'View')) from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable()
def _setOb(self, object_id, obj): """ Update portal_skins cache with the new files. """ Folder._setOb(self, object_id, obj) portal_skins = getattr(self, 'portal_skins', None) if portal_skins is None: return portal_skins = self.getPortalObject().portal_skins _updateCacheEntry = getattr(portal_skins.aq_base, '_updateCacheEntry', None) if _updateCacheEntry is None: return _updateCacheEntry(self.id, object_id)
def afterSetUp(self): self.container = Folder("container").__of__(self.portal) self.container._setObject("Base_viewProxyFieldLibrary", ERP5Form("Base_viewProxyFieldLibrary", "Proxys")) self.container._setObject("Base_view", ERP5Form("Base_view", "View")) from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable()
def afterSetUp(self): self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_viewProxyFieldLibrary', ERP5Form('Base_viewProxyFieldLibrary', 'Proxys')) self.container._setObject('Base_view', ERP5Form('Base_view', 'View')) from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable()
def _getOb(self, id, default=_marker, **kw): """ XXX """ tv = getTransactionalVariable() document_url = tv.get((id,), None) if document_url is not None: return self.getPortalObject().unrestrictedTraverse(document_url) return Folder._getOb(self, id, **kw)
def _getOb(self, id, default=_marker, **kw): """ XXX """ tv = getTransactionalVariable() document_url = tv.get((id, ), None) if document_url is not None: return self.getPortalObject().unrestrictedTraverse(document_url) return Folder._getOb(self, id, **kw)
def afterSetUp(self): self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_viewProxyFieldLibrary', ERP5Form('Base_viewProxyFieldLibrary', 'Proxys')) self.container._setObject('Base_view', ERP5Form('Base_view', 'View')) try: from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable() except ImportError: pass # On Zope 2.8, remove when we no longer support it
def _setObject(self, id, ob, **kw): """ XXX """ tv = getTransactionalVariable() key = 'VirtualFolderMixin', self.getPhysicalPath(), id tv[key] = ob.__of__(self).getRelativeUrl() method = getattr(self, 'Base_setObject', None) if method is not None: return method(id, ob, **kw) return Folder._setObject(self, id, ob, **kw)
def _setObject(self, id, ob, **kw): """ XXX """ tv = getTransactionalVariable() key = (id, ) tv[key] = ob.__of__(self).getRelativeUrl() method = getattr(self, 'Base_setObject', None) if method is not None: return method(id, ob, **kw) return Folder._setObject(self, id, ob, **kw)
def PUT_factory(self, name, typ, body): """ Factory for PUT requests to objects which do not yet exist. Used by NullResource.PUT. Returns -- Bare and empty object of the appropriate type (or None, if we don't know what to do) """ method = getattr(self, 'Base_putFactory', None) if method is not None: return method(name, typ, body) return Folder.PUT_factory(self, name, typ, body)
def _getOb(self, id, default=_marker, **kw): """ XXX """ tv = getTransactionalVariable() document_url = tv.get((id, ), None) if document_url is not None: return self.getPortalObject().unrestrictedTraverse(document_url) try: return Folder._getOb(self, id, default=default, **kw) except KeyError: if default is _marker: raise return default
def _getOb(self, id, default=_marker, **kw): """ XXX """ tv = getTransactionalVariable() document_url = tv.get((id,), None) if document_url is not None: return self.getPortalObject().unrestrictedTraverse(document_url) try: return Folder._getOb(self, id, default=default, **kw) except KeyError: if default is _marker: raise return default
def afterSetUp(self): # base field library self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_view', ERP5Form('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._setObject('Address_view', ERP5Form('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._setObject('Person_view', ERP5Form('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 _getOb(self, id, default=_marker, **kw): """ XXX """ tv = getTransactionalVariable() key = 'VirtualFolderMixin', self.getPhysicalPath(), id document_url = tv.get(key, None) if document_url is not None: return self.getPortalObject().unrestrictedTraverse(document_url) try: return Folder._getOb(self, id, default=default, **kw) except KeyError: if default is _marker: raise return default
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 __init__(self, id=None): if id is None: id = self.__class__.id Folder.__init__(self, id)
class TestProxify(ERP5TypeTestCase): def getTitle(self): return "Proxify" def afterSetUp(self): # base field library self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_view', ERP5Form('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._setObject('Address_view', ERP5Form('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._setObject('Person_view', ERP5Form('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 test_single_level_proxify(self): # StringField self.person_view.proxifyField({'my_name':'Base_view.my_string_field'}) field = self.person_view.my_name self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Base_view') self.assertEqual(field.get_value('field_id'), 'my_string_field') self.assertEqual(field.is_delegated('title'), False) self.assertEqual(field.get_value('title'), 'Name') self.assertEqual(field.is_delegated('display_maxwidth'), False) self.assertEqual(field.get_value('display_maxwidth'), 20) self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.get_value('enabled'), 1) self.assertEqual(field.is_delegated('description'), True) self.assertEqual(field.get_value('description'), '') field_value_cache.clear() # must purge cache before changing internal field value. template_field = self.base_view.my_string_field template_field.values['description'] = 'Description' self.assertEqual(field.get_value('description'), 'Description') field_value_cache.clear() # ListField self.person_view.manage_addField('my_gender', 'Gender', 'ListField') self.person_view.proxifyField({'my_gender':'Base_view.my_gender'}) field = self.person_view.my_gender self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Gender') self.assertEqual(field.is_delegated('items'), True) self.assertEqual(field.get_value('items'), [('Male', 'Male'), ('Female', 'Female')]) field_value_cache.clear() def test_multi_level_proxify(self): self.address_view.proxifyField({'my_region':'Base_view.my_list_field'}) self.person_view.proxifyField({'my_default_region':'Address_view.my_region'}) field = self.person_view.my_default_region self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Address_view') self.assertEqual(field.get_value('field_id'), 'my_region') self.assertEqual(field.getTemplateField().getId(), 'my_region') self.assertEqual(field.getRecursiveTemplateField().getId(), 'my_list_field') self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Country') self.assertEqual(field.is_delegated('size'), True) self.assertEqual(field.get_value('size'), 1) self.assertEqual(field.is_delegated('items'), False) self.assertEqual(field.get_tales('items')._text, 'here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList') self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.get_value('enabled'), 1) self.assertEqual(field.is_delegated('description'), True) self.assertEqual(field.get_value('description'), '') self.assertEqual(field.has_value('scrap_variable'), 0) field_value_cache.clear() # must purge cache before changing internal field value. template_field = self.address_view.my_region template_field.values['title'] = 'Region' self.assertEqual(field.get_value('title'), 'Region') def test_force_delegate(self): self.person_view.proxifyField({'my_name':'Base_view.my_string_field'}, force_delegate=1) field = self.person_view.my_name self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Base_view') self.assertEqual(field.get_value('field_id'), 'my_string_field') self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.is_delegated('size'), True) self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.is_delegated('description'), True) def test_keep_empty_value(self): #Non editable fields self.person_view.proxifyField({'my_custom_description': 'Base_view.my_custom_description', 'my_custom_description2': 'Base_view.my_custom_description', 'my_another_description': 'Base_view.my_another_description'}, keep_empty_value=True) field = self.person_view.my_custom_description self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), False) self.assertEqual(field.get_value('editable'), 0) field = self.person_view.my_custom_description2 self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), True) self.assertEqual(field.get_value('editable'), 1) field = self.person_view.my_another_description self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), True) self.assertEqual(field.get_value('editable'), 0) def test_unproxify(self): #Proxify First self.address_view.proxifyField({'my_region':'Base_view.my_list_field'}) self.person_view.proxifyField({'my_default_region':'Address_view.my_region'}) field_value_cache.clear() #UnProxify self.person_view.unProxifyField({'my_default_region':'on'}) field = self.person_view.my_default_region self.assertEqual(field.meta_type, 'ListField') self.assertEqual(field.get_value('title'), 'Country') self.assertEqual(field.get_tales('items')._text, 'here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList') #Test unproxify with old instance. #Proxify First self.person_view.proxifyField({'my_career_subordination_title':'Base_view.my_relation_string_field'}) field_value_cache.clear() #UnProxify self.person_view.unProxifyField({'my_career_subordination_title':'on'}) field = self.person_view.my_career_subordination_title self.assertEqual(field.meta_type, 'RelationStringField') self.assertEqual(field.get_value('title'), 'Organisation') self.assertEqual(field.get_value('proxy_listbox_ids'), [('OrganisationModule_viewOrganisationList/listbox', 'Organisation')])
def _edit(self, **kw): """edit and clear all caches""" self._clearCache() Folder._edit(self, **kw)
def __init__(self, id, title='', container=None): # Initialize both SQLCatalog as well as Folder Catalog.__init__(self, id, title, container) Folder.__init__(self, id)
class TestProxyField(ERP5TypeTestCase): def getTitle(self): return "Proxy Field" def afterSetUp(self): self.container = Folder("container").__of__(self.portal) self.container._setObject("Base_viewProxyFieldLibrary", ERP5Form("Base_viewProxyFieldLibrary", "Proxys")) self.container._setObject("Base_view", ERP5Form("Base_view", "View")) from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable() def addField(self, form, id, title, field_type): form.manage_addField(id, title, field_type) field = getattr(form, id) field._p_oid = makeDummyOid() return field def test_get_template_field(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") proxy_field = self.addField(self.container.Base_view, "my_title", "Not Title", "ProxyField") self.assertEqual(None, proxy_field.getTemplateField()) self.assertEqual(None, proxy_field.get_value("enable")) self.assertEqual(None, proxy_field.get_value("default")) proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) self.assertEqual(original_field, proxy_field.getTemplateField()) def test_simple_surcharge(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") self.assertEqual("Title", original_field.get_value("title")) proxy_field = self.addField(self.container.Base_view, "my_title", "Not Title", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) self.assert_(proxy_field.is_delegated("title")) self.assertEqual("Title", proxy_field.get_value("title")) def test_simple_not_surcharge(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") self.assertEqual("Title", original_field.get_value("title")) proxy_field = self.addField(self.container.Base_view, "my_title", "Proxy Title", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) # XXX no API for this ? proxy_field._surcharged_edit(dict(title="Proxy Title"), ["title"]) self.assertFalse(proxy_field.is_delegated("title")) self.assertEqual("Proxy Title", proxy_field.get_value("title")) def test_get_value_default(self): # If the proxy field is named 'my_id', it will get 'id' # property on the context, regardless of the id of the proxified field original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") proxy_field = self.addField(self.container.Base_view, "my_id", "ID", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) self.assertEqual("container", self.container.getId()) self.assertEqual("container", proxy_field.get_value("default")) def test_field_tales_context(self): # in the TALES context, "field" will be the proxyfield, not the original # field. original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") original_field.manage_tales_xmlrpc(dict(title="field/getId")) self.assertEqual("my_title", original_field.get_value("title")) proxy_field = self.addField(self.container.Base_view, "my_reference", "Not Title", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) # 'my_reference' is the ID of the proxy field self.assertEqual("my_reference", proxy_field.get_value("title")) def test_form_tales_context(self): # in the TALES context, "form" will be the form containing the proxyfield, # not the original form (ie. the field library). original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") original_field.manage_tales_xmlrpc(dict(title="form/getId")) self.assertEqual("Base_viewProxyFieldLibrary", original_field.get_value("title")) proxy_field = self.addField(self.container.Base_view, "my_title", "Title", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) self.assertEqual("Base_view", proxy_field.get_value("title")) def test_get_value_cache_on_TALES_target(self): # If the proxy field defines its target using TALES, then no caching should # happen. original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_title", "Title", "StringField") other_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_other_field", "Other", "StringField") proxy_field = self.addField(self.container.Base_view, "my_id", "ID", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary")) proxy_field.manage_tales_xmlrpc(dict(field_id="request/field_id")) self.container.REQUEST.set("field_id", "my_title") self.assertEqual(original_field, proxy_field.getTemplateField()) self.assertEqual("Title", proxy_field.get_value("title")) self.container.REQUEST.set("field_id", "my_other_field") self.assertEqual(other_field, proxy_field.getTemplateField()) self.assertEqual("Other", proxy_field.get_value("title")) def test_proxy_to_date_time_field(self): # date time fields are specific, because they use a 'sub_form', we must # make sure this works as expected original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_date", "Date", "DateTimeField") original_field.manage_edit_xmlrpc(dict(required=0)) proxy_field = self.addField(self.container.Base_view, "my_date", "Date", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_date")) self.assertTrue(hasattr(proxy_field, "sub_form")) self.assertTrue(aq_base(proxy_field.sub_form) is aq_base(original_field.sub_form)) # we can render proxy_field.render() # and validate self.container.Base_view.validate_all_to_request(self.portal.REQUEST) def test_manage_edit_surcharged_xmlrpc(self): # manage_edit_surcharged_xmlrpc is a method to edit proxyfields # programmatically original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_string", "String", "StringField") proxy_field = self.addField(self.container.Base_view, "my_String", "", "ProxyField") proxy_field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_date")) proxy_field.manage_edit_surcharged_xmlrpc(dict(title="Title")) self.assertFalse(proxy_field.is_delegated("title")) self.assertEqual("Title", proxy_field.get_value("title")) # beware that all values that are not passed in the mapping will be # delegated again, regardless of the old state. proxy_field.manage_edit_surcharged_xmlrpc({}) self.assertTrue(proxy_field.is_delegated("title")) def test_same_field_id_in_proxy_field_and_template_field(self): """ Test a case that if proxy field id is same as template field id. """ original_field = self.addField(self.container.Base_viewProxyFieldLibrary, "my_string", "String", "StringField") # Use different id to the template field. proxy_field2 = self.addField(self.container.Base_view, "my_another_string", "", "ProxyField") # Use same id to the template field. proxy_field1 = self.addField(self.container.Base_view, "my_string", "", "ProxyField") proxy_field2.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_string")) proxy_field1.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_string")) def make_dummy_getter(value): def method(): return value return method self.container.getAnotherString = make_dummy_getter("WAAA") self.container.getString = make_dummy_getter("123") # First, call field which the id is different to the template field's. self.assertEqual("WAAA", proxy_field2.get_value("default")) # Next, call field which the id is same to the template field's. self.assertEqual("123", proxy_field1.get_value("default")) def test_dicts_cleared_on_edit(self): """ Test that values and tales dicts are cleared when property is switched to not surcharged. """ # create a field original_field = self.addField( self.container.Base_viewProxyFieldLibrary, "my_title", "OrigTitle", "StringField" ) field = self.addField(self.container.Base_view, "my_dict_test", "", "ProxyField") field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) def surcharge_edit(): # surcharge from edit field._surcharged_edit(dict(title="TestTitle"), ["title"]) self.assertTrue("title" in field.delegated_list) self.assertEqual(field.values["title"], "TestTitle") self.assertTrue("title" not in field.tales) def delegate_edit(): # delegate the field from edit view field._surcharged_edit(dict(title="TestTitle"), []) self.assertTrue("title" not in field.delegated_list) self.assertTrue("title" not in field.values) self.assertTrue("title" not in field.tales) def surcharge_tales(): # surcharge from tales field._surcharged_tales(dict(title="string:TestTitle"), ["title"]) self.assertTrue("title" in field.delegated_list) self.assertTrue(field.values["title"], "OrigTitle") self.assertEqual(field.tales["title"], "string:TestTitle") def delegate_tales(): # delegate the field from tales view field._surcharged_tales(dict(title="string:TestTitle"), []) self.assertTrue("title" not in field.delegated_list) self.assertTrue("title" not in field.values) self.assertTrue("title" not in field.tales) surcharge_edit() delegate_edit() surcharge_edit() delegate_tales() surcharge_tales() delegate_edit() surcharge_tales() delegate_tales() def test_proxify_error_message(self): """ Test that error messages can be delegated and surcharged. """ # create a field original_field = self.addField( self.container.Base_viewProxyFieldLibrary, "my_title", "OrigTitle", "StringField" ) field = self.addField(self.container.Base_view, "my_dict_test", "", "ProxyField") field.manage_edit_xmlrpc(dict(form_id="Base_viewProxyFieldLibrary", field_id="my_title")) self.assertEqual(original_field.get_error_names(), field.get_error_names()) test_error = "too_long" # arbitrary chosen among StringField error names test_message = "Some Unprobable Error" test_message2 = "Some Even More Unprobable Error" original_field.message_values[test_error] = test_message field.message_values[test_error] = test_message2 # delegated (by default) self.assertEqual(original_field.get_error_message(test_error), test_message) self.assertTrue(field.is_message_delegated(test_error)) self.assertEqual(field.get_error_message(test_error), test_message) # surcharged field.delegated_message_list = [test_error] self.assertEqual(original_field.get_error_message(test_error), test_message) self.assertFalse(field.is_message_delegated(test_error)) self.assertEqual(field.get_error_message(test_error), test_message2)
def __init__(self, *args, **kw): Folder.__init__(self, *args, **kw) Image.__init__(self, *args, **kw)
class TestProxify(ERP5TypeTestCase): def getTitle(self): return "Proxify" def afterSetUp(self): # base field library self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_view', ERP5Form('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._setObject('Address_view', ERP5Form('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._setObject('Person_view', ERP5Form('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 test_single_level_proxify(self): # StringField self.person_view.proxifyField({'my_name': 'Base_view.my_string_field'}) field = self.person_view.my_name self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Base_view') self.assertEqual(field.get_value('field_id'), 'my_string_field') self.assertEqual(field.is_delegated('title'), False) self.assertEqual(field.get_value('title'), 'Name') self.assertEqual(field.is_delegated('display_maxwidth'), False) self.assertEqual(field.get_value('display_maxwidth'), 20) self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.get_value('enabled'), 1) self.assertEqual(field.is_delegated('description'), True) self.assertEqual(field.get_value('description'), '') field_value_cache.clear( ) # must purge cache before changing internal field value. template_field = self.base_view.my_string_field template_field.values['description'] = 'Description' self.assertEqual(field.get_value('description'), 'Description') field_value_cache.clear() # ListField self.person_view.manage_addField('my_gender', 'Gender', 'ListField') self.person_view.proxifyField({'my_gender': 'Base_view.my_gender'}) field = self.person_view.my_gender self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Gender') self.assertEqual(field.is_delegated('items'), True) self.assertEqual(field.get_value('items'), [('Male', 'Male'), ('Female', 'Female')]) field_value_cache.clear() def test_multi_level_proxify(self): self.address_view.proxifyField( {'my_region': 'Base_view.my_list_field'}) self.person_view.proxifyField( {'my_default_region': 'Address_view.my_region'}) field = self.person_view.my_default_region self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Address_view') self.assertEqual(field.get_value('field_id'), 'my_region') self.assertEqual(field.getTemplateField().getId(), 'my_region') self.assertEqual(field.getRecursiveTemplateField().getId(), 'my_list_field') self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Country') self.assertEqual(field.is_delegated('size'), True) self.assertEqual(field.get_value('size'), 1) self.assertEqual(field.is_delegated('items'), False) self.assertEqual( field.get_tales('items')._text, 'here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList' ) self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.get_value('enabled'), 1) self.assertEqual(field.is_delegated('description'), True) self.assertEqual(field.get_value('description'), '') self.assertEqual(field.has_value('scrap_variable'), 0) field_value_cache.clear( ) # must purge cache before changing internal field value. template_field = self.address_view.my_region template_field.values['title'] = 'Region' self.assertEqual(field.get_value('title'), 'Region') def test_force_delegate(self): self.person_view.proxifyField({'my_name': 'Base_view.my_string_field'}, force_delegate=1) field = self.person_view.my_name self.assertEqual(field.meta_type, 'ProxyField') self.assertEqual(field.get_value('form_id'), 'Base_view') self.assertEqual(field.get_value('field_id'), 'my_string_field') self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.is_delegated('size'), True) self.assertEqual(field.is_delegated('enabled'), True) self.assertEqual(field.is_delegated('description'), True) def test_keep_empty_value(self): #Non editable fields self.person_view.proxifyField( { 'my_custom_description': 'Base_view.my_custom_description', 'my_custom_description2': 'Base_view.my_custom_description', 'my_another_description': 'Base_view.my_another_description' }, keep_empty_value=True) field = self.person_view.my_custom_description self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), False) self.assertEqual(field.get_value('editable'), 0) field = self.person_view.my_custom_description2 self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), True) self.assertEqual(field.get_value('editable'), 1) field = self.person_view.my_another_description self.assertEqual(field.is_delegated('title'), True) self.assertEqual(field.get_value('title'), 'Description') self.assertEqual(field.is_delegated('editable'), True) self.assertEqual(field.get_value('editable'), 0) def test_unproxify(self): #Proxify First self.address_view.proxifyField( {'my_region': 'Base_view.my_list_field'}) self.person_view.proxifyField( {'my_default_region': 'Address_view.my_region'}) field_value_cache.clear() #UnProxify self.person_view.unProxifyField({'my_default_region': 'on'}) field = self.person_view.my_default_region self.assertEqual(field.meta_type, 'ListField') self.assertEqual(field.get_value('title'), 'Country') self.assertEqual( field.get_tales('items')._text, 'here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList' ) #Test unproxify with old instance. #Proxify First self.person_view.proxifyField({ 'my_career_subordination_title': 'Base_view.my_relation_string_field' }) field_value_cache.clear() #UnProxify self.person_view.unProxifyField( {'my_career_subordination_title': 'on'}) field = self.person_view.my_career_subordination_title self.assertEqual(field.meta_type, 'RelationStringField') self.assertEqual(field.get_value('title'), 'Organisation') self.assertEqual(field.get_value('proxy_listbox_ids'), [ ('OrganisationModule_viewOrganisationList/listbox', 'Organisation') ])
class TestProxyField(ERP5TypeTestCase): def getTitle(self): return "Proxy Field" def afterSetUp(self): self.container = Folder('container').__of__(self.portal) self.container._setObject( 'Base_viewProxyFieldLibrary', ERP5Form('Base_viewProxyFieldLibrary', 'Proxys')) self.container._setObject('Base_view', ERP5Form('Base_view', 'View')) from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable() def addField(self, form, id, title, field_type): form.manage_addField(id, title, field_type) field = getattr(form, id) field._p_oid = makeDummyOid() return field def test_get_template_field(self): original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_title', 'Not Title', 'ProxyField') self.assertEqual(None, proxy_field.getTemplateField()) self.assertEqual(None, proxy_field.get_value('enable')) self.assertEqual(None, proxy_field.get_value('default')) proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) self.assertEqual(original_field, proxy_field.getTemplateField()) def test_simple_surcharge(self): original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') self.assertEqual('Title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Not Title', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) self.assert_(proxy_field.is_delegated('title')) self.assertEqual('Title', proxy_field.get_value('title')) def test_simple_not_surcharge(self): original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') self.assertEqual('Title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Proxy Title', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) # XXX no API for this ? proxy_field._surcharged_edit(dict(title='Proxy Title'), ['title']) self.assertFalse(proxy_field.is_delegated('title')) self.assertEqual('Proxy Title', proxy_field.get_value('title')) def test_get_value_default(self): # If the proxy field is named 'my_id', it will get 'id' # property on the context, regardless of the id of the proxified field original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) self.assertEqual('container', self.container.getId()) self.assertEqual('container', proxy_field.get_value('default')) def test_field_tales_context(self): # in the TALES context, "field" will be the proxyfield, not the original # field. original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') original_field.manage_tales_xmlrpc(dict(title='field/getId')) self.assertEqual('my_title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_reference', 'Not Title', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) # 'my_reference' is the ID of the proxy field self.assertEqual('my_reference', proxy_field.get_value('title')) def test_form_tales_context(self): # in the TALES context, "form" will be the form containing the proxyfield, # not the original form (ie. the field library). original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') original_field.manage_tales_xmlrpc(dict(title='form/getId')) self.assertEqual('Base_viewProxyFieldLibrary', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Title', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) self.assertEqual('Base_view', proxy_field.get_value('title')) def test_get_value_cache_on_TALES_target(self): # If the proxy field defines its target using TALES, then no caching should # happen. original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') other_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_other_field', 'Other', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict(form_id='Base_viewProxyFieldLibrary')) proxy_field.manage_tales_xmlrpc(dict(field_id='request/field_id')) self.container.REQUEST.set('field_id', 'my_title') self.assertEqual(original_field, proxy_field.getTemplateField()) self.assertEqual('Title', proxy_field.get_value('title')) self.container.REQUEST.set('field_id', 'my_other_field') self.assertEqual(other_field, proxy_field.getTemplateField()) self.assertEqual('Other', proxy_field.get_value('title')) def test_proxy_to_date_time_field(self): # date time fields are specific, because they use a 'sub_form', we must # make sure this works as expected original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_date', 'Date', 'DateTimeField') original_field.manage_edit_xmlrpc(dict(required=0)) proxy_field = self.addField(self.container.Base_view, 'my_date', 'Date', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_date', )) self.assertTrue(hasattr(proxy_field, '_get_sub_form')) self.assertEqual(proxy_field._get_sub_form().render(), original_field._get_sub_form().render()) # we can render proxy_field.render() # and validate self.container.Base_view.validate_all_to_request(self.portal.REQUEST) # change style in the original field original_field.manage_edit_xmlrpc(dict(input_style='number')) self.assertTrue('type="number"' in original_field.render()) self.assertTrue('type="number"' in proxy_field.render()) # override style in the proxy field original_field.manage_edit_xmlrpc(dict(input_style='text')) proxy_field._surcharged_edit({'input_style': 'number'}, ['input_style']) self.assertTrue('type="text"' in original_field.render()) self.assertTrue('type="number"' in proxy_field.render()) # unproxify the proxy field self.container.Base_view.unProxifyField({'my_date': 'on'}) unproxified_field = self.container.Base_view.my_date self.assertTrue('type="number"' in unproxified_field.render()) def test_manage_edit_surcharged_xmlrpc(self): # manage_edit_surcharged_xmlrpc is a method to edit proxyfields # programmatically original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_string', 'String', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_String', '', 'ProxyField') proxy_field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_date', )) proxy_field.manage_edit_surcharged_xmlrpc(dict(title='Title')) self.assertFalse(proxy_field.is_delegated('title')) self.assertEqual('Title', proxy_field.get_value('title')) # beware that all values that are not passed in the mapping will be # delegated again, regardless of the old state. proxy_field.manage_edit_surcharged_xmlrpc({}) self.assertTrue(proxy_field.is_delegated('title')) def test_same_field_id_in_proxy_field_and_template_field(self): """ Test a case that if proxy field id is same as template field id. """ original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_string', 'String', 'StringField') # Use different id to the template field. proxy_field2 = self.addField(self.container.Base_view, 'my_another_string', '', 'ProxyField') # Use same id to the template field. proxy_field1 = self.addField(self.container.Base_view, 'my_string', '', 'ProxyField') proxy_field2.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_string', )) proxy_field1.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_string', )) def make_dummy_getter(value): def method(): return value return method self.container.getAnotherString = make_dummy_getter('WAAA') self.container.getString = make_dummy_getter('123') # First, call field which the id is different to the template field's. self.assertEqual('WAAA', proxy_field2.get_value('default')) # Next, call field which the id is same to the template field's. self.assertEqual('123', proxy_field1.get_value('default')) def test_dicts_cleared_on_edit(self): """ Test that values and tales dicts are cleared when property is switched to not surcharged. """ # create a field original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle', 'StringField') field = self.addField(self.container.Base_view, 'my_dict_test', '', 'ProxyField') field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) def surcharge_edit(): #surcharge from edit field._surcharged_edit(dict(title='TestTitle'), ['title']) self.assertTrue('title' in field.delegated_list) self.assertEqual(field.values['title'], 'TestTitle') self.assertTrue('title' not in field.tales) def delegate_edit(): # delegate the field from edit view field._surcharged_edit(dict(title='TestTitle'), []) self.assertTrue('title' not in field.delegated_list) self.assertTrue('title' not in field.values) self.assertTrue('title' not in field.tales) def surcharge_tales(): #surcharge from tales field._surcharged_tales(dict(title='string:TestTitle'), ['title']) self.assertTrue('title' in field.delegated_list) self.assertTrue(field.values['title'], 'OrigTitle') self.assertEqual(field.tales['title'], 'string:TestTitle') def delegate_tales(): # delegate the field from tales view field._surcharged_tales(dict(title='string:TestTitle'), []) self.assertTrue('title' not in field.delegated_list) self.assertTrue('title' not in field.values) self.assertTrue('title' not in field.tales) surcharge_edit() delegate_edit() surcharge_edit() delegate_tales() surcharge_tales() delegate_edit() surcharge_tales() delegate_tales() def test_proxify_error_message(self): """ Test that error messages can be delegated and surcharged. """ # create a field original_field = self.addField( self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle', 'StringField') field = self.addField(self.container.Base_view, 'my_dict_test', '', 'ProxyField') field.manage_edit_xmlrpc( dict( form_id='Base_viewProxyFieldLibrary', field_id='my_title', )) self.assertEqual(original_field.get_error_names(), field.get_error_names()) test_error = 'too_long' # arbitrary chosen among StringField error names test_message = 'Some Unprobable Error' test_message2 = 'Some Even More Unprobable Error' original_field.message_values[test_error] = test_message field.message_values[test_error] = test_message2 # delegated (by default) self.assertEqual(original_field.get_error_message(test_error), test_message) self.assertTrue(field.is_message_delegated(test_error)) self.assertEqual(field.get_error_message(test_error), test_message) # surcharged field.delegated_message_list = [test_error] self.assertEqual(original_field.get_error_message(test_error), test_message) self.assertFalse(field.is_message_delegated(test_error)) self.assertEqual(field.get_error_message(test_error), test_message2)
class TestProxyField(ERP5TypeTestCase): def getTitle(self): return "Proxy Field" def afterSetUp(self): self.container = Folder('container').__of__(self.portal) self.container._setObject('Base_viewProxyFieldLibrary', ERP5Form('Base_viewProxyFieldLibrary', 'Proxys')) self.container._setObject('Base_view', ERP5Form('Base_view', 'View')) try: from Products.CMFCore.tests.base.utils import _setUpDefaultTraversable _setUpDefaultTraversable() except ImportError: pass # On Zope 2.8, remove when we no longer support it def addField(self, form, id, title, field_type): form.manage_addField(id, title, field_type) field = getattr(form, id) field._p_oid = makeDummyOid() return field def test_get_template_field(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_title', 'Not Title', 'ProxyField') self.assertEquals(None, proxy_field.getTemplateField()) self.assertEquals(None, proxy_field.get_value('enable')) self.assertEquals(None, proxy_field.get_value('default')) proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) self.assertEquals(original_field, proxy_field.getTemplateField()) def test_simple_surcharge(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') self.assertEquals('Title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Not Title', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) self.assert_(proxy_field.is_delegated('title')) self.assertEquals('Title', proxy_field.get_value('title')) def test_simple_not_surcharge(self): original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') self.assertEquals('Title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Proxy Title', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) # XXX no API for this ? proxy_field._surcharged_edit(dict(title='Proxy Title'), ['title']) self.failIf(proxy_field.is_delegated('title')) self.assertEquals('Proxy Title', proxy_field.get_value('title')) def test_get_value_default(self): # If the proxy field is named 'my_id', it will get 'id' # property on the context, regardless of the id of the proxified field original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) self.assertEquals('container', self.container.getId()) self.assertEquals('container', proxy_field.get_value('default')) def test_field_tales_context(self): # in the TALES context, "field" will be the proxyfield, not the original # field. original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') original_field.manage_tales_xmlrpc(dict(title='field/getId')) self.assertEquals('my_title', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_reference', 'Not Title', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) # 'my_reference' is the ID of the proxy field self.assertEquals('my_reference', proxy_field.get_value('title')) def test_form_tales_context(self): # in the TALES context, "form" will be the form containing the proxyfield, # not the original form (ie. the field library). original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') original_field.manage_tales_xmlrpc(dict(title='form/getId')) self.assertEquals('Base_viewProxyFieldLibrary', original_field.get_value('title')) proxy_field = self.addField(self.container.Base_view, 'my_title', 'Title', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) self.assertEquals('Base_view', proxy_field.get_value('title')) def test_get_value_cache_on_TALES_target(self): # If the proxy field defines its target using TALES, then no caching should # happen. original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'Title', 'StringField') other_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_other_field', 'Other', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_id', 'ID', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary')) proxy_field.manage_tales_xmlrpc(dict(field_id='request/field_id')) self.container.REQUEST.set('field_id', 'my_title') self.assertEquals(original_field, proxy_field.getTemplateField()) self.assertEquals('Title', proxy_field.get_value('title')) self.container.REQUEST.set('field_id', 'my_other_field') self.assertEquals(other_field, proxy_field.getTemplateField()) self.assertEquals('Other', proxy_field.get_value('title')) def test_proxy_to_date_time_field(self): # date time fields are specific, because they use a 'sub_form', we must # make sure this works as expected original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_date', 'Date', 'DateTimeField') original_field.manage_edit_xmlrpc(dict(required=0)) proxy_field = self.addField(self.container.Base_view, 'my_date', 'Date', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_date',)) self.assertTrue(hasattr(proxy_field, 'sub_form')) self.assertTrue(aq_base(proxy_field.sub_form) is aq_base(original_field.sub_form)) # we can render proxy_field.render() # and validate self.container.Base_view.validate_all_to_request(dict()) def test_manage_edit_surcharged_xmlrpc(self): # manage_edit_surcharged_xmlrpc is a method to edit proxyfields # programmatically original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_string', 'String', 'StringField') proxy_field = self.addField(self.container.Base_view, 'my_String', '', 'ProxyField') proxy_field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_date',)) proxy_field.manage_edit_surcharged_xmlrpc(dict(title='Title')) self.assertFalse(proxy_field.is_delegated('title')) self.assertEquals('Title', proxy_field.get_value('title')) # beware that all values that are not passed in the mapping will be # delegated again, regardless of the old state. proxy_field.manage_edit_surcharged_xmlrpc(dict()) self.assertTrue(proxy_field.is_delegated('title')) def test_same_field_id_in_proxy_field_and_template_field(self): """ Test a case that if proxy field id is same as template field id. """ original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_string', 'String', 'StringField') # Use different id to the template field. proxy_field2 = self.addField(self.container.Base_view, 'my_another_string', '', 'ProxyField') # Use same id to the template field. proxy_field1 = self.addField(self.container.Base_view, 'my_string', '', 'ProxyField') proxy_field2.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_string',)) proxy_field1.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_string',)) def make_dummy_getter(value): def method(): return value return method self.container.getAnotherString = make_dummy_getter('WAAA') self.container.getString = make_dummy_getter('123') # First, call field which the id is different to the template field's. self.assertEqual('WAAA', proxy_field2.get_value('default')) # Next, call field which the id is same to the template field's. self.assertEqual('123', proxy_field1.get_value('default')) def test_dicts_cleared_on_edit(self): """ Test that values and tales dicts are cleared when property is switched to not surcharged. """ # create a field original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle', 'StringField') field = self.addField(self.container.Base_view, 'my_dict_test', '', 'ProxyField') field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) def surcharge_edit(): #surcharge from edit field._surcharged_edit(dict(title='TestTitle'), ['title']) self.assertTrue('title' in field.delegated_list) self.assertEquals(field.values['title'], 'TestTitle') self.assertTrue('title' not in field.tales) def delegate_edit(): # delegate the field from edit view field._surcharged_edit(dict(title='TestTitle'), []) self.assertTrue('title' not in field.delegated_list) self.assertTrue('title' not in field.values) self.assertTrue('title' not in field.tales) def surcharge_tales(): #surcharge from tales field._surcharged_tales(dict(title='string:TestTitle'), ['title']) self.assertTrue('title' in field.delegated_list) self.assertTrue(field.values['title'], 'OrigTitle') self.assertEquals(field.tales['title'], 'string:TestTitle') def delegate_tales(): # delegate the field from tales view field._surcharged_tales(dict(title='string:TestTitle'), []) self.assertTrue('title' not in field.delegated_list) self.assertTrue('title' not in field.values) self.assertTrue('title' not in field.tales) surcharge_edit() delegate_edit() surcharge_edit() delegate_tales() surcharge_tales() delegate_edit() surcharge_tales() delegate_tales() def test_proxify_error_message(self): """ Test that error messages can be delegated and surcharged. """ # create a field original_field = self.addField(self.container.Base_viewProxyFieldLibrary, 'my_title', 'OrigTitle', 'StringField') field = self.addField(self.container.Base_view, 'my_dict_test', '', 'ProxyField') field.manage_edit_xmlrpc(dict(form_id='Base_viewProxyFieldLibrary', field_id='my_title',)) self.assertEquals(original_field.get_error_names(), field.get_error_names()) test_error = 'too_long' # arbitrary chosen among StringField error names test_message = 'Some Unprobable Error' test_message2 = 'Some Even More Unprobable Error' original_field.message_values[test_error] = test_message field.message_values[test_error] = test_message2 # delegated (by default) self.assertEquals(original_field.get_error_message(test_error), test_message) self.assertTrue(field.is_message_delegated(test_error)) self.assertEquals(field.get_error_message(test_error), test_message) # surcharged field.delegated_message_list = [test_error] self.assertEquals(original_field.get_error_message(test_error), test_message) self.assertFalse(field.is_message_delegated(test_error)) self.assertEquals(field.get_error_message(test_error), test_message2)