[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