[Checkins] SVN: z3c.zalchemy/trunk/src/z3c/zalchemy/ Merged changes from branch.

Jürgen Kartnaller juergen at kartnaller.at
Tue Jan 23 11:18:04 EST 2007


Log message for revision 72193:
  Merged changes from branch.
  
  The API has changed !
  
  The metadata for the table definition allows an explicit engine name as
  paramter. Change the use of the metadata like this :
   z3c.zalchemy.metadata -> z3c.zalchemy.metadata()
  If you want to assign the table to a named engine provide the name as
  a paramter to metadata().
  This change allows to have two or more tables with the same name and
  different structures to be used in different databases.
  
  Demos have been updated by Michael Bernstein.
  
  

Changed:
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/README.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/__init__.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/README.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/TODO.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/container.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/interfaces.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/container.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/interfaces.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/container.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/interfaces.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/configure.zcml
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/container.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/interfaces.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/message.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/demo/z3c.zalchemy.demo-configure.zcml
  A   z3c.zalchemy/trunk/src/z3c/zalchemy/i18n.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/intid/keyreference.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/metaconfigure.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/metadirectives.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/tests/environ.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/tests/test_container.py

-=-
Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/README.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/README.txt	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/README.txt	2007-01-23 16:18:01 UTC (rev 72193)
@@ -46,13 +46,14 @@
   ...       )
 
 We create our table as a normal SQLAlchemy table. The important thing
