[Erp5-report] r25485 - in /erp5/trunk/products/ERP5Type: ./ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Feb 6 17:47:56 CET 2009


Author: seb
Date: Fri Feb  6 17:47:54 2009
New Revision: 25485

URL: http://svn.erp5.org?rev=25485&view=rev
Log:
* make getPropertyList and setPropertyList working for mono valued
  properties :
- added method setPropertyList
- make getPropertyList working on a mono valued property. It will
  return a list of one element (the value of the property)
- make setPropertyList working on a mono valued property, in such
  case a list of one element must be given
- do not generate List methods for mono valued properties any more. 
  List methods were generated for mono valued properties only when 
  some acquisition parameters were defined
- add unit test for getPropertyList and setPropertyList

Modified:
    erp5/trunk/products/ERP5Type/Base.py
    erp5/trunk/products/ERP5Type/Utils.py
    erp5/trunk/products/ERP5Type/tests/testERP5Type.py

Modified: erp5/trunk/products/ERP5Type/Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Base.py?rev=25485&r1=25484&r2=25485&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Base.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Base.py [utf8] Fri Feb  6 17:47:54 2009
@@ -1361,6 +1361,23 @@
         except TypeError:
           pass
       return method(**kw)
+    # Try a mono valued accessor if it is available
+    # and return it as a list
+    if accessor_name.endswith('List'):
+      mono_valued_accessor_name = accessor_name[:-4]
+      if hasattr(aq_portal_type[aq_key], mono_valued_accessor_name):
+        method = getattr(self, mono_valued_accessor_name)
+        # We have a monovalued property
+        if d is _MARKER:
+          result = method(**kw)
+        else:
+          try:
+            result = method(d, **kw)
+          except TypeError:
+            result = method(**kw)
+        if not isinstance(result, (list, tuple)):
+          result = [result]
+        return result
     else:
       if d is not _MARKER:
         return ERP5PropertyManager.getProperty(self, key, d=d, **kw)
@@ -1371,6 +1388,12 @@
     """Same as getProperty, but for list properties.
     """
     return self.getProperty('%s_list' % key, d=d)
+
+  security.declareProtected( Permissions.ModifyPortalContent, 'setPropertyList' )
+  def setPropertyList(self, key, value, **kw):
+    """Same as setProperty, but for list properties.
+    """
+    return self.setProperty('%s_list' % key, value, **kw)
 
   security.declareProtected( Permissions.ModifyPortalContent, 'setProperty' )
   def setProperty(self, key, value, type='string', **kw):
@@ -1422,6 +1445,24 @@
     if getattr(aq_portal_type[aq_key], public_accessor_name, None) is not None:
       method = getattr(self, public_accessor_name)
       return method(value, **kw)
+    # Try a mono valued setter if it is available
+    # and call it
+    if accessor_name.endswith('List'):
+      mono_valued_accessor_name = accessor_name[:-4]
+      mono_valued_public_accessor_name = public_accessor_name[:-4]
+      method = None
+      if hasattr(aq_portal_type[aq_key], mono_valued_accessor_name):
+        method = getattr(self, mono_valued_accessor_name)
+      elif hasattr(aq_portal_type[aq_key], mono_valued_public_accessor_name):
+        method = getattr(self, mono_valued_public_accessor_name)
+      if method is not None:
+        if isinstance(value, (list, tuple)):
+          value_len = len(value)
+          if value_len == 1:
+            mono_value = value[0]
+            return method(mono_value, **kw)
+        raise TypeError, \
+           "A mono valued property must be set with a list of len 1"
     # Finaly use standard PropertyManager
     #LOG("Changing attr: ",0, key)
     # If we are here, this means we do not use a property that

Modified: erp5/trunk/products/ERP5Type/Utils.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/Utils.py?rev=25485&r1=25484&r2=25485&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/Utils.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/Utils.py [utf8] Fri Feb  6 17:47:54 2009
@@ -1503,21 +1503,22 @@
     if not hasattr(property_holder, accessor_name) or prop.get('override',0):
       property_holder.registerAccessor(accessor_name, id, Acquired.DefaultGetter, accessor_args)
     # List Getter
-    accessor_name = 'get' + UpperCase(id) + 'List'
-    if not hasattr(property_holder, accessor_name) or prop.get('override',0):
-      property_holder.registerAccessor(accessor_name, id, Acquired.ListGetter, accessor_args)
-      property_holder.declareProtected( read_permission, accessor_name )
-    accessor_name = '_baseGet' + UpperCase(id) + 'List'
-    if not hasattr(property_holder, accessor_name) or prop.get('override',0):
-      property_holder.registerAccessor(accessor_name, id, Acquired.ListGetter, accessor_args)
-    # Set Getter
-    accessor_name = 'get' + UpperCase(id) + 'Set'
-    if not hasattr(property_holder, accessor_name) or prop.get('override',0):
-      property_holder.registerAccessor(accessor_name, id, Acquired.SetGetter, accessor_args)
-      property_holder.declareProtected( read_permission, accessor_name )
-    accessor_name = '_baseGet' + UpperCase(id) + 'Set'
-    if not hasattr(property_holder, accessor_name) or prop.get('override',0):
-      property_holder.registerAccessor(accessor_name, id, Acquired.SetGetter, accessor_args)
+    if prop['type'] in list_types or prop.get('multivalued', 0):
+      accessor_name = 'get' + UpperCase(id) + 'List'
+      if not hasattr(property_holder, accessor_name) or prop.get('override',0):
+        property_holder.registerAccessor(accessor_name, id, Acquired.ListGetter, accessor_args)
+        property_holder.declareProtected( read_permission, accessor_name )
+      accessor_name = '_baseGet' + UpperCase(id) + 'List'
+      if not hasattr(property_holder, accessor_name) or prop.get('override',0):
+        property_holder.registerAccessor(accessor_name, id, Acquired.ListGetter, accessor_args)
+      # Set Getter
+      accessor_name = 'get' + UpperCase(id) + 'Set'
+      if not hasattr(property_holder, accessor_name) or prop.get('override',0):
+        property_holder.registerAccessor(accessor_name, id, Acquired.SetGetter, accessor_args)
+        property_holder.declareProtected( read_permission, accessor_name )
+      accessor_name = '_baseGet' + UpperCase(id) + 'Set'
+      if not hasattr(property_holder, accessor_name) or prop.get('override',0):
+        property_holder.registerAccessor(accessor_name, id, Acquired.SetGetter, accessor_args)
     if prop['type'] == 'content':
       #LOG('Value Object Accessor', 0, prop['id'])
       # Base Getter

