[Zope3-dev] How to provide some default utilities for sub-site
Adam Groszer
adamg at fw.hu
Fri Nov 4 08:09:07 EST 2005
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,
Adam mailto:adamg at fw.hu
--
Quote of the day:
Destiny is not a matter of chance; it is a matter of choice. It is not something to be waited for; but, rather something to be achieved. (William Jennings Bryan)
More information about the Zope3-dev
mailing list