[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