-here is, that the metadata from zalchemy must be used:
+here is, that the metadata from zalchemy must be used. Please note that you
+need to call z3c.zalchemy.metadata.
 
   >>> import sqlalchemy
   >>> import z3c.zalchemy
   >>> table3 = sqlalchemy.Table(
   ...     'table3',
-  ...     z3c.zalchemy.metadata,
+  ...     z3c.zalchemy.metadata(),
   ...     sqlalchemy.Column('id', sqlalchemy.Integer,
   ...         sqlalchemy.Sequence('atable_id'), primary_key=True),
   ...     sqlalchemy.Column('value', sqlalchemy.Integer),
@@ -78,7 +79,7 @@
 If no session is created then the table creation is deffered to the next
 call to zalchemy.getSession.
 
-  >>> z3c.zalchemy.createTable('table3')
+  >>> z3c.zalchemy.createTable('table3', '')
 
 Note that the transaction handling is done inside Zope.
 
@@ -152,7 +153,7 @@
 
   >>> bTable = sqlalchemy.Table(
   ...     'bTable',
-  ...     z3c.zalchemy.metadata,
+  ...     z3c.zalchemy.metadata(),
   ...     sqlalchemy.Column('id', sqlalchemy.Integer,
   ...         sqlalchemy.Sequence('btable_id'), primary_key=True),
   ...     sqlalchemy.Column('value', sqlalchemy.String),
@@ -168,7 +169,7 @@
 This time we do it inside of a session.
 
   >>> z3c.zalchemy.assignTable('bTable', 'engine2')
-  >>> z3c.zalchemy.createTable('bTable')
+  >>> z3c.zalchemy.createTable('bTable', 'engine2')
 
   >>> b = B()
   >>> session().save(b)
@@ -212,3 +213,31 @@
   >>> aa.value = 100
 
   >>> transaction.commit()
+
+
+Tables With The Same Name In Different Databases
+------------------------------------------------
+
+IF we have two databases containing tables with the same name but with a
+different structure we need to assign a table explicitely to a database. This
+must be done by requesting metadata for a specific engine.
+
+  >>> b2Table = sqlalchemy.Table(
+  ...     'bTable',
+  ...     z3c.zalchemy.metadata('b2Engine'),
+  ...     sqlalchemy.Column('id', sqlalchemy.Integer,
+  ...         sqlalchemy.Sequence('btable_id'), primary_key=True),
+  ...     sqlalchemy.Column('b2value', sqlalchemy.String),
+  ...     )
+
+We can now request the table by providing the engine.
+
+  >>> z3c.zalchemy.metadata.getTable('b2Engine', 'bTable', True)
+  Table('bTable',...
+
+If we have specified a table for the 'default' engine then we can request
+'bTable' for 'b2Engine' with a fallback to the default engine.
+
+  >>> z3c.zalchemy.metadata.getTable('b2Engine', 'table3', True)
+  Table('table3',...
+

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/__init__.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/__init__.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/__init__.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -22,3 +22,7 @@
         getEngineForTable,
         )
 
+import zope.i18nmessageid
+
+_ = zope.i18nmessageid.MessageFactory('z3c.zalchemy')
+

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -60,9 +60,6 @@
             self._v_storage = local()
         return self._v_storage
 
-
-metadata = sqlalchemy.MetaData()
-
 _tableToEngine = {}
 _classToEngine = {}
 _tablesToCreate = []
@@ -112,14 +109,14 @@
     _assignClass(class_, engine)
 
 
-def createTable(table, engine=''):
+def createTable(table, engine):
     _tablesToCreate.append((table, engine))
     _createTables()
 
 
 def _assignTable(table, engine):
     if inSession():
-        t = metadata.tables[table]
+        t = metadata.getTable(engine, table, True)
         util = getUtility(IAlchemyEngineUtility, name=engine)
         _storage.session.bind_table(t,util.getEngine())
 
@@ -140,17 +137,8 @@
 
 
 def _doCreateTable(table, engine):
-    for t, tengine in _tableToEngine.iteritems():
-        if t==table:
-            t = metadata.tables[table]
-            util = getUtility(IAlchemyEngineUtility, name=tengine)
-            try:
-                util.getEngine().create(t)
-            except:
-                pass
-            return
     util = getUtility(IAlchemyEngineUtility, name=engine)
-    t = metadata.tables[table]
+    t = metadata.getTable(engine, table, True)
     try:
         util.getEngine().create(t)
     except:
@@ -158,17 +146,8 @@
 
 
 def dropTable(table, engine=''):
-    for t, tengine in _tableToEngine.iteritems():
-        if t==table:
-            t = metadata.tables[table]
-            util = getUtility(IAlchemyEngineUtility, name=tengine)
-            try:
-                util.getEngine().drop(t)
-            except:
-                pass
-            return
     util = getUtility(IAlchemyEngineUtility, name=engine)
-    t = metadata.tables[table]
+    t = metadata.getTable(engine, table, True)
     try:
         util.getEngine().drop(t)
     except:
@@ -215,3 +194,31 @@
     def sortKey(self):
         return str(id(self))
 
+
+class MetaManager(object):
+    """A manager for metadata to be able to use the same table name in
+    different databases.
+    """
+
+    def __init__(self):
+        self.metadata = {}
+
+    def getTable(self, engine, table, fallback):
+        md = self.metadata.get(engine)
+        if md and table in md.tables:
+            return md.tables[table]
+        if fallback and engine:
+            md = self.metadata.get('')
+        if md and table in md.tables:
+            return md.tables[table]
+        return None
+
+    def __call__(self, engine=''):
+        md = self.metadata.get(engine)
+        if md is None:
+            md = self.metadata[engine] = sqlalchemy.MetaData()
+        return md
+
+
+metadata = MetaManager()
+

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/README.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/README.txt	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/README.txt	2007-01-23 16:18:01 UTC (rev 72193)
@@ -4,13 +4,8 @@
 These demos show how ZAlchemy can be used to create Zope3 web applications that use SQLAlchemy to persist data in an RDBMS.
 
 To try a demo, copy the included z3c.zalchemy.demo-configure.zcml file to your 
-etc/package-includes/ directory and uncomment the demo you want to try.
+etc/package-includes/ directory and uncomment the demos you want to try.
 
-Note: Do not try installing more than one of these demos at the same time. Due 
-to a minor bug (hopefully soon eradicated), if ZAlchemy tries to create tables 
-with the same name in different databases it produces an error (because of the
-way the global MetaData() is used as an intermediary).
-
 Because of incompatibilities between the database schemas, each demo defines a 
 different database connection string, to avoid conflicts.
 
@@ -18,9 +13,9 @@
 is the number of the demo.  So for example, if you've uncommented demo_3 from
 z3c.zalchemy.demo-configure.zcml, restarting Zope should show a 
 'Message Container 3' object that can be added. Inside these message containers 
-message objects can be added and edited. Adding a second 'Message Container' 
-will show the same set of messages, as the container just gets all messages in 
-the database.
+'Message X' objects can be added and edited. Adding a second
+'Message Container X' will show the same set of messages, as the container just 
+gets all messages in the database.
 
 
 Demo 1: Subclasses the included SQLAlchemyContainer to create a container that

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/TODO.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/TODO.txt	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/TODO.txt	2007-01-23 16:18:01 UTC (rev 72193)
@@ -6,6 +6,8 @@
    uses the global_connection to pass around the table object to be bound to an 
    engine, but doesn't seem to ever clean up the tables after it is done).
    
+ * fix the RelationalDC implementation in dem_3 and demo_4
+ 
  * add tests to the demos
 
  * copy/paste of fragments between messages (in demo_4) ends up doing a

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,7 +1,7 @@
 <configure
   xmlns="http://namespaces.zope.org/zope"
   xmlns:browser="http://namespaces.zope.org/browser"
-  >
+  i18n_domain="z3c.zalchemy">
 
 <!-- Message Container -->
 
@@ -21,7 +21,7 @@
 <!-- Message -->
 
   <browser:addMenuItem
-      title="Hello World Message"
+      title="Message 1"
       factory="z3c.zalchemy.demo.demo_1.message.HelloWorldMessage"
       view="z3c.zalchemy.demo.demo_1.message.HelloWorldMessage"
       permission="zope.ManageContent"

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/browser/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -5,6 +5,8 @@
 from z3c.zalchemy.demo.demo_1.interfaces import IHelloWorldMessage
 from z3c.zalchemy.demo.demo_1.message import HelloWorldMessage
 
+from z3c.zalchemy.i18n import _
+
 # class that defines the add form fields
 class AddHelloWorldMessage(form.AddForm):
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,7 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
-    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy">
+    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy"
+    i18n_domain="z3c.zalchemy">
 
   <!-- ZAlchemy Setup -->
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/container.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/container.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/container.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -9,6 +9,6 @@
     """A container for Hello World messages"""
     implements(IMessageContainer)
     def __init__(self):
+        super(MessageContainer, self).__init__(self)
         self.setClassName('z3c.zalchemy.demo.demo_1.message.HelloWorldMessage')
 
-    

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/interfaces.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/interfaces.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/interfaces.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -2,14 +2,16 @@
 from z3c.zalchemy.interfaces import ISQLAlchemyObjectContained, ISQLAlchemyContainer
 from zope.app.container.constraints import contains, containers
 
+from z3c.zalchemy.i18n import _
+
 # Define an interface for an RDBMS-persistent content class
 
 class IHelloWorldMessage(ISQLAlchemyObjectContained):
     """Information about a hello world message"""
 
     who = zope.schema.TextLine(
-        title=u'Who',
-        description=u'Name of the person sending the message',
+        title=_(u'Who'),
+        description=_(u'Name of the person sending the message'),
         required=True)
 
 # Define an interface for a container of RDBMS-persistent IHelloWorld objects

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_1/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,5 @@
 import sqlalchemy
 import z3c.zalchemy
-from z3c.zalchemy.container import SQLAlchemyNameChooser
 from zope.interface import implements
 from zope.schema.fieldproperty import FieldProperty
 
@@ -11,7 +10,7 @@
 # Define and create the table object for storing messages
 HelloWorldMessageTable = sqlalchemy.Table(
         'message',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-1'),
         sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
         sqlalchemy.Column('who', sqlalchemy.Unicode),
         )

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,7 +1,7 @@
 <configure
   xmlns="http://namespaces.zope.org/zope"
   xmlns:browser="http://namespaces.zope.org/browser"
-  >
+  i18n_domain="z3c.zalchemy">
 
 <!-- Message Container -->
 
@@ -21,7 +21,7 @@
 <!-- Message -->
 
   <browser:addMenuItem
-      title="Hello World Message"
+      title="Message 2"
       factory="z3c.zalchemy.demo.demo_2.message.HelloWorldMessage2"
       view="z3c.zalchemy.demo.demo_2.message.HelloWorldMessage2"
       permission="zope.ManageContent"

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/browser/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -5,6 +5,8 @@
 from z3c.zalchemy.demo.demo_2.interfaces import IHelloWorldMessage2
 from z3c.zalchemy.demo.demo_2.message import HelloWorldMessage2
 
+from z3c.zalchemy.i18n import _
+
 #Define the schema for the message ad form
 class AddHelloWorldMessage(form.AddForm):
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,7 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
-    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy">
+    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy"
+    i18n_domain="z3c.zalchemy">
 
   <!-- ZAlchemy Setup -->
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/container.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/container.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/container.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -69,7 +69,7 @@
     def __setitem__(self, name, item):
         session = z3c.zalchemy.getSession()
         session.save(item)
-        session.flush([item])
+        session.flush()
 
     def _toStringIdentifier(self, obj):
         session = z3c.zalchemy.getSession()
@@ -79,7 +79,7 @@
         return 'HelloWorldMessage2-'+ident
 
     def _fromStringIdentifier(self, name):
-        prefix = 'HelloWorldMessage2' + '-'
+        prefix = 'HelloWorldMessage2-'
         if not name.startswith(prefix):
             return None
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/interfaces.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/interfaces.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/interfaces.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -2,13 +2,15 @@
 from z3c.zalchemy.interfaces import ISQLAlchemyObjectContained, ISQLAlchemyContainer
 from zope.app.container.constraints import contains, containers
 
+from z3c.zalchemy.i18n import _
+
 # Interface defining the Zope schema for RDBMS-persistent Messages
 class IHelloWorldMessage2(ISQLAlchemyObjectContained):
     """Information about a hello world message"""
 
     who = zope.schema.TextLine(
-        title=u'Who',
-        description=u'Name of the person sending the message',
+        title=_(u'Who'),
+        description=_(u'Name of the person sending the message'),
         required=True)
 
 # Interface of a container for RDBMS-persistent messages

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_2/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,7 +1,5 @@
 import sqlalchemy
 import z3c.zalchemy
-from z3c.zalchemy.container import SQLAlchemyNameChooser
-from z3c.zalchemy.interfaces import IAlchemyEngineUtility
 
 from zope.interface import implements
 from zope.schema.fieldproperty import FieldProperty
@@ -13,7 +11,7 @@
 # define and create the RDBMS table for storing messages
 HelloWorldMessageTable2 = sqlalchemy.Table(
         'message', 
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-2'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            primary_key = True),
         sqlalchemy.Column('who', sqlalchemy.Unicode),

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,7 +1,7 @@
 <configure
   xmlns="http://namespaces.zope.org/zope"
   xmlns:browser="http://namespaces.zope.org/browser"
-  >
+  i18n_domain="z3c.zalchemy">
 
 <!-- Message Container -->
 
@@ -21,7 +21,7 @@
 <!-- Message -->
 
   <browser:addMenuItem
-      title="Hello World Message"
+      title="Message 3"
       factory="z3c.zalchemy.demo.demo_3.message.HelloWorldMessage3"
       view="z3c.zalchemy.demo.demo_3.message.HelloWorldMessage3"
       permission="zope.ManageContent"

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/browser/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -6,6 +6,8 @@
 from z3c.zalchemy.demo.demo_3.message import HelloWorldMessage3
 from zope.dublincore.interfaces import IZopeDublinCore
 
+from z3c.zalchemy.i18n import _
+
 class AddHelloWorldMessage3(form.AddForm):
 
     form_fields = form.FormFields(IZopeDublinCore).select('title', 'description')+form.FormFields(IHelloWorldMessage3).omit('__parent__')

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,7 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
-    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy">
+    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy"
+    i18n_domain="z3c.zalchemy">
 
   <!-- ZAlchemy Setup -->
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/container.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/container.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/container.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -76,7 +76,7 @@
         return 'HelloWorldMessage3-'+ident
 
     def _fromStringIdentifier(self, name):
-        prefix = 'HelloWorldMessage3' + '-'
+        prefix = 'HelloWorldMessage3-'
         if not name.startswith(prefix):
             return None
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/interfaces.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/interfaces.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/interfaces.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -3,6 +3,8 @@
 from zope.app.container.constraints import contains, containers
 from zope.interface import Interface, Attribute
 
+from z3c.zalchemy.i18n import _
+
 # Interface defining the Zope schema of message objects
 class IHelloWorldMessage3(ISQLAlchemyObjectContained):
     """Information about a hello world message"""
@@ -10,8 +12,8 @@
     id = Attribute("The ID of the Message")
     
     who = zope.schema.TextLine(
-        title=u'Who',
-        description=u'Name of the person getting the message',
+        title=_(u'Who'),
+        description=_(u'Name of the person getting the message'),
         required=True)
 
 #interface defining the schema of the container for message objects

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_3/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -3,7 +3,6 @@
 import sqlalchemy
 
 import z3c.zalchemy
-from z3c.zalchemy.container import SQLAlchemyNameChooser
 
 from zope.interface import implements
 from zope.component import adapts
@@ -16,7 +15,7 @@
 # Define and create the table for storing dublin core metadata
 RelationalDCTable = sqlalchemy.Table(
         'dublin_core',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-3'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            sqlalchemy.Sequence('metadata_seq'),
                            primary_key = True),
@@ -33,7 +32,7 @@
 # primary key does *not* autoincrement
 HelloWorldMessageTable3 = sqlalchemy.Table(
         'message',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-3'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            sqlalchemy.ForeignKey(RelationalDCTable.c.id),
                            primary_key = True,
@@ -121,19 +120,19 @@
 
     who = FieldProperty(IHelloWorldMessage3['who'])
     
-    # instantiate a RelationaDC object to get an id
+    # instantiate a RelationalDC object to get an id
     # (the metadata.id column autoincrements)
     def __init__(self, title, description, who):
         self.rdc = RelationalDC(title, description)
         self.who = who
         
 
-# map the message class to the mesage table
+# map the message class to the message table
 messagemapper = sqlalchemy.mapper(HelloWorldMessage3, HelloWorldMessageTable3)
 # add an additional property to the message mapper that maps
 # to the metadata class
 messagemapper.add_property('rdc', sqlalchemy.relation(RelationalDC,
-                                                      cascade="delete"))
+                                                      cascade="all"))
 
 messageFactory=Factory(
     HelloWorldMessage3,

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,7 +1,7 @@
 <configure
   xmlns="http://namespaces.zope.org/zope"
   xmlns:browser="http://namespaces.zope.org/browser"
-  >
+  i18n_domain="z3c.zalchemy">
 
 <!-- Message Container -->
 
@@ -21,7 +21,7 @@
 <!-- Message -->
 
   <browser:addMenuItem
-      title="Hello World Message"
+      title="Message 4"
       factory="z3c.zalchemy.demo.demo_4.message.HelloWorldMessage4"
       view="z3c.zalchemy.demo.demo_4.message.HelloWorldMessage4"
       permission="zope.ManageContent"

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/browser/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -6,6 +6,8 @@
 from z3c.zalchemy.demo.demo_4.message import HelloWorldMessage4, HelloWorldFragment
 from zope.dublincore.interfaces import IZopeDublinCore
 
+from z3c.zalchemy.i18n import _
+
 class AddHelloWorldMessage(form.AddForm):
 
     form_fields = form.FormFields(IZopeDublinCore).select('title', 'description')+form.FormFields(IHelloWorldMessage4).omit('__parent__','className')

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,7 @@
 <configure
     xmlns="http://namespaces.zope.org/zope"
-    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy">
+    xmlns:alchemy="http://namespaces.zalchemy.org/alchemy"
+    i18n_domain="z3c.zalchemy">
 
   <!-- ZAlchemy Setup -->
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/container.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/container.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/container.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -77,7 +77,7 @@
         return 'HelloWorldMessage4-'+ident
 
     def _fromStringIdentifier(self, name):
-        prefix = 'HelloWorldMessage4' + '-'
+        prefix = 'HelloWorldMessage4-'
         if not name.startswith(prefix):
             return None
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/interfaces.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/interfaces.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/interfaces.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -3,17 +3,21 @@
 from zope.app.container.constraints import contains, containers
 from zope.interface import Interface, Attribute
 
+from z3c.zalchemy.i18n import _
+
+# Define a message fragment, which is contained in a message
 class IHelloWorldFragment(ISQLAlchemyObjectContained):
     """Information about a hello world message"""
     
     message_id = Attribute("The ID of the parent message")
 
     what = zope.schema.TextLine(
-        title=u'What',
-        description=u'Type of message',
+        title=_(u'What'),
+        description=_(u'fragment of a message'),
         required=True)
-        
-        
+
+# Define a message object, which contains fragments, and
+# is contained in a MessageContainer        
 class IHelloWorldMessage4(ISQLAlchemyContainer,ISQLAlchemyObjectContained):
     """Information about a hello world message"""
 
@@ -22,12 +26,12 @@
     fragments = Attribute("The contained Message fragments")
     
     who = zope.schema.TextLine(
-        title=u'Who',
-        description=u'Name of the person getting the message',
+        title=_(u'Who'),
+        description=_(u'Name of the person getting the message'),
         required=True)
     contains(IHelloWorldFragment)
 
-
+# Define a container for Messages
 class IMessageContainer4(ISQLAlchemyContainer):
     """A container for hello world message mbjects"""
     contains(IHelloWorldMessage4)

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/message.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/message.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/demo_4/message.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -3,7 +3,7 @@
 import sqlalchemy
 
 import z3c.zalchemy
-from z3c.zalchemy.container import SQLAlchemyNameChooser, contained
+from z3c.zalchemy.container import contained
 
 from zope.app.container.contained import Contained
 from zope.interface import implements
@@ -17,7 +17,7 @@
 
 RelationalDCTable = sqlalchemy.Table(
         'dublin_core',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-4'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            sqlalchemy.Sequence('metadata_seq'),
                            primary_key = True),
@@ -32,7 +32,7 @@
 
 HelloWorldMessageTable4 = sqlalchemy.Table(
         'message',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-4'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            sqlalchemy.ForeignKey(RelationalDCTable.c.id),
                            primary_key = True,
@@ -45,7 +45,7 @@
 
 HelloWorldFragmentTable = sqlalchemy.Table(
         'fragment',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata('DemoEngine-4'),
         sqlalchemy.Column('id', sqlalchemy.Integer,
                            primary_key = True),
         sqlalchemy.Column('message_id', sqlalchemy.Integer,
@@ -89,7 +89,7 @@
         self.context = context
         self.__parent__ = context
         session = z3c.zalchemy.getSession()
-        query =  session.query(RelationalDC).select_by(id=context.id)
+        query = session.query(RelationalDC).select_by(id=context.id)
         self.result = None
         try:
             self.result = query[0]
@@ -142,6 +142,7 @@
     def __init__(self, title, description, who):
         self.rdc = RelationalDC(title, description)
         self.who = who
+        
 
 
     def keys(self):
@@ -211,10 +212,10 @@
 
 messagemapper = sqlalchemy.mapper(HelloWorldMessage4, HelloWorldMessageTable4)
 messagemapper.add_property('rdc', sqlalchemy.relation(RelationalDC,
-                                                      cascade="delete"))
+                                                      cascade="all"))
 messagemapper.add_property('fragments',
                            sqlalchemy.relation(HelloWorldFragment,
-                                               cascade="delete"))
+                                               cascade="all"))
 
 messageFactory=Factory(
     HelloWorldMessage4,

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/demo/z3c.zalchemy.demo-configure.zcml
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/demo/z3c.zalchemy.demo-configure.zcml	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/demo/z3c.zalchemy.demo-configure.zcml	2007-01-23 16:18:01 UTC (rev 72193)
@@ -1,6 +1,6 @@
 <configure>
-<!-- include package="z3c.zalchemy.demo.demo_1" /-->
-<!-- include package="z3c.zalchemy.demo.demo_2" /-->
-<!-- include package="z3c.zalchemy.demo.demo_3" /-->
-<!-- include package="z3c.zalchemy.demo.demo_4" /-->
+<include package="z3c.zalchemy.demo.demo_1" />
+<include package="z3c.zalchemy.demo.demo_2" />
+<include package="z3c.zalchemy.demo.demo_3" />
+<include package="z3c.zalchemy.demo.demo_4" />
 </configure>

Copied: z3c.zalchemy/trunk/src/z3c/zalchemy/i18n.py (from rev 72192, z3c.zalchemy/branches/engine-metadata/src/z3c/zalchemy/i18n.py)

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/intid/keyreference.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/intid/keyreference.txt	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/intid/keyreference.txt	2007-01-23 16:18:01 UTC (rev 72193)
@@ -15,7 +15,7 @@
   >>> import sqlalchemy
   >>> import z3c.zalchemy
   >>> aTable = sqlalchemy.Table(
-  ...     'aTable',z3c.zalchemy.metadata,
+  ...     'aTable',z3c.zalchemy.metadata(),
   ...     sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True),
   ...     sqlalchemy.Column('value', sqlalchemy.Integer),
   ...     )
@@ -30,7 +30,7 @@
   >>> sqlalchemy.mapper(A, aTable) is not None
   True
   
-  >>> z3c.zalchemy.createTable('aTable')
+  >>> z3c.zalchemy.createTable('aTable', '')
 
 Start a transaction.
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/metaconfigure.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/metaconfigure.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/metaconfigure.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -33,6 +33,6 @@
 def connectClass(_context, class_, engine):
     z3c.zalchemy.assignClass(class_, engine)
 
-def createTable(_context, table):
-    z3c.zalchemy.createTable(table)
+def createTable(_context, table, engine):
+    z3c.zalchemy.createTable(table, engine)
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/metadirectives.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/metadirectives.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/metadirectives.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -86,4 +86,12 @@
             description = u'The name of the table.',
             required = True,
             )
+    engine = schema.TextLine(
+            title = u'Engine',
+            description = u"""
+                The name of an engine in which the table should be
+                created.
+                """,
+            required = True,
+            )
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt	2007-01-23 16:18:01 UTC (rev 72193)
@@ -22,7 +22,7 @@
   >>> import z3c.zalchemy
   >>> table2 = sqlalchemy.Table(
   ...     'table2',
-  ...     z3c.zalchemy.metadata,
+  ...     z3c.zalchemy.metadata(),
   ...     sqlalchemy.Column('id', sqlalchemy.Integer,
   ...         sqlalchemy.Sequence('atable_id'), primary_key = True),
   ...     sqlalchemy.Column('value', sqlalchemy.Integer),
@@ -40,7 +40,7 @@
 
   >>> session = z3c.zalchemy.getSession()
 
-  >>> z3c.zalchemy.createTable('table2')
+  >>> z3c.zalchemy.createTable('table2', '')
 
 Multiple calls to getSession return the same session :
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/tests/environ.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/tests/environ.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/tests/environ.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -17,14 +17,14 @@
 
 testTable = sqlalchemy.Table(
         'testTable',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata(),
         sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
         sqlalchemy.Column('x', sqlalchemy.Integer),
         )
 
 illegalTable = sqlalchemy.Table(
         'illegalTable',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata(),
         sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
         )
 

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/tests/test_container.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/tests/test_container.py	2007-01-23 09:14:45 UTC (rev 72192)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/tests/test_container.py	2007-01-23 16:18:01 UTC (rev 72193)
@@ -23,7 +23,7 @@
 
 singlePrimaryKeyTable = sqlalchemy.Table(
         'singlePrimaryKeyTable',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata(),
         sqlalchemy.Column('id', sqlalchemy.Integer, primary_key = True),
         sqlalchemy.Column('x', sqlalchemy.Integer),
         )
@@ -36,7 +36,7 @@
 
 multiPrimaryKeyTable = sqlalchemy.Table(
         'multiPrimaryKeyTable',
-        z3c.zalchemy.metadata,
+        z3c.zalchemy.metadata(),
         sqlalchemy.Column('id1', sqlalchemy.Integer, primary_key = True),
         sqlalchemy.Column('id2', sqlalchemy.String,  primary_key = True),
         sqlalchemy.Column('x', sqlalchemy.Integer),
@@ -53,8 +53,8 @@
 def setUp(test):
     setup.placefulSetUp()
     z3c.zalchemy.testing.placefulSetUp(test)
-    z3c.zalchemy.createTable('singlePrimaryKeyTable')
-    z3c.zalchemy.createTable('multiPrimaryKeyTable')
+    z3c.zalchemy.createTable('singlePrimaryKeyTable', '')
+    z3c.zalchemy.createTable('multiPrimaryKeyTable', '')
 
 def tearDown(test):
     z3c.zalchemy.testing.placefulTearDown(test)



More information about the Checkins mailing list