[Zope3-Users] UnpickleableError when adding object with reference
john saponara
john at saponara.net
Tue Jan 15 07:05:44 EST 2008
I add a Limoservice object, then inside that object add a Car; then I
add a Driver (which contains a Car), and the AddForm offers a dropdown
with '(no value)' and my Car object. If I select the car from the
dropdown I get an error:
UnpickleableError: Cannot pickle <type 'zope.security._proxy._Proxy'>
objects
Whereas if I leave the dropdown at '(no value)', the error does not
occur. What am I doing wrong? (See attached error.txt for full error.)
Thanks yet again!
-------------- next part --------------
2008-01-15T06:47:39 ERROR SiteError http://localhost:2020/mylimo/+/limoService.Driver%3D
Traceback (most recent call last):
File "C:\Python24\Lib\site-packages\zope\publisher\publish.py", line 138, in publish
publication.afterCall(request, obj)
File "C:\Python24\Lib\site-packages\zope\app\publication\browser.py", line 78, in afterCall
super(BrowserPublication, self).afterCall(request, ob)
File "C:\Python24\Lib\site-packages\zope\app\publication\zopepublication.py", line 167, in afterCall
txn.commit()
File "C:\Python24\Lib\site-packages\transaction\_transaction.py", line 395, in commit
self._commitResources()
File "C:\Python24\Lib\site-packages\transaction\_transaction.py", line 495, in _commitResources
rm.commit(self)
File "C:\Python24\Lib\site-packages\ZODB\Connection.py", line 498, in commit
self._commit(transaction)
File "C:\Python24\Lib\site-packages\ZODB\Connection.py", line 543, in _commit
self._store_objects(ObjectWriter(obj), transaction)
File "C:\Python24\Lib\site-packages\ZODB\Connection.py", line 570, in _store_objects
p = writer.serialize(obj) # This calls __getstate__ of obj
File "C:\Python24\Lib\site-packages\ZODB\serialize.py", line 407, in serialize
return self._dump(meta, obj.__getstate__())
File "C:\Python24\Lib\site-packages\ZODB\serialize.py", line 416, in _dump
self._p.dump(state)
UnpickleableError: Cannot pickle <type 'zope.security._proxy._Proxy'> objects
127.0.0.1 - - [15/Jan/2008:06:47:39 -0400] "POST /mylimo/+/limoService.Driver%3D HTTP/1.1" 500 84 "http://localhost:2020/mylimo/+/limoService.Driver=" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11"
-------------- next part --------------
from zope.app import zapi
from zope.interface import implements
from zope.app.container.btree import BTreeContainer
from zope.app.container.contained import Contained
# from persistent import Persistent
from interfaces import ICar, IDriver, ILimoservice, ILimoserviceContained
class Car(Contained):
implements(ICar,ILimoserviceContained)
model=u''
nPassengers=0
class Driver(Contained):
implements(IDriver,ILimoserviceContained)
car=None
class Limoservice(BTreeContainer):
implements(ILimoservice)
class CarView(object):
def message(self):
return 'car model %s holds %d passengers' % (self.context.model, self.context.nPassengers)
class DriverView(object):
def message(self):
if self.context.car:
car=self.context.car
msg='driver drives car model %s, can carry %d passengers' % (car.model,car.nPassengers)
else:
print 'driver has no car!'
msg='no car info'
return msg
from zope.formlib import form
class CarEdit(form.EditForm):
form_fields = form.Fields(ICar)
class DriverEdit(form.EditForm):
form_fields = form.Fields(IDriver)
class CarAddForm(form.AddForm):
form_fields = form.Fields(ICar)
def create(self,data):
obj=Car()
form.applyChanges(obj, self.form_fields, data)
return obj
class DriverAddForm(form.AddForm):
form_fields = form.Fields(IDriver)
def create(self,data):
obj=Driver()
form.applyChanges(obj, self.form_fields, data)
return obj
from zope.schema.vocabulary import SimpleVocabulary
def carsInParent(context):
'''returns child cars __name__ for subobjects of parent as a vocabulary'''
return SimpleVocabulary.fromItems(
[(k, v) for k, v in context.__parent__.items() if ICar.providedBy(v)])
-------------- next part --------------
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="limoService"
>
<interface
interface=".interfaces.ICar"
type="zope.app.content.interfaces.IContentType"
/>
<interface
interface=".interfaces.IDriver"
type="zope.app.content.interfaces.IContentType"
/>
<class class=".classes.Car">
<implements
interface="zope.annotation.interfaces.IAttributeAnnotatable"
/>
<factory
id="limoService.classes.Car"
description="a car"
/>
<require
permission="zope.Public"
interface=".interfaces.ICar"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.ICar"
/>
</class>
<class class=".classes.Driver">
<implements
interface="zope.annotation.interfaces.IAttributeAnnotatable"
/>
<factory
id="limoService.classes.Driver"
description="a driver"
/>
<require
permission="zope.Public"
interface=".interfaces.IDriver"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.IDriver"
/>
</class>
<browser:addMenuItem
class=".classes.Car"
title="a car"
view=".Car"
permission="zope.ManageContent"
description="add Car"
/>
<browser:addMenuItem
class=".classes.Driver"
title="a driver"
view=".Driver"
permission="zope.ManageContent"
description="add Driver"
/>
<browser:page
for="zope.app.container.interfaces.IAdding"
name=".Car"
class=".classes.CarAddForm"
permission="zope.ManageContent"
/>
<browser:page
for="zope.app.container.interfaces.IAdding"
name=".Driver"
class=".classes.DriverAddForm"
permission="zope.ManageContent"
/>
<browser:page
for=".interfaces.ICar"
name="index.html"
class=".classes.CarView"
permission="zope.Public"
template="read.pt"
menu="zmi_views" title="view"
/>
<browser:page
for=".interfaces.IDriver"
name="index.html"
class=".classes.DriverView"
permission="zope.Public"
template="read.pt"
menu="zmi_views" title="view"
/>
<browser:page
for=".interfaces.ICar"
name="edit.html"
class=".classes.CarEdit"
permission="zope.ManageContent"
template="edit.pt"
menu="zmi_views" title="edit"
/>
<browser:page
for=".interfaces.IDriver"
name="edit.html"
class=".classes.DriverEdit"
permission="zope.ManageContent"
template="edit.pt"
menu="zmi_views" title="edit"
/>
<utility
provides="zope.schema.interfaces.IVocabularyFactory"
component=".classes.carsInParent"
name="allCars"
/>
<interface
interface=".interfaces.ILimoservice"
type="zope.app.content.interfaces.IContentType"
/>
<class class=".classes.Limoservice">
<implements
interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
/>
<implements
interface="zope.app.container.interfaces.IContentContainer"
/>
<factory
id="limoService.classes.Limoservice"
description="Limoservice"
/>
<require
permission="zope.ManageContent"
interface=".interfaces.ILimoservice"
/>
<require
permission="zope.ManageContent"
set_schema=".interfaces.ILimoservice"
/>
</class>
<browser:addMenuItem
class=".classes.Limoservice"
title="Limoservice"
permission="zope.ManageContent"
/>
<browser:containerViews
for="limoService.interfaces.ILimoservice"
index="zope.View"
contents="zope.View"
add="zope.ManageContent"
/>
</configure>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope3-users/attachments/20080115/8df48752/edit.htm
-------------- next part --------------
from zope.interface import Interface
from zope.schema import Field, Text, TextLine, Choice, Int, Bool, Date, Datetime, Object
from zope.schema.vocabulary import SimpleVocabulary
from zope.app.container.constraints import ContainerTypesConstraint
from zope.app.container.constraints import ItemTypePrecondition
from zope.app.container.interfaces import IContained, IContainer
class ICar(Interface):
model = TextLine(
title = u'model',
description = u'model',
default = u'',
required = False)
nPassengers = Int(
title = u'nPassengers',
description = u'nPassengers',
default = 0,
required = False)
class IDriver(Interface):
car = Choice(
title = u'car',
description = u'car',
default = None,
source = 'allCars',
required = False)
class ILimoservice(IContainer):
'''container for items of type ICar, IDriver'''
name = TextLine(
title=u'Limoservice',
description=u'a Limoservice container',
default=u'',
required=True)
def __setitem__(name, obj): pass
__setitem__.precondition = ItemTypePrecondition(ICar, IDriver)
class ILimoserviceContained(IContained):
'''for types that can only be contained in a Limoservice'''
__parent__ = Field(constraint = ContainerTypesConstraint(ILimoservice))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.zope.org/pipermail/zope3-users/attachments/20080115/8df48752/read.htm
More information about the Zope3-users
mailing list