[Zope] Issue 1896: manage_changeProperties() vs manage_addProperty()
Berthold Stöger
blists at bdf-net.com
Wed Jun 21 17:55:25 EDT 2006
Hello,
in Issue #1896 (http://www.zope.org/Collectors/Zope/1896), I describe a
difference in the behaviour of manage_changeProperties() and of
manage_addProperty(): An array of ints is converted to an array of strings
with manage_addProperty(), but not with manage_changeProperties().
You closed the bug with the following comment:
> Type converters only deal with the outer type but not with the types of
> contained elements. This should be handled on the application level.
Well, first of all this isn't true as my script shows (note: the report has a
buggy test script, correct one attached): When using manage_addProperty(),
the contents of the array *are* converted from integers to strings.
Or maybe I'm reading you wrong?
Furthermore, this still doesn't explain why the two functions behave
differently. Digging a bit deeper, I found out that the culprit is in
lib/python/OFS/PropertyManager.py:
In manage_addProperty() the type_converter is always called, but
in _updateProperty() the type_converter is only called if the value is a
string. Similar code can be found in lib/python/OFS/PropertySheets.py
Maybe there is some reason for this behaviour, but I can't think of one.
Either of the following diffs (of course not both!) fixes the problem for me:
--- lib/python/OFS/PropertyManager.py.old 2006-06-18 09:56:13.000000000 +0200
+++ lib/python/OFS/PropertyManager.py 2006-06-18 09:57:01.000000000 +0200
@@ -202,16 +202,13 @@
self._setPropValue(id, value)
def _updateProperty(self, id, value):
- # Update the value of an existing property. If value
- # is a string, an attempt will be made to convert
- # the value to the type of the existing property.
+ # Update the value of an existing property.
self._wrapperCheck(value)
if not self.hasProperty(id):
raise BadRequest, 'The property %s does not exist' % escape(id)
- if type(value)==type(''):
- proptype=self.getPropertyType(id) or 'string'
- if type_converters.has_key(proptype):
- value=type_converters[proptype](value)
+ proptype=self.getPropertyType(id) or 'string'
+ if type_converters.has_key(proptype):
+ value=type_converters[proptype](value)
self._setPropValue(id, value)
def _delProperty(self, id):
--- lib/python/OFS/PropertyManager.py.old 2006-06-18 09:56:13.000000000 +0200
+++ lib/python/OFS/PropertyManager.py 2006-06-20 12:31:56.000000000 +0200
@@ -265,14 +265,14 @@
# Web interface
- def manage_addProperty(self, id, value, type, REQUEST=None):
+ def manage_addProperty(self, id, value, proptype, REQUEST=None):
"""Add a new property via the web.
Sets a new property with the given id, type, and value.
"""
- if type_converters.has_key(type):
- value=type_converters[type](value)
- self._setProperty(id.strip(), value, type)
+ if type(value)==type('') and type_converters.has_key(proptype):
+ value=type_converters[proptype](value)
+ self._setProperty(id.strip(), value, proptype)
if REQUEST is not None:
return self.manage_propertiesForm(self, REQUEST)
This is the working version of my test script:
## Script (Python) "test"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
def is_int(i):
try:
i + 1
return "is int"
except:
return "isn't int"
obj = script
try: obj.manage_delProperties(ids=('testproperty',))
except: pass
print "Add property..."
obj.manage_addProperty('testproperty', [1,2,3], 'lines')
for i in obj.testproperty: print is_int(i)
print "Change property..."
obj.manage_changeProperties(testproperty=[1,2,3])
for i in obj.testproperty: print is_int(i)
return printed
Thank you.
PS: I know this doesn't seem important, but it gave me a hard to debug problem
once.
More information about the Zope
mailing list