Example #1
0
 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)
Example #3
0
    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()
Example #4
0
 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()
Example #5
0
  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)
Example #6
0
    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)
Example #7
0
 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
Example #8
0
    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)
Example #9
0
  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)
Example #10
0
  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)
Example #11
0
    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)
Example #12
0
    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
Example #13
0
  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
Example #14
0
  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
Example #15
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
Example #16
0
  def afterSetUp(self):
    # base field library
    self.container = Folder('container').__of__(self.portal)
    self.container.manage_addProduct['ERP5Form'].addERP5Form('Base_view', 'Base')
    base_view = self.base_view = self.container.Base_view
    base_view.manage_addField('my_string_field', 'String Field', 'StringField')
    base_view.manage_addField('my_list_field', 'List Field', 'ListField')
    base_view.manage_addField('my_relation_string_field', 'Old Relation String Field', 'RelationStringField')
    base_view.manage_addField('my_gender', 'Gender', 'ListField')
    base_view.manage_addField('my_custom_description', 'Description', 'TextAreaField')
    base_view.manage_addField('my_another_description', 'Description', 'TextAreaField')
    base_view.my_string_field.values['display_width'] = 30
    base_view.my_list_field.values['size'] = 1
    base_view.my_gender.values['items'] = [('Male', 'Male'), ('Female', 'Female')]
    base_view.my_another_description.values['editable'] = 0

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

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

    # person view
    self.container.manage_addProduct['ERP5Form'].addERP5Form('Person_view', 'Person')
    person_view = self.person_view = self.container.Person_view
    person_view.manage_addField('my_name', 'Name', 'StringField')
    person_view.manage_addField('my_default_region', 'Country', 'ListField')
    person_view.manage_addField('my_custom_description', 'Description', 'TextAreaField')
    person_view.manage_addField('my_custom_description2', 'Description', 'TextAreaField')
    person_view.manage_addField('my_another_description', 'Description', 'TextAreaField')
    person_view.my_name.values['display_maxwidth'] = 20
    person_view.my_default_region.values['size'] = 1
    person_view.my_default_region.tales['items'] = TALESMethod('here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList')
    person_view.my_default_region.values['scrap_variable'] = 'obsolete'
    person_view.manage_addField('my_career_subordination_title', 'Organisation', 'RelationStringField')
    person_view.my_career_subordination_title.values['base_category'] = 'subordination'
    person_view.my_career_subordination_title.values['portal_type'] = [('Organisation', 'Organisation')]
    person_view.my_career_subordination_title.values['proxy_listbox_ids'] = [('OrganisationModule_viewOrganisationList/listbox', 'Organisation')]
    person_view.my_custom_description.values['editable'] = 0
    person_view.my_another_description.values['editable'] = 0
Example #17
0
 def __init__(self, id=None):
     if id is None:
         id = self.__class__.id
     Folder.__init__(self, id)
Example #18
0
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')])
Example #19
0
 def _edit(self, **kw):
     """edit and clear all caches"""
     self._clearCache()
     Folder._edit(self, **kw)
Example #20
0
 def __init__(self, id, title='', container=None):
     # Initialize both SQLCatalog as well as Folder
     Catalog.__init__(self, id, title, container)
     Folder.__init__(self, id)
Example #21
0
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)
Example #22
0
 def __init__(self, *args, **kw):
     Folder.__init__(self, *args, **kw)
     Image.__init__(self, *args, **kw)
Example #23
0
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')
        ])
Example #24
0
 def _edit(self, **kw):
   """edit and clear all caches"""
   self._clearCache()
   Folder._edit(self, **kw)
Example #25
0
 def __init__(self, id=None):
     if id is None:
       id = self.__class__.id
     Folder.__init__(self, id)
Example #26
0
 def __init__(self, *args, **kw):
   Folder.__init__(self, *args, **kw)
   Image.__init__(self, *args, **kw)
Example #27
0
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)
Example #28
0
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)