[Erp5-report] r15490 - in /erp5/trunk/products/ERP5Form: Form.py tests/testProxify.py
nobody at svn.erp5.org
nobody at svn.erp5.org
Mon Aug 6 11:57:53 CEST 2007
Author: yusei
Date: Mon Aug 6 11:57:52 2007
New Revision: 15490
URL: http://svn.erp5.org?rev=15490&view=rev
Log:
Fixed a multiplex proxy bug and added a test.
Added:
erp5/trunk/products/ERP5Form/tests/testProxify.py
Modified:
erp5/trunk/products/ERP5Form/Form.py
Modified: erp5/trunk/products/ERP5Form/Form.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/Form.py?rev=15490&r1=15489&r2=15490&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Form/Form.py (original)
+++ erp5/trunk/products/ERP5Form/Form.py Mon Aug 6 11:57:52 2007
@@ -61,21 +61,22 @@
tales_expr = self.tales.get(id, "")
if tales_expr:
REQUEST = get_request()
- form = self.aq_parent # XXX (JPS) form for default is wrong apparently in listbox - double check
+ if REQUEST is not None:
+ # Proxyfield stores the "real" field in the request. Look if the
+ # corresponding field exists in request, and use it as field in the
+ # TALES context
+ field = REQUEST.get('field__proxyfield_%s_%s' % (self.id, id), self)
+ else:
+ field = self
+
+ kw['field'] = field
+
+ form = field.aq_parent # XXX (JPS) form for default is wrong apparently in listbox - double check
obj = getattr(form, 'aq_parent', None)
if obj is not None:
container = obj.aq_inner.aq_parent
else:
container = None
-
- if REQUEST is not None:
- # Proxyfield stores the "real" field in the request. Look if the
- # corresponding field exists in request, and use it as field in the
- # TALES context
- field = REQUEST.get('field__proxyfield_%s_%s' % (self.id, id), self)
- kw['field'] = field
- else:
- kw['field'] = self
kw['form'] = form
kw['request'] = REQUEST
@@ -575,7 +576,7 @@
return form_order, matched
security.declareProtected('Change Formulator Forms', 'proxifyField')
- def proxifyField(self, field_dict=None):
+ def proxifyField(self, field_dict=None, REQUEST=None):
"""Convert fields to proxy fields"""
from Products.ERP5Form.ProxyField import ProxyWidget
from Products.Formulator.MethodField import Method
@@ -644,13 +645,25 @@
proxy_field.values['form_id'] = target_form_id
proxy_field.values['field_id'] = target_field_id
- target_field = proxy_field.getRecursiveTemplateField()
+ target_field = proxy_field.getTemplateField()
# copy data
new_values = remove_same_value(copy(old_field.values),
target_field.values)
new_tales = remove_same_value(copy(old_field.tales),
target_field.tales)
+
+ if target_field.meta_type=='ProxyField':
+ for i in new_values.keys():
+ if (not i in target_field.delegated_list and
+ is_equal(target_field.get_recursive_orig_value(i),
+ new_values[i])):
+ del new_values[i]
+ for i in new_tales:
+ if (not i in target_field.delegated_list and
+ is_equal(target_field.get_recursive_tales(i),
+ new_tales[i])):
+ del new_tales[i]
delegated_list = []
for i in (new_values.keys()+new_tales.keys()):
@@ -663,7 +676,8 @@
# move back to the original group and position.
set_group_and_position(group, position, field_id)
- return self.formProxify(manage_tabs_message='Changed')
+ if REQUEST is not None:
+ return self.formProxify(manage_tabs_message='Changed')
psyco.bind(__call__)
psyco.bind(_exec)
Added: erp5/trunk/products/ERP5Form/tests/testProxify.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Form/tests/testProxify.py?rev=15490&view=auto
==============================================================================
--- erp5/trunk/products/ERP5Form/tests/testProxify.py (added)
+++ erp5/trunk/products/ERP5Form/tests/testProxify.py Mon Aug 6 11:57:52 2007
@@ -1,0 +1,138 @@
+##############################################################################
+#
+# Copyright (c) 2007 Nexedi SARL 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.
+#
+##############################################################################
+
+import unittest
+
+# Make it possible to use Globals.get_request
+class DummyRequest(dict):
+ def set(self, k, v):
+ self[k] = v
+
+global request
+request = DummyRequest()
+
+def get_request():
+ global request
+ return request
+
+# apply patch (before it's imported by other modules)
+import Globals
+Globals.get_request = get_request
+
+# Initialize ERP5Form Product to load monkey patches
+from Testing import ZopeTestCase
+ZopeTestCase.installProduct('ERP5Form')
+
+from Products.Formulator.TALESField import TALESMethod
+from Products.ERP5Type.Core.Folder import Folder
+from Products.ERP5Form.Form import ERP5Form
+
+
+class TestProxify(unittest.TestCase):
+
+ def setUp(self):
+ # base field library
+ self.container = Folder('container').__of__(Folder('root'))
+ 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.my_string_field.values['display_width'] = 30
+ base_view.my_list_field.values['size'] = 1
+
+ # 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.my_name.values['size'] = 20
+ person_view.my_default_region.values['size'] = 1
+ person_view.my_default_region.tales['items'] = TALESMethod('here/portal_categories/region/getCategoryChildTranslatedLogicalPathItemList')
+
+ global request
+ request = DummyRequest()
+
+ def test_single_level_proxify(self):
+ 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('size'), False)
+ self.assertEqual(field.get_value('size'), 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'), '')
+
+ template_field = self.base_view.my_string_field
+ template_field.values['description'] = 'Description'
+ self.assertEqual(field.get_value('description'), 'Description')
+
+ 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'), '')
+
+ template_field = self.address_view.my_region
+ template_field.values['title'] = 'Region'
+ self.assertEqual(field.get_value('title'), 'Region')
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestProxify))
+ return suite
More information about the Erp5-report
mailing list