Modified: erp5/trunk/products/ERP5Type/tests/testERP5Type.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5Type/tests/testERP5Type.py?rev=25485&r1=25484&r2=25485&view=diff
==============================================================================
--- erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] (original)
+++ erp5/trunk/products/ERP5Type/tests/testERP5Type.py [utf8] Fri Feb  6 17:47:54 2009
@@ -2019,6 +2019,7 @@
         {   'id'          : 'wrapped_region_title',
             'description' : 'The title of the region',
             'type'        : 'string',
+            'multivalued'        : 1,
             'acquisition_base_category'     : ('region',),
             'acquisition_portal_type'       : ('Category', ),
             'acquisition_copy_value'        : 0,
@@ -2504,6 +2505,83 @@
       self.assertTrue(type_info in container.allowedContentTypes())
       container.newContent(portal_type='Test Add Permission Document')
 
+    def testPropertyListWithMonoValuedProperty(self):
+      """
+      Check that we can use setPropertyList and getPropertyList
+      on a mono valued property
+      """
+      self._addProperty('Person',
+                  ''' { 'id':         'foo_bar',
+                        'type':       'string',
+                        'mode':       'rw', }''')
+      person = self.getPersonModule().newContent(portal_type='Person')
+      email = person.newContent(portal_type='Email')
+      self.assertEquals(None, getattr(person, 'getFooBarList', None))
+      self.assertEquals(person.getFooBar(), None)
+      self.assertFalse(person.hasProperty('foo_bar'))
+      self.assertEquals(person.getProperty('foo_bar'), None)
+      self.assertEquals(person.getPropertyList('foo_bar'), [None])
+      person.setFooBar('foo')
+      self.assertEquals(person.getProperty('foo_bar'), 'foo')
+      self.assertEquals(person.getPropertyList('foo_bar'), ['foo'])
+      person.setFooBar(None)
+      self.assertEquals(person.getProperty('foo_bar'), None)
+      person.setPropertyList('foo_bar', ['bar'])
+      self.assertEquals(person.getProperty('foo_bar'), 'bar')
+      self.assertEquals(person.getPropertyList('foo_bar'), ['bar'])
+      self.assertRaises(TypeError, person.setPropertyList, 'foo_bar', 
+                        ['a', 'b'])
+
+    def testPropertyListOnMonoValuedAcquiredProperty(self,quiet=quiet, run=run_all_test):
+      """
+      Check that we can use setPropertyList and getPropertyList
+      on a mono valued acquired property
+      """
+      self._addProperty('Person',
+                  ''' { 'id':         'foo_bar',
+                        'type':       'string',
+                        'mode':       'rw', }''')
+      self._addProperty('Email',
+                  ''' { 'id':         'foo_bar',
+                        'type':       'string',
+                        'acquired_property_id': ('description', ),
+                        'acquisition_base_category': ( 'parent', ),
+                        'acquisition_portal_type'  : ( 'Person', ),
+                        'acquisition_copy_value'   : 0,
+                        'acquisition_mask_value'   : 1,
+                        'acquisition_accessor_id'  : 'getFooBar',
+                        'acquisition_depends'      : None,
+                        'mode':       'rw', }''')
+      person = self.getPersonModule().newContent(portal_type='Person')
+      email = person.newContent(portal_type='Email')
+      self.assertEquals(email.getPropertyList('foo_bar'), [None])
+      person.setPropertyList('foo_bar', ['foo'])
+      self.assertEquals(email.getPropertyList('foo_bar'), ['foo'])
+      email.setPropertyList('foo_bar', ['bar'])
+      self.assertEquals(email.getPropertyList('foo_bar'), ['bar'])
+      email.setPropertyList('foo_bar', [None])
+      self.assertEquals(email.getPropertyList('foo_bar'), ['foo'])
+      person.setPropertyList('foo_bar', [None])
+      self.assertEquals(email.getPropertyList('foo_bar'), [None])
+
+    def testPropertyListWithMultiValuedProperty(self):
+      """
+      Check that we can use setPropertyList and getPropertyList
+      on a multi valued property
+      """
+      self._addProperty('Person',
+                  ''' { 'id':         'foo_bar',
+                        'type':       'string',
+                        'multivalued': 1,
+                        'mode':       'rw', }''')
+      person = self.getPersonModule().newContent(portal_type='Person')
+      # We have None, like test_list_accessors
+      self.assertEquals(person.getFooBarList(), None)
+      self.assertEquals(person.getPropertyList('foo_bar'), None)
+      person.setPropertyList('foo_bar', ['foo', 'bar'])
+      self.assertEquals(person.getPropertyList('foo_bar'), ['foo', 'bar'])
+      person.setPropertyList('foo_bar', [])
+      self.assertEquals(person.getFooBarList(), [])
 
 class TestAccessControl(ERP5TypeTestCase):
   # Isolate test in a dedicaced class in order not to break other tests




More information about the Erp5-report mailing list