Hi Adam
First you have to assert that you object (obj) provides ISite. Then I
would use the following attachted helper function `addLocalUtility` to
add the your utiltiy. Least, you could use multi-subscriber for events
providing IObjectEvent, then you don't have to check for IApplication.
Putting all together you get the following (unproved) registration and code:
<subscriber
handler=".app.App_boot"
for=".IApplication zope.app.container.interfaces.IObjectAddedEvent"
/>
def App_boot(obj, event):
if not ISite.providedBy(obj):
helper.addSiteManager(obj)
helper.addLocalUtility(obj, 'wfu', 'WorkflowUtility', WorkflowUtility())
Regards,
Dominik
Adam Groszer wrote:
Hello Dominik,
I tried it using a subscriber.
<subscriber
handler=".app.App_boot"
for="zope.app.container.interfaces.IObjectAddedEvent"
/>
def App_boot(event):
# precondition
obj = event.object
if not IApplication.providedBy(obj):
return
ensureUtility(obj, IWorkflowProcessRepository,
'WorkflowProcessRepository', WorkflowProcessRepository, '')
ensureUtility(obj, IWorkflowUtility,
'WorkflowUtility', WorkflowUtility, 'wfu')
It works, but it adds the utilities to the global site manager :-(
If the behavior is OK this way, then why do I have to pass the
root_folder? I don't really get it.
If I start to go my own way and copy+modify the
zope.app.appsetup.bootstrap.py:
def getSiteManagerDefault(root_folder):
sm = root_folder.getSiteManager()
#default = zapi.traverse(folder.getSiteManager(), 'default')
#package_name = '/++etc++site/default'
#package = traverse(root_folder, package_name)
package_name = 'default'
package = traverse(sm, package_name)
return package
then it is working. The 2 utilities land in the local site manager.
Friday, November 4, 2005, 12:48:57 PM, you wrote:
Hi Adam
You need location information (-> __parent__) for this setup. Regularly
the object knows that information not until its addition to a container.
Subscribe to ObjectAdded event and do the same setup within the handler
and it will work.
Regards,
Dominik
Adam Groszer wrote:
I'd like to provide some default utilities for my sub-site.
As I checked there is the nice ensureUtility method but as it turns
out it failes with
...
Module szscreen.app, line 339, in __init__
'WorkflowUtility', WorkflowUtility, 'wfu')
Module zope.app.appsetup.bootstrap, line 66, in ensureUtility
name, **kw
Module zope.app.appsetup.bootstrap, line 74, in addConfigureUtility
utility_name = addUtility(root_folder, utility_type, utility_factory, **kw)
Module zope.app.appsetup.bootstrap, line 83, in addUtility
package = getSiteManagerDefault(root_folder)
Module zope.app.appsetup.bootstrap, line 105, in getSiteManagerDefault
package = traverse(root_folder, package_name)
Module zope.app.traversing.api, line 96, in traverse
return traverser.traverse(path, request=request)
Module zope.app.traversing.adapters, line 120, in traverse
curr = IPhysicallyLocatable(self.context).getRoot()
Module zope.app.location.traversing, line 90, in getRoot
raise TypeError("Not enough context to determine location root")
TypeError: Not enough context to determine location root
when it checks the existence of the utility it uses
sm = root_folder.getSiteManager()
but when it wants to add the non existing utility
package = getSiteManagerDefault(root_folder)
which in turn wants to traverse like this
package_name = '/++etc++site/default'
package = traverse(root_folder, package_name)
Is there any way to easily solve the task?
Excerpt from szscreen.app:
class IApplication(IReadContainer, IPossibleSite, IAttributeAnnotatable):
""
class Application(Persistent, SampleContainer, SiteManagerContainer):
implements(IApplication)
def __init__(self):
SampleContainer.__init__(self)
sm = LocalSiteManager(self)
self.setSiteManager(sm)
...
ensureUtility(self, IWorkflowUtility,
'WorkflowUtility', WorkflowUtility, 'wfu')
--
Dominik Huber
Perse Engineering GmbH
Jurastrasse 9a
CH-5406 Baden
E-Mail: [EMAIL PROTECTED]
Telefon: ++41 56 534 7730
##############################################################################
#
# Copyright (c) 2003, 2004, 2005 Projekt01 GmbH and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Tiks for Zope 3: Package tiks.site.helper.
$Id: helper.py 31 2005-08-29 14:18:03Z dominik.huber $
"""
__docformat__ = 'restructuredtext'
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 IPossibleSite
from zope.app.component.interfaces import ISite
from zope.app.component.site import LocalSiteManager
from zope.app.utility import UtilityRegistration
def addSiteManager(possiblesite):
"""Extend a possible site to a site."""
# preconditions
if not IPossibleSite.providedBy(possiblesite) or
ISite.providedBy(possiblesite):
raise TypeError('IPossibleSite required.')
# essentials
sm = LocalSiteManager(possiblesite)
possiblesite.setSiteManager(sm)
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)
try:
default[folder_name] = utility
except Exception, e:
# TODO: raise exception
print 'XXX', e # adapt to IReference Error
# 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)
begin:vcard
fn:Dominik Huber
n:Huber;Dominik
email;internet:[EMAIL PROTECTED]
tel;work:++41 56 534 77 30
x-mozilla-html:FALSE
version:2.1
end:vcard
_______________________________________________
Zope3-dev mailing list
[email protected]
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com