[Erp5-report] r30848 - in /erp5/trunk/products/ERP5Form: ProxyField.py tests/testProxyField.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Tue Nov 24 15:30:39 CET 2009
Author: romain
Date: Tue Nov 24 15:30:35 2009
New Revision: 30848
URL: http://svn.erp5.org?rev=30848&view=rev
Log:
Allow to:
- explicitely define the skin folder in the proxy field's form ID field.
- surcharge a field library for a custom project by only putting inside
the modified fields. Untouched field can be left inside standard
field library.
Added:
erp5/trunk/products/ERP5Form/tests/testProxyField.py
Modified:
erp5/trunk/products/ERP5Form/ProxyField.py
Modified: erp5/trunk/products/ERP5Form/ProxyField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/ProxyField.py?rev=30848&r1=30847&r2=30848&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/ProxyField.py [utf8] (original)
+++ erp5/trunk/products/ERP5Form/ProxyField.py [utf8] Tue Nov 24 15:30:35 2009
@@ -54,6 +54,9 @@
from Products.ERP5Form.Form import StaticValue, TALESValue, OverrideValue, DefaultValue, EditableValue
from Products.ERP5Form.Form import copyMethod, isCacheable
+from Products.CMFCore.Skinnable import SKINDATA
+from thread import get_ident
+
_USE_ORIGINAL_GET_VALUE_MARKER = []
_field_value_cache = {}
@@ -423,15 +426,54 @@
form = self.aq_parent
object = form.aq_parent
- try:
- proxy_form = getattr(object, self.get_value('form_id'))
- proxy_field = aq_base(getattr(proxy_form, self.get_value('field_id')))
+
+ form_id = self.get_value('form_id')
+ proxy_field = None
+ form_id_with_skin_folder_name_flag = False
+ if '/' in form_id:
+ # If a / is in the form_id, it means that skin_folder is explicitly
+ # defined. If so, prevent acquisition to get the form.
+ form_id_with_skin_folder_name_flag = True
+ proxy_form = aq_base(object.portal_skins).unrestrictedTraverse(form_id, None)
+ else:
+ proxy_form = getattr(object, form_id, None)
+
+ if (proxy_form is not None):
+ field_id = self.get_value('field_id')
+ try:
+ proxy_field = aq_base(getattr(proxy_form, field_id))
+ except (AttributeError, TypeError):
+ proxy_field = None
+
+ if form_id_with_skin_folder_name_flag is False:
+ # Try to get the field from another field library with a lower
+ # priority.
+ # This should return no field if the skin folder name is defined in
+ # form_id.
+ skin_info = SKINDATA.get(get_ident())
+
+ if skin_info is not None:
+ skin_selection_name, ignore, resolve = skin_info
+ portal_skins = aq_base(self.portal_skins)
+
+ selection_dict = portal_skins._getSelections()
+ candidate_folder_id_list = selection_dict[skin_selection_name].split(',')
+
+ for candidate_folder_id in candidate_folder_id_list:
+ candidate_folder = getattr(portal_skins, candidate_folder_id, None)
+ if candidate_folder is not None:
+ proxy_form = getattr(candidate_folder, form_id, None)
+ if proxy_form is not None:
+ proxy_field = getattr(proxy_form, field_id, None)
+ if proxy_field is not None:
+ break
+
+ if proxy_field is not None:
proxy_field = proxy_field.__of__(form)
- except (AttributeError, TypeError):
+ else:
LOG('ProxyField', WARNING,
'Could not get a field from a proxy field %s in %s' % \
(self.id, object.id))
- proxy_field = None
if cache is True:
self._setTemplateFieldCache(proxy_field)
return proxy_field
Added: erp5/trunk/products/ERP5Form/tests/testProxyField.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/tests/testProxyField.py?rev=30848&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/tests/testProxyField.py (added)
+++ erp5/trunk/products/ERP5Form/tests/testProxyField.py [utf8] Tue Nov 24 15:30:35 2009
@@ -1,0 +1,189 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (c) 2002-2009 Nexedi SA and Contributors. All Rights Reserved.
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+##############################################################################
+
+from Testing.ZopeTestCase.PortalTestCase import PortalTestCase
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.SecurityTestCase import SecurityTestCase
+import transaction
+import unittest
+
+class TestProxyField(ERP5TypeTestCase):
+ """
+ Check proxy field
+ """
+
+ def getTitle(self):
+ return "TestProxyField"
+
+ def changeSkin(self, skin_name):
+ """
+ Change current Skin
+ """
+ request = self.app.REQUEST
+ self.getPortal().portal_skins.changeSkin(skin_name)
+ request.set('portal_skin', skin_name)
+
+ def testEmptySurchargedFieldLibrary(self):
+ """
+ This test checks that it is not required to duplicate all fields in a custom
+ field library
+ """
+ portal_skins = self.getSkinsTool()
+ # Create an empty field library
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('customized_geek')
+ skin_folder = portal_skins._getOb('customized_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+
+ # Create the default field library with a template field
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('erp5_geek')
+ skin_folder = portal_skins._getOb('erp5_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+ form.manage_addField('my_title', 'Generic Title', 'StringField')
+
+ # Custom field library has to have an higher priority
+ selection = portal_skins.getSkinPath('View')
+ selection = selection.split(',')
+ selection.append('customized_geek')
+ selection.append('erp5_geek')
+ portal_skins.manage_skinLayers(skinpath=tuple(selection),
+ skinname='View', add_skin=1)
+ portal_skins.getPortalObject().changeSkin(None)
+
+ skin_folder = portal_skins._getOb('custom')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form('Base_viewGeek',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeek', None)
+ form.manage_addField('my_title', 'Title', 'ProxyField')
+ field = getattr(form, 'my_title')
+ field.manage_edit_xmlrpc(dict(
+ form_id='Base_viewGeekFieldLibrary', field_id='my_title'))
+
+ self.assertEquals('Generic Title', field.get_value('title'))
+
+ def testPathOfTemplateField(self):
+ """
+ This test checks if it is possible to specify the skin folder of a form
+ """
+ portal_skins = self.getSkinsTool()
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('customized_geek')
+ skin_folder = portal_skins._getOb('customized_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+ form.manage_addField('my_title', 'Customized Title', 'StringField')
+
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('erp5_geek')
+ skin_folder = portal_skins._getOb('erp5_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+ form.manage_addField('my_title', 'Generic Title', 'StringField')
+
+ # Custom field library has to have an higher priority
+ selection = portal_skins.getSkinPath('View')
+ selection = selection.split(',')
+ selection.append('customized_geek')
+ selection.append('erp5_geek')
+ portal_skins.manage_skinLayers(skinpath=tuple(selection),
+ skinname='View', add_skin=1)
+ portal_skins.getPortalObject().changeSkin(None)
+
+ skin_folder = portal_skins._getOb('custom')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form('Base_viewGeek',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeek', None)
+ form.manage_addField('my_title', 'Title', 'ProxyField')
+ field = getattr(form, 'my_title')
+ # Explicitely enter skin folder of the template field's form
+ field.manage_edit_xmlrpc(dict(
+ form_id='erp5_geek/Base_viewGeekFieldLibrary', field_id='my_title'))
+
+ self.assertEquals('Generic Title', field.get_value('title'))
+
+ def testSkinSelectionTemplateField(self):
+ """
+ Check that proxy field values are generated from the current skin selection
+ """
+ portal_skins = self.getSkinsTool()
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('customized_geek')
+ skin_folder = portal_skins._getOb('customized_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+
+ portal_skins.manage_addProduct['OFSP'].manage_addFolder('erp5_geek')
+ skin_folder = portal_skins._getOb('erp5_geek')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form(
+ 'Base_viewGeekFieldLibrary',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeekFieldLibrary', None)
+ form.manage_addField('my_title', 'Generic Title', 'StringField')
+
+ selection = portal_skins.getSkinPath('View')
+ selection = selection.split(',')
+ selection.append('customized_geek')
+ selection.append('erp5_geek')
+ portal_skins.addSkinSelection('CustomizedView', ','.join(selection))
+
+ selection = portal_skins.getSkinPath('View')
+ selection = selection.split(',')
+ selection.append('erp5_geek')
+ selection.append('customized_geek')
+ portal_skins.addSkinSelection('GenericView', ','.join(selection))
+
+ # XXX KeyError is raised if skin selection View is not modified.
+ # This part has to be removed has soon as this bug is fixed
+ selection = portal_skins.getSkinPath('View')
+ portal_skins.manage_skinLayers(skinpath=tuple(selection),
+ skinname='View')
+
+ portal_skins.getPortalObject().changeSkin(None)
+
+ skin_folder = portal_skins._getOb('custom')
+ skin_folder.manage_addProduct['ERP5Form'].addERP5Form('Base_viewGeek',
+ 'View')
+ form = skin_folder._getOb('Base_viewGeek', None)
+ form.manage_addField('my_title', 'Title', 'ProxyField')
+ field = getattr(form, 'my_title')
+ field.manage_edit_xmlrpc(dict(
+ form_id='Base_viewGeekFieldLibrary', field_id='my_title'))
+
+ self.assertEquals(None, field.get_value('title'))
+ self.changeSkin('GenericView')
+ self.assertEquals('Generic Title', field.get_value('title'))
+ self.changeSkin('CustomizedView')
+ self.assertEquals('Customized Title', field.get_value('title'))
More information about the Erp5-report
mailing list