[Zope3-Users] Re: Creating objects in software space when making site

Andreas Elvers andreas at work.de
Tue Mar 7 04:05:09 EST 2006


Florian Lindner wrote:
> Hello,
> my content object depends on a number of utilities to be present. It is 
> usually also used as a site. During development it happens often that I 
> delete and recreate it.
> Can I install a hook or something so I can make that these utilies are being 
> created when my objects becomes a site? How do I create utitlies in software 
> space?

Hi,

I'm creating a special add view of my application (). If you add a foo
it will be created with a LocalSiteManager and a catalog. Hope this
helps.

Any other ways of doing this ?

- Andreas

in your browser configure:

<configure
   xmlns="http://namespaces.zope.org/browser">

   <addform
     label="Add foo with initialization"
     name="AddMyContent.html"
     class=".foo.AddFoo"
     schema="myapp.interfaces.IFoo"
     content_factory="myapp.foo.Foo"
     fields="name"
     permission="zope.ManageContent"
     />
...
</configure>

Now create the view class you defined in the browser configure.zcml 
inside foo.py:

from zope.app import zapi
from zope.proxy import removeAllProxies
from zope.app.component import site
from zope.app.catalog.catalog import Catalog
from zope.app.catalog.interfaces import ICatalog
from zope.app.event.objectevent import ObjectCreatedEvent
from zope.event import notify
from myapp.helper import addLocalUtility

class Foo(object):
    class AddFoo(object):
     """ Add a foo.
     This special addform class is needed to add special initialization. 
(Catalog init)
     """

     def createAndAdd(self,data):
         content = super(AddFoo, self).createAndAdd(data)
         # get foo object, stripping off security proxy
         bare = removeAllProxies(content)
         # create a LocalSiteManager
         sm = site.LocalSiteManager(bare)
         # and assign it to Labor folder
         content.setSiteManager(sm)

         # Catalog setup

         cat = Catalog()
         addLocalUtility(bare,'fooCatalog',
                         ICatalog,
                         cat)
         notify(ObjectCreatedEvent(cat))

I found addLocalUtility somewhere in the zope mailing lists.

from zope.app import zapi
from zope.app.container.interfaces import INameChooser
from zope.app.component.interfaces.registration import ActiveStatus
from zope.app.component.interfaces import ISite
from zope.app.utility import UtilityRegistration

def addLocalUtility(site, name, iface, utility, package='default'):
     """Add a utility to a site

     The utility is added to the package and activated.
     This assumes the site has already a Utility Service.
     """

     # preconditions
     if not ISite.providedBy(site):
         raise TypeError('ISite required.')

     # get site manager and site management folder
     sitemanager = site.getSiteManager()
     default = sitemanager[package]

     # add utility to site management folder
     chooser = INameChooser(default)
     folder_name = chooser.chooseName(utility.__name__, utility)
     default[folder_name] = utility

     # create service registration
     path = zapi.getPath(utility)
     registration = UtilityRegistration(name, iface, utility)
     key = default.registrationManager.addRegistration(registration)
     zapi.traverse(default.registrationManager, key).status = ActiveStatus

     return zapi.traverse(sitemanager, path)



More information about the Zope3-users mailing list