Hey,<br><br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Cool! Could you share a bit of code on the list?</blockquote>
<div><br>Sure. but remember that I&#39;m a newbie<br><br>I just try to follow what you did on your post + the doctest on zope.sqlalchemy + the rdbexample with collective.lead from the branch<br><br>this code depends on zope.sqlalchemy, SQLAlchemy&gt;=0.4.6, psycopg2 and a PstgreSQL database up and running of course (make sure to override the _URL string).<br>
<br>*** it was a long day for me, please let me know if this doesn&#39;t work. It&#39;s possible that I missed something<br><br>[app.py]<br><br>import grok<br><br>from sqlalchemy import *<br>from sqlalchemy.ext.declarative import declarative_base<br>
from sqlalchemy.orm import scoped_session, sessionmaker, relation<br>from zope.sqlalchemy import ZopeTransactionExtension, invalidate<br>import transaction<br><br>from models import *<br><br>_URL = &#39;postgres://grok:grok@localhost/grok&#39;<br>
<br>engine = create_engine(_URL, convert_unicode=True)<br>Base.metadata.create_all(engine)<br><br>Session = scoped_session(sessionmaker(bind=engine,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; twophase=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; transactional=True,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autoflush=True,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extension=ZopeTransactionExtension()))<br><br>class RDBExample(grok.Application, grok.Model):<br>&nbsp;&nbsp;&nbsp; def traverse(self, name):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Session().query(User).filter(User.name == name).first()<br><br>class Index(grok.View):<br>&nbsp;&nbsp;&nbsp; grok.context(RDBExample)<br>&nbsp;&nbsp;&nbsp; def render(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = &quot;Users on grok data base \n&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for user in Session().query(User).all():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += &#39;User: %s \n&#39; % <a href="http://user.name">user.name</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result<br><br>class UserView(grok.View):<br>&nbsp;&nbsp;&nbsp; <a href="http://grok.name">grok.name</a>(&#39;index&#39;)<br>
&nbsp;&nbsp;&nbsp; grok.context(User)<br><br>&nbsp;&nbsp;&nbsp; def render(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;You are over user: %s \n&quot; % <a href="http://self.context.name">self.context.name</a><br><br>class AddUser(grok.AddForm):<br>&nbsp;&nbsp;&nbsp; grok.context(RDBExample)<br>
<br>&nbsp;&nbsp;&nbsp; @property<br>&nbsp;&nbsp;&nbsp; def form_fields(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return grok.Fields(IUser)<br><br>&nbsp;&nbsp;&nbsp; @grok.action(&#39;add&#39;)<br>&nbsp;&nbsp;&nbsp; def handle_add(self, *args, **kw):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user = User(**kw)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session().save(user)<br>
<br><br>[models.py]<br><br>import grok<br>from sqlalchemy.ext.declarative import declarative_base<br>from sqlalchemy import *<br>from sqlalchemy.orm import relation<br><br>from interfaces import IUser, IAddress<br><br>Base = declarative_base()<br>
<br>class User(Base,grok.Model):<br><br>&nbsp;&nbsp;&nbsp; grok.implements(IUser)<br><br>&nbsp;&nbsp;&nbsp; __tablename__ = &#39;test_users&#39;<br>&nbsp;&nbsp;&nbsp; id = Column(Integer, primary_key=True)<br>&nbsp;&nbsp;&nbsp; name = Column(String(50))<br>&nbsp;&nbsp;&nbsp; addresses = relation(backref=&quot;user&quot;)<br>
<br>class Address(Base, grok.Model):<br><br>&nbsp;&nbsp;&nbsp; grok.implements(IAddress)<br><br>&nbsp;&nbsp;&nbsp; __tablename__ = &#39;test_addresses&#39;<br>&nbsp;&nbsp;&nbsp; id = Column(Integer, primary_key=True)<br>&nbsp;&nbsp;&nbsp; email = Column(String(50))<br>&nbsp;&nbsp;&nbsp; user_id = Column(Integer, ForeignKey(&#39;<a href="http://test_users.id">test_users.id</a>&#39;))<br>
<br><br>[interfaces.py]<br><br>from zope import schema<br>from zope.interface import Interface<br><br>class IUser(Interface):<br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; name = schema.TextLine(title=u&quot;Name&quot;)<br>
<br>class IAddress(Interface):<br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br><br>I noticed that in the rdbexample branch that I was to following, there is a method on megrok.rdb that translate the model table to a schema to make the addForm. I used the interfaces instead, because when I try to make a form of a sub-class (i.e: &quot;&quot;&quot;class SpecialUser(User)&quot;&quot;&quot; )<br>
the method just shows the columns on the SpecialUser&#39;s table, but doesn&#39;t show anything from the User&#39;s table.<br><br>Is this a good practice? or should I modify the method on megrok.rdb???<br><br><br>Regards<br>
&nbsp;</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
Regards,<br><font color="#888888">
<br>
Martijn</font><div><div></div><div class="Wj3C7c"><br>
<br>
_______________________________________________<br>
Grok-dev mailing list<br>
<a href="mailto:Grok-dev@zope.org" target="_blank">Grok-dev@zope.org</a><br>
<a href="http://mail.zope.org/mailman/listinfo/grok-dev" target="_blank">http://mail.zope.org/mailman/listinfo/grok-dev</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Santiago Videla<br><a href="http://www.revolucionesweb.com.ar">www.revolucionesweb.com.ar</a><br><a href="http://www.linkedin.com/in/svidela">http://www.linkedin.com/in/svidela</a><br>
<br>Sigue la mata dando de que hablar siempre abajo y a la izquierda donde el pensamiento que se hace corazón resplandece con la palabra sencilla y humilde que l@s tod@s somos.