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
Zope3-dev@zope.org
Unsub: http://mail.zope.org/mailman/options/zope3-dev/archive%40mail-archive.com

Reply via email to