[Checkins] SVN: grokapps/rdbexample/trunk/ More non-working code. Right now Zope tries to start and then hangs.

Martijn Faassen faassen at infrae.com
Fri May 2 11:34:01 EDT 2008


Log message for revision 86103:
  More non-working code. Right now Zope tries to start and then hangs.
  

Changed:
  U   grokapps/rdbexample/trunk/buildout.cfg
  U   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/db.py
  A   grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/interfaces.py
  U   grokapps/rdbexample/trunk/src/rdbexample/app.py

-=-
Modified: grokapps/rdbexample/trunk/buildout.cfg
===================================================================
--- grokapps/rdbexample/trunk/buildout.cfg	2008-05-02 15:30:39 UTC (rev 86102)
+++ grokapps/rdbexample/trunk/buildout.cfg	2008-05-02 15:34:01 UTC (rev 86103)
@@ -1,10 +1,10 @@
 [buildout]
-develop = . megrok.rdb collective.lead
+develop = . megrok.rdb collective.lead grok
 parts = app data zopectl i18n test
 find-links = http://download.zope.org/distribution/
 eggs-directory = /home/faassen/buildout-eggs
 newest = false
-extends= http://grok.zope.org/releaseinfo/grok-0.12.cfg
+extends= grok/versions.cfg
 versions = versions
 
 [app]

Modified: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py	2008-05-02 15:30:39 UTC (rev 86102)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/__init__.py	2008-05-02 15:34:01 UTC (rev 86103)
@@ -0,0 +1,3 @@
+from megrok.rdb.components import Model, Container
+from megrok.rdb.db import Database
+

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/components.py	2008-05-02 15:34:01 UTC (rev 86103)
@@ -0,0 +1,28 @@
+from sqlalchemy.ext.declarative import DeclarativeMeta
+from sqlalchemy.orm.collections import MappedCollection
+from sqlalchemy.schema import MetaData
+
+from zope.interface import implements
+
+from grokcore.component import Context
+from zope.app.container.interfaces import IContainer
+
+_lcl_metadata = MetaData()
+
+class Model(Context):
+    __metaclass__ = DeclarativeMeta
+    metadata = _lcl_metadata
+    _decl_class_registry = {}
+
+    def __init__(self, **kwargs):
+        for k in kwargs:
+            if not hasattr(type(self), k):
+                raise TypeError('%r is an invalid keyword argument for %s' %
+                                (k, type(self).__name__))
+            setattr(self, k, kwargs[k])
+    
+class Container(Context, MappedCollection):
+    implements(IContainer)
+
+    def __init__(self, *args, **kw):
+        MappedCollection.__init__(self, keyfunc=lambda node:node.id)

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/db.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/db.py	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/db.py	2008-05-02 15:34:01 UTC (rev 86103)
@@ -0,0 +1,27 @@
+import grok
+
+from collective.lead import Database as DatabaseBase
+from collective.lead.interfaces import IDatabase
+
+from megrok.rdb.components import Model
+from megrok.rdb.interfaces import IDatabase as IRdbDatabase
+
+class Database(grok.GlobalUtility, DatabaseBase):
+    grok.implements(IRdbDatabase)
+    grok.provides(IDatabase)
+    grok.name('megrok.rdb')
+    grok.baseclass()
+
+    @property
+    def _url(self):
+        # XXXX missing 'url' gets turned into an AttributeError for `_url`
+        # instead of `url`, which sucks.
+        return self.url
+    
+    def _setup_tables(self, metadata, tables):
+        self.metadata = metadata = Model.metadata
+        Model.metadata.create_all(self._engine)
+        self.setup(metadata)
+
+    def setup(self, metadata):
+        pass

Added: grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/interfaces.py
===================================================================
--- grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/interfaces.py	                        (rev 0)
+++ grokapps/rdbexample/trunk/megrok.rdb/src/megrok/rdb/interfaces.py	2008-05-02 15:34:01 UTC (rev 86103)
@@ -0,0 +1,35 @@
+from zope.interface import Interface, Attribute
+
+from zope.app.container.interfaces import IContainer as IContainerBase
+
+
+class IContainer(IContainerBase):
+    def set(value):
+        """Add a new value to the container without having to specify the key.
+
+        Lets the container figure out an appropriate key.
+
+
+        Defined by SQLAlchemy dictionary-based collections.
+        """
+
+    def remove(value):
+        """Remove a value from the container, by value.
+
+        
+        Defined by SQLAlchemy dictionary-based collections.
+        """
+
+class IDatabase(Interface):
+    # you have to implement this attribute to set up the connection URL
+    url = Attribute(u"The connection URL of the database.")
+
+    def setup(metadata):
+        """Extra setup the database if required.
+
+        Implement this method if you want to do extra setup for the database.
+        
+        The declarative base classes Model and Container already get set
+        up automatically, but you may want to add extra tables and ORM mappers
+        in this method.
+        """

Modified: grokapps/rdbexample/trunk/src/rdbexample/app.py
===================================================================
--- grokapps/rdbexample/trunk/src/rdbexample/app.py	2008-05-02 15:30:39 UTC (rev 86102)
+++ grokapps/rdbexample/trunk/src/rdbexample/app.py	2008-05-02 15:34:01 UTC (rev 86103)
@@ -1,23 +1,29 @@
 import grok
 from megrok import rdb
-from sqlalchemy.orm import *  # XXX
 
+from sqlalchemy.schema import Column, ForeignKey
+from sqlalchemy.types import Integer, String
+from sqlalchemy.orm import relation
 
+class Database(rdb.Database):
+    url = 'postgres:///rdbexample'
+    
 class RDBExample(grok.Application, grok.Model):
-    def __init__(self):
-        pass
-
     def traverse(self, name):
         return rdb.query(Faculty).get(name)
-
     
 class Index(grok.View):
     pass
 
+class Departments(rdb.Container):
+    pass
 
 class Faculty(rdb.Model):
     # rdb.table_name('faculty') is the default
+    __tablename__ = 'faculty'
 
+    grok.traversable('departments')    
+    
     id = Column('id', Integer, primary_key=True)
     title = Column('email', String(50))
 
@@ -25,14 +31,10 @@
                            backref='faculty',
                            collection_class=Departments)
 
-    def traverse(self, name):
-        return self.departments.get(name)
-    
-    
-class Departments(rdb.Container):
-    pass
+class Department(rdb.Model):
+    __tablename__ = 'department'
 
-class Department(rdb.Model):
+    id = Column('id', Integer, primary_key=True)
     faculty_id = Column('faculty_id', Integer, ForeignKey(Faculty.id))
     
 class DepartmentList(grok.View):



More information about the Checkins mailing list