[Zope3-dev] How to provide some default utilities for sub-site

Adam Groszer adamg at fw.hu
Fri Nov 4 12:44:04 EST 2005


Hello Dominik,

Great, it's working. Thanks.


Friday, November 4, 2005, 4:28:13 PM, you wrote:

DH> Hi Adam

DH> First you have to assert that you object (obj) provides ISite. Then I
DH> would use the following attachted helper function `addLocalUtility` to
DH> add the your utiltiy. Least,  you could use multi-subscriber for events
DH> providing IObjectEvent, then you don't have to check for IApplication.
DH> Putting all together you get the following (unproved) registration and code:

DH>   <subscriber
DH>       handler=".app.App_boot"
DH>       for=".IApplication
DH> zope.app.container.interfaces.IObjectAddedEvent"
DH>       />

DH> def App_boot(obj, event):
DH>     if not ISite.providedBy(obj): 
DH>        helper.addSiteManager(obj)

DH>     helper.addLocalUtility(obj, 'wfu', 'WorkflowUtility', WorkflowUtility())

DH> Regards,
DH> Dominik

DH> 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')
>>>>
>>>> 
>>>>
>>>>      
>>>>
>>
>>
>>
>>
>>
>>  
>>




-- 
Best regards,
 Groszer Adam                            mailto:adi at alco.co.hu
--
Quote of the day:
Here is a test to see if your mission on earth is finished. If you are alive, it isn't. 
- Francis Bacon 



More information about the Zope3-dev mailing list