[Zope3-Users] Newbie question...

Thierry FLORAC tflorac at ulthar.net
Tue Mar 21 17:39:32 EST 2006


On Mon, 2006-03-20 at 19:02 -0500, Stephan Richter wrote:
> On Monday 20 March 2006 17:26, Thierry FLORAC wrote:
> > Actually, the only working way I found to update my annotations through
> > my adapters is always to use "form" directives with the help of a
> > support class using "getData/setData" methods which call the adapter
> > directly...
> 
> Can you post the code again, the one that is not working? Note that a 
> persistent dict is no good, since the form code tries to set an attribute and 
> not a mapping item.

You will find a copy of my previous post below.
I just hope I didn't forgot anything...

Thanks for any help,

  Thierry

---------------------------------------------------------------------

I've started to work a little more on this problem, and got a few
improvements but still a few "problems". In fact :
 - I can create my main content component correctly
 - I can see the adapter's "view form" into ZMI
 - I can select this view ; an empty annotations "PersistentDict" is
then immediately created as requested
 - but I can't update adapter's interface's properties : the "setData"
method is called, but the properties methods are not called when
"setData" is called. No error is displayed, and the form just display
request values that are "removed" as soon as the view is refreshed...

My code is in fact very simple :

    class IPhotoStorage:
        identifier = TextLine(...)
        hostname = TextLine(...)
        
    PhotoStorageKey = "http://www.ulthar.net/keys/storage"
        
    class PhotoStorage:
        implements(IPhotoStorage)
        adapts(IPhoto)
        
        def __init__ (self, context):
            self.context = self.__parent__ = context
            annotations = IAnnotations(context)
            data = annotations.get(PhotoStorageKey)
            if data is None:
                data = annotations[PhotoStorageKey] = PersistentDict()
            self._data = data
        
        def _getIdentifier (self):
            return self._data.get('identifier',None)
        
        def _setIdentifier (self, identifier):
            self._data['identifier'] = unicode(identifier)
            notify(ObjectModifiedEvent(self.context))
        
        identifier = property(_getIdentifier, _setIdentifier)
        
        [...then same code for "hostname" property...]
        
    class PhotoStorageHandler(object):
        
        def getData(self):
            result = {}
            result['identifier']= IPhotoStorage(self.context).identifier
            result['hostname'] = IPhotoStorage(self.context).hostname
            return result
        
        def setData(self, data):
            IPhotoStorage(self.context).identifier = data['identifier']
            IPhotoStorage(self.context).hostname = data['hostname']
            return u"Saved changes"
        

And here is my "main" configure.zcml part for the adapter :

        <adapter
                factory=".photo.PhotoStorage"
                provides=".interfaces.IPhotoStorage"
                for=".interfaces.IGalleryPhoto"
                trusted="true" />
        
        <class class=".photo.PhotoStorage">
                <require
                        permission="zope.View"
                        interface=".interfaces.IPhotoStorage" />
                <require
                        permission="zope.ManageContent"
                        set_schema=".interfaces.IPhotoStorage" />
        </class>

and finally my "browser" configure.zcml :

        <form
                name="storage.html"
                for=".interfaces.IGalleryPhoto"
                schema=".interfaces.IPhotoStorage"
                class=".forms.PhotoStorageHandler"
                fields="identifier hostname"
                label="Storage"
                permission="zope.ManageContent"
                menu="zmi_views" title="Storage" />

A few "print" instructions show that :
 - PhotoStorageHandler.setData is called correctly, but
 - PhotoStorage._setIdentifier is NOT called when setting "identifier"
property



-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.



More information about the Zope3-users mailing list