[Grok-dev] Re: Recipe for "egg-like" reuse?

Martijn Faassen faassen at startifact.com
Tue Apr 8 15:41:40 EDT 2008


Sebastian Ware wrote:
> 8 apr 2008 kl. 17.33 skrev Uli Fouquet:
>> If you want your AddApp to be registered completely, edit buildout.cfg
>> and register your additional app in the [app] section::
> 
> 
> I have come to the point where I can create an instance of my MasterApp 
> in the grok admin interface. However, the application won't find the 
> views I have in my AddApp, eventhough the application class of MasterApp 
> has inherited from a class of AddApp for which these views should be 
> registered (through grok.context).

I don't see evidence of this in your example: the Edit view is attached 
to the ProtonCMS model, which doesn't inherit from Navicast at all.

> MasterApp:
> 
> class Navicast(grok.Application, ProtonCMS):
> [snip]
> 
> AddApp:
> 
> class ProtonCMS(grok.Container):
> [snip]
> 
> class Edit(grok.EditForm, protonbase.ProtonEdit):
>     grok.context(ProtonCMS)
>     [snip]
> 
> And I would expect to be able to access the edit view through:
> 
>   http://localhost:8080/application/edit
> 
> But I get a "The page that you are trying to access is not available"

If you want to *extend* the MasterApp program from your AddApp program, 
you need to either share the class you extend, or the interface. You'll 
have to do either one of these:

AddApp:

from masterapp.app import Navicast

class Edit(...):
     grok.context(Navicast)

Or alternatively it might be time to start definining an interface in 
MasterApp and then expand that:

MasterApp:

from masterapp.interfaces import INavicast

class NaviCast(....)
     grok.implements(INavicast)

from masterapp.interfaces import INavicast

class Edit(...)
     grok.context(INavicast)

Grok has to know that you're extending the original application in some 
way. This can be done because you hook up things to the same interface 
or class. At some point, using explicit interfaces may start to be a win 
here, as you can explicitly define how your core can be expanded by an 
extension. In both cases your extension needs to know about your core 
(at least about its interfaces), but that's pretty natural since you're 
going to add views to it.

If you really want to start getting abstract you could create a third 
package that just defines the interfaces, then have your core implement 
it, and your extension expand them. They then don't need to explicitly 
refer to each other. As long as your extension only uses things defined 
in the interfaces, you can replace the core with another implementation 
with the same interface without having to change the extension at all. 
All this is probably overkill right now, though.

Regards,

Martijn



More information about the Grok-dev mailing list