[Zope3-dev] How to provide some default utilities for sub-site
Dominik Huber
dominik.huber at perse.ch
Fri Nov 4 10:28:13 EST 2005
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: dominik.huber at perse.ch
Telefon: ++41 56 534 7730
-------------- next part --------------
##############################################################################
#
# 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)
-------------- next part --------------
A non-text attachment was scrubbed...
Name: dominik.huber.vcf
Type: text/x-vcard
Size: 154 bytes
Desc: not available
Url : http://mail.zope.org/pipermail/zope3-dev/attachments/20051104/4135fd14/dominik.huber.vcf
More information about the Zope3-dev
mailing list