[Grok-dev] Re: Grok ORM with Storm

Martijn Faassen faassen at startifact.com
Tue Jan 22 14:38:34 EST 2008


Hey,

This is some feedback; note that I have no actual experience using Storm 
yet so I might be wrong about some things.

In general we try to use a combination of grokkable base classes and 
grok directives on those classes to set meta information.

Christian Klinger wrote:
[snip]
> 
> 1. SMASH ZCML
> --------------
> 
> In the package zope.storm it´s necesarry to define a store in zcml.
> I think we can SMASH this zcml-slug.
> 
>   <store name="contact" uri="sqlite:/tmp/contact.db"/>

Yes, I imagine we can turn this into something like:

class MyStore(megrok.storm.Store):
    grok.name('contact')
    grok.uri('sqlite:/tmp/contact.db')

This would introduce a new grok.uri directive. I don't know whether this 
would have a lot of other uses. Perhaps 
megrok.storm.connectionid('sqlite:/tmp/contact.db') instead.

> 2. Make the grok config in our grok.Model easier:
> -------------------------------------------------
> 
> This is the example Model of the Howto [2]:
> 
>   class Contact(grok.Model, Storm):
>       grok.implements(IContact)
>       __storm_table__ = "Contacts"
> 
>       id = Int(primary=True)
>       name = Unicode()
>       city = Unicode()
> 
> Maybe we can do something like megrok.storm.StormTable('Contacts') 
> instead of __storm_table__ = Contacts.

I think we might want to avoid subclassing grok.Model directly. Instead 
we'd need a way for the system to recognize models which are *not* 
subclasses of grok.Model as models. Then we could do:

This looks like a directive, so:

class Contact(megrok.storm.Model):
     grok.implements(IContact)
     megrok.storm.table('Contacts')

     id = Int(primary=True)
     name = Unicode()
     city = Unicode()

Alternatively we could even import Storm directly from Storm and write a 
grokker for them. It could recognize the megrok.storm.table() annotation 
and then stuff it in as __storm_table__.

> 3. The container config:
> ------------------------
> 
> This is the config of the Container in the Howto [2]:
> 
>   class contacts(StormContainer, grok.Application, grok.Container):
>       """ this application inherits from StormContainer too """
>       def __init__(self):
>           super(contacts, self).__init__()
>           self.setClassName('contacts.contact.Contact')
>           self.setStoreUtilityName('contact')
> 
> Maybe it´s possible to say megrok.storm.setClassName('xxx') and 
> megrok.storm.setStoreUtiltiyName('xxx')

I think grok.Container shouldn't be a mix-in here. Again we should have 
a system that can recognize grok.Container as a kind of model.

what about this?

from contacts.contact import Contact

class Contacts(megrok.storm.Container):
   megrok.storm.content(Contact) # or content_class, perhaps?

I don't know what setStoreUtilityName() does exactly, but we could use a 
similar directive:

   megrok.storm.storage('contact')

where 'contact' is the utility name. Why does the storm container need 
to know the storage but the storm model does not?

I think these can be set before the __init__() is called on the 
class-level, right? Or is there any reason for thesse settings to be 
dynamic?

> So i think i have to work on megrok.storm package which includes
> these simplifications.

Great!

> Please give me some feedback.

There you are. I tried to give some feedback to make the storm stuff 
more grok-like. Hopefully I'm not saying impossible things.

> 
> [1]http://stormcontainer.googlecode.com/svn/trunk/src/stormcontainer/
> [2]http://plone.grok.quintagroup.com/documentation/how-to/grok-orm-with-storm

You didn't publish the second link. I published it for you, I hope you 
don't mind.

Regards,

Martijn



More information about the Grok-dev mailing list