[Zope3-Users] Fields for file and images
    James Allwyn 
    jamesallwyn at gmail.com
       
    Mon Oct 24 08:32:33 EDT 2005
    
    
  
I too have been getting "UnpickleableError" while playing with ObjectWidgets.
I've been working from some code posted by Christian Lueck (Fri, 26
Aug 2005, subject "[Zope3-Users] zope.schema.Object - Object of
Objects").
Christian's example had an object "Nonsens Article", which included a
sub-object "Article", which itself included a couple of further
sub-objects, "Person" and "Pages"). I slimmed this down to just two
layers - "Article" and its sub-objects (i.e. I stripped out the
Nonsens Article super-object).
(Code follows at end)
Now, creating an Article works fine. Editing it works fine. But
deleting it after Editing causes the error:
Exception Type
UnpickleableError
Exception Value
Cannot pickle <type 'zope.security._proxy._Proxy'> objects
If I restart Zope after editing the Article I can delete it.
Any suggestions on how to tackle this? Unlike the poll example that
Johan was working from, Christian's 'objectsofobjects' demo does not
include get and set methods - is it recommended to introduce them to
use removeSecurityProxy stripping to handle this?
Thanks,
James
Code
----
Below is the code (adapted from Christian's objectsofobjects demo).
interfaces.py
------------------
from zope.interface import Interface
from zope.schema import TextLine, Int, Object
class IPerson(Interface):
    lastname = TextLine(
        title=u"Lastname",
        description=u"Please give the lastname.",
        required=False)
    firstname = TextLine(
        title=u"Firstname",
        description=u"Please give the firstname.",
        required=False)
class IPages(Interface):
    start = Int(
        title=u"Start page",
        description=u"Please give the start page.",
        required=False)
    end = Int(
        title=u"End page",
        description=u"Please give the end page.",
        required=False)
class IArticle(Interface):
    author = Object(
        schema=IPerson,
        title=u"Author",
        description=u"The author of the article.",
        required=False)
    title = TextLine(
        title=u"Article title",
        description=u"Please give the title of the article.",
        required=False)
    pages = Object(
        schema=IPages,
        title=u"Pages",
        description=u"Start and end page of the article.",
        required=False)
article.py
-------------
from zope.interface import implements
from interfaces import IPerson, IPages, IArticle
from zope.schema.fieldproperty import FieldProperty
class Person:
    """The Person object."""
    implements(IPerson)
class Pages:
    """The Pages object."""
    implements(IPages)
class Article:
    """The article object."""
    pages = FieldProperty(IArticle['pages'])
    author = FieldProperty(IArticle['author'])
    implements(IArticle)
widget.py
--------------
from zope.app.form.browser.editview import EditView
from zope.app.form import CustomWidgetFactory
from zope.app.form.browser import ObjectWidget
from interfaces import IArticle
from article import Person, Pages, Article
class ArticleEditView(EditView):
    __used_for__ = IArticle
    author_widget = CustomWidgetFactory(ObjectWidget, Person)
    pages_widget = CustomWidgetFactory(ObjectWidget, Pages)
configure.zcml
----------------------
<configure
    xmlns='http://namespaces.zope.org/zope'
    xmlns:browser='http://namespaces.zope.org/browser'>
  <content class=".article.Person">
    <require
        permission="zope.View"
    interface=".interfaces.IPerson"
    />
    <require
        permission="zope.ManageContent"
    set_schema=".interfaces.IPerson"
    />
  </content>
  <content class=".article.Pages">
    <require
        permission="zope.View"
    interface=".interfaces.IPages"
    />
    <require
        permission="zope.ManageContent"
    set_schema=".interfaces.IPages"
    />
  </content>
  <content class=".article.Article">
    <require
        permission="zope.View"
    interface=".interfaces.IArticle"
    />
    <require
        permission="zope.ManageContent"
    set_schema=".interfaces.IArticle"
    />
  </content>
  <browser:editform
      label="Change article data"
      name="edit.html"
      schema=".interfaces.IArticle"
      class=".widget.ArticleEditView"
      menu="zmi_views"
      title="Edit"
      permission="zope.ManageContent"
      />
  <browser:addform
      label="Add an article"
      name="AddArticle.html"
      schema=".interfaces.IArticle"
      class=".widget.ArticleEditView"
      content_factory=".article.Article"
      permission="zope.ManageContent"
      />
  <browser:addMenuItem
      title="Article"
      class=".article.Article"
      permission="zope.ManageContent"
      view="AddArticle.html"
      />
</configure>
On 20/10/05, Johan Carlsson <johanc at easypublisher.com> wrote:
> Johan Carlsson wrote:
>
> For anyone that might be interested in the update to my code (still only
> parsely working):
>
> > Here is my code (which uses the Poll as base, that stuff has been
> > removed though):
> >
> > interfaces.py:
> >
> >   from zope.interface import Interface
> >   from zope.schema import Object
> >   from zope.app.file.interfaces import IFile
>
> from zope.security.proxy import removeSecurityProxy
>
> >   from zope.i18n import MessageIDFactory
> >   _ = MessageIDFactory('poll')
> >
> >   class IPoll(Interface):
> >
> >       file=Object(IFile, title=_('File'))
> >
> > poll.py:
> >
> >   from persistent import Persistent
> >   from interfaces import IPoll
> >   from zope.interface import implements, classImplements
> >   from zope.app.file.file import File
> >
> >   class Poll(Persistent, object):
> >       implements(IPoll)
> >
>
>          def get_file(self):
>              return self._file
>
>          def set_file(self, file):
>              self._file = removeSecurityProxy(file)
>
>          file = property(get_file, set_file, None, 'fiddle file')
>
>
> >
> > browser.py:
> >
> >   from zope.interface import implements
> >   from zope.app.form.browser.editview import EditView
> >   from zope.app.form.browser.add import AddView
> >   from zope.app.form import CustomWidgetFactory
> >   from zope.app.form.browser import ObjectWidget
> >
> >   from interfaces import IPoll
> >
> >
> >   from zope.app.file.file import File
> >
> >   fw = CustomWidgetFactory(ObjectWidget, File)
> >
> >   class PollEditView(EditView):
> >       __used_for__ = IPoll
> >
> >       file_widget = fw
> >
> >   class PollAddView(AddView):
> >       __used_for__ = IPoll
> >
> >       file_widget = fw
> >
> > configure.zcml:
> >
> > <configure xmlns="http://namespaces.zope.org/zope"
> >     xmlns:browser="http://namespaces.zope.org/browser"
> >     i18n_domain="poll">
> >
> >   <content class=".poll.Poll">
> >   <factory id="zope.app.demo.poll2" />
> >
> >   <implements
> >     interface="zope.app.annotation.interfaces.IAttributeAnnotatable"
> >     />
> >
> >   <require
> >     permission="zope.View"
> >     interface=".interfaces.IPoll"
> >     />
> >
> >   <require
> >     permission="zope.ManageContent"
> >     set_schema=".interfaces.IPoll"
> >     />
> >   </content>
> >
> >   <browser:addform
> >     schema=".interfaces.IPoll"
> >     label="Add a Poll"
> >     content_factory=".poll.Poll"
> >     name="AddPoll2.html"
> >     class=".browser.PollAddView"
> >     permission="zope.ManageContent" />
> >
> >   <browser:addMenuItem
> >     title="Poll 2 Demo"
> >     description="Poll 2 Demo"
> >     class=".poll.Poll"
> >     view="AddPoll2.html"
> >     permission="zope.ManageContent"
> >     />
> >
> >   <browser:editform
> >     schema=".interfaces.IPoll"
> >     class=".browser.PollEditView"
> >     label="Change a Poll"
> >     name="edit.html"
> >     menu="zmi_views" title="Edit"
> >     permission="zope.ManageContent" />
> > </configure>
> >
> >
> >
> >
>
>
> --
> Johan Carlsson          Tel: + 46 8 31 24 94
> Colliberty              Mob: + 46 70 558 25 24
> Torsgatan 72            Email: johanc at easypublisher.com
> SE-113 37 STOCKHOLM
>
>
> --
> Johan Carlsson          Tel: + 46 8 31 24 94
> Colliberty              Mob: + 46 70 558 25 24
> Torsgatan 72            Email: johanc at easypublisher.com
> SE-113 37 STOCKHOLM
>
> _______________________________________________
> Zope3-users mailing list
> Zope3-users at zope.org
> http://mail.zope.org/mailman/listinfo/zope3-users
>
    
    
More information about the Zope3-users
mailing list