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):

----8<----

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))
    object.setSiteManager(sm)
    old_site = zope.app.component.hooks.getSite()
    zope.app.component.hooks.setSite(object)
    try:
# XXX build your tools in the site manager here, and do other configuration
    finally:
        zope.app.component.hooks.setSite(old_site)

----8<----

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)

Whew!

Hope that helps

Gary
_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to