[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