On Sep 27, 2005, at 10:01 PM, Tom Dossis wrote:

1. How do I add a catalog to a site ?

Hi Tom. Looks like you might have already worked yourself out of this, but I'll respond for the list, at least.

If you are creating and configuring a site programmatically within a single transaction, and adding multiple tools, some of which depend on the others, then you typically need to do a setSite dance around the whole thing. For instance (and there are many variations, such as creating a site then letting event subscribers respond, but here's a simple case):


import zope.app.component.hooks # I believe this location is slated for improvement
import zope.event
import zope.app.event.objectevent

def makesite(container, name):
    object = MySiteFactory()
zope.event.notify(zope.app.event.objectevent.ObjectCreatedEvent (object))
    container[name] = object
    sm = zope.app.component.site.LocalSiteManager(object)
zope.event.notify(zope.app.event.objectevent.ObjectCreatedEvent (sm))
    old_site = zope.app.component.hooks.getSite()
# XXX build your tools in the site manager here, and do other configuration


Moreover, you may also need direction in adding local utilities. The general pattern is this. This also may be slated for improvement, like the location for the getSite/setSite import above.

Given an object that is a site (i.e., has a site manager):
- get the site manager (sm = site.getSiteManager())
- get the package into which you want to add the utility (pkg = sm ['default'])
- create the utility
- fire off a creation event, as illustrated in code above
- get a name chooser for the package and ask it to choose a name for the utility (name_in_package = zope.app.container.interfaces.INameChooser(package).chooseName (suggested_name, utility))
- add it to the package (pkg[name_in_container] = utility)
- make a utility registration for name and interface you are going to look up the utility with--note this is usually *not* the name_in_package above (reg = zope.app.utility.UtilityRegistration (name, interface, utility)) - add the registration to the package's registration manager (pkg.registrationManager.addRegistration(reg)) - make the registration active (reg.status = zope.app.component.interfaces.registration.ActiveStatus)


Hope that helps

Zope3-users mailing list

Reply via email to