[Grok-dev] indexes not getting updated for contents added via ApplicationInitializedEvent subscriber
Souheil CHELFOUH
trollfot at gmail.com
Wed Nov 28 22:36:28 UTC 2012
Hey Joshua,
You got that right, good work for getting that straight and working.
Thank you for the explanations, I hope it will help other people too !
- Souheil
2012/11/27 Joshua Immanuel <josh at hipro.co.in>:
> Hello list,
>
> On Mon, 2012-11-26 at 14:59 +0530, Joshua Immanuel wrote:
>> This is how my subscriber looks like
>>
>> @grok.subscribe(IMyRoot, grok.ApplicationInitializedEvent)
>> def cbAppRootAdded(app_root, event):
>> catalog = component.queryUtility(ICatalog,
>> context=app_root)
>> # catalog is not None
>> intids = component.queryUtility(
>> IIntIds, context=app_root, default=None)
>> # intids is also not None
>>
>> my_folder = MyFolder() # grok.Container object
>> my_default_object = MyObject(...) # grok.Model object
>> grok.notify(grok.ObjectCreatedEvent(my_default_object))
>> my_folder['default_object'] = my_default_object
>> app_root['my_folder'] = my_folder
>> transaction.commit()
>>
>> I even tried adding the default object via IObjectAddedEvent
>> subscriber for IMyFolder. Still, the indexes for MyObject were not
>> getting updated.
>
> I spoke to @trollfot in IRC channel, he was very patient and kind to
> answer my queries. This is the abstract of the talk. Please correct it,
> if I am wrong or if I have missed anything.
>
> Inside the subscriber of ApplicationInitializedEvent we can count on the
> fact that the local utilities such as Catalog and IntIds will be
> registered. As we know that the utilities are looked up in site manager,
> so during a traversal the registry lookups will be set to application
> root's ('MyRoot' as per the above example code) site manager. But,
> ApplicationInitializedEvent is triggered by Grok Admin, as our
> application is not yet traversed at that time, the current site manager
> at that point will be the global site manager. So, we won't be getting
> the local utilities registers for our IMyRoot. Thereby our indexes
> registered will not get updated if we add the object at that time.
>
> We need to instruct Grok to use the local site manager of our
> application root for lookups inside our subscriber code. Since IntIds
> requires that the object should be persisted in order to generate int
> ids. We need to add the 'my_folder' to app_root then add MyObject to it.
> So our modified code will look like this
>
> from zope.component.hooks import setSite, getSite
>
> @grok.subscribe(IKalam, grok.ApplicationInitializedEvent)
> def cbAppRootAdded(app_root, event):
> previous_sm = getSite()
> # Instruct Grok to use our app_root's local site manager
> setSite(app_root)
>
> my_folder = MyFolder() # grok.Container object
> # First persist the container object
> app_root['my_folder'] = user_folder
> my_default_object = MyObject(...) # grok.Model object
> # Persist our object so that IntIds can be generated
> my_folder['default_object'] = my_default_object
> transaction.commit()
> # restore back to original site manager
> setSite(previous_sm)
>
> The above code works perfectly. I would like to thank @trollfot for his
> time and help.
> --
> Joshua Immanuel
> HiPro IT Solutions Private Limited
> http://hipro.co.in
>
> _______________________________________________
> Grok-dev mailing list
> Grok-dev at zope.org
> https://mail.zope.org/mailman/listinfo/grok-dev
>
More information about the Grok-dev
mailing list