[Checkins] SVN: z3c.dobbin/trunk/src/z3c/dobbin/ Mappers now
self-assign uuid;
added security checker attribute to relation list instrument;
made string fields use unicode where applicable;
the object factory no longer saves created objects on the session.
Malthe Borch
mborch at gmail.com
Tue Jun 10 17:44:48 EDT 2008
Log message for revision 87297:
Mappers now self-assign uuid; added security checker attribute to relation list instrument; made string fields use unicode where applicable; the object factory no longer saves created objects on the session.
Changed:
U z3c.dobbin/trunk/src/z3c/dobbin/README.txt
U z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
U z3c.dobbin/trunk/src/z3c/dobbin/factory.py
U z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
-=-
Modified: z3c.dobbin/trunk/src/z3c/dobbin/README.txt
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/README.txt 2008-06-10 16:07:46 UTC (rev 87296)
+++ z3c.dobbin/trunk/src/z3c/dobbin/README.txt 2008-06-10 21:44:46 UTC (rev 87297)
@@ -76,6 +76,10 @@
To verify that we've actually inserted objects to the database, we
commit the transacation, thus flushing the current session.
+ >>> session.save(album)
+ >>> session.save(vinyl)
+ >>> session.save(cd)
+
>>> import transaction
>>> transaction.commit()
@@ -168,6 +172,13 @@
>>> experimental.rpm
50
+
+Instances of mappers automatically join the object soup.
+
+ >>> mapper = getMapper(Vinyl)
+ >>> instance = mapper()
+ >>> instance.uuid is not None
+ True
Relations
---------
@@ -184,6 +195,8 @@
>>> favorite.item
<Vinyl Diana Ross and The Supremes: Taking Care of Business (@ 45 RPM)>
+ >>> session.save(favorite)
+
Get back the object.
>>> favorite = session.query(IFavorite.__mapper__).select_by(
@@ -265,7 +278,8 @@
Add the Diana Ross record, and save the collection to the session.
>>> collection.records.append(diana)
-
+ >>> session.save(collection)
+
We can get our collection back.
>>> collection = session.query(ICollection.__mapper__).select_by(
Modified: z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py 2008-06-10 16:07:46 UTC (rev 87296)
+++ z3c.dobbin/trunk/src/z3c/dobbin/bootstrap.py 2008-06-10 21:44:46 UTC (rev 87297)
@@ -4,6 +4,7 @@
from sqlalchemy import orm
from ore.alchemist.interfaces import IDatabaseEngine
+from ore.alchemist import Session
from interfaces import IMapped
@@ -58,7 +59,11 @@
def _set_target(self, item):
if not IMapped.providedBy(item):
item = relations.persist(item)
-
+
+ if item.id is None:
+ session = Session()
+ session.save(item)
+
self.right = item.uuid
source = property(_get_source, _set_source)
Modified: z3c.dobbin/trunk/src/z3c/dobbin/factory.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/factory.py 2008-06-10 16:07:46 UTC (rev 87296)
+++ z3c.dobbin/trunk/src/z3c/dobbin/factory.py 2008-06-10 21:44:46 UTC (rev 87297)
@@ -1,32 +1,11 @@
from interfaces import IMapper
from zope.interface.declarations import _normalizeargs
-from uuid import uuid1
-from random import randint
-
from ore.alchemist import Session
-def uuid():
- """Return new unique id as string.
-
- Force first character between 'a' and 'z'.
- """
-
- return chr(randint(ord('a'), ord('z'))) + uuid1().hex[:-1]
-
def create(spec):
# set up mapper
mapper = IMapper(spec)
# create instance
- instance = mapper()
-
- # set soup attributes
- instance.uuid = uuid()
- instance.spec = mapper.__spec__
-
- # save to session
- session = Session()
- session.save(instance)
-
- return instance
+ return mapper()
Modified: z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/mapper.py 2008-06-10 16:07:46 UTC (rev 87296)
+++ z3c.dobbin/trunk/src/z3c/dobbin/mapper.py 2008-06-10 21:44:46 UTC (rev 87297)
@@ -5,6 +5,8 @@
from zope.dottedname.resolve import resolve
from zope.security.interfaces import IChecker
from zope.security.checker import defineChecker, getCheckerForInstancesOf
+from zope.security.checker import NamesChecker
+from zope.security.proxy import removeSecurityProxy
from interfaces import IMapper
from interfaces import IMapped
@@ -19,6 +21,9 @@
from ore.alchemist.zs2sa import FieldTranslator
from ore.alchemist.zs2sa import StringTranslator
+from uuid import uuid1
+from random import randint
+
import bootstrap
import relations
@@ -28,6 +33,14 @@
import types
+def uuid():
+ """Return new unique id as string.
+
+ Force first character between 'a' and 'z'.
+ """
+
+ return chr(randint(ord('a'), ord('z'))) + uuid1().hex[:-1]
+
class RelationProperty(property):
def __init__(self, field):
self.field = field
@@ -38,14 +51,20 @@
item = getattr(instance, kls.name)
return relations.lookup(item.uuid)
- def set(kls, instance, value):
- if not IMapped.providedBy(value):
- value = relations.persist(value)
+ def set(kls, instance, item):
+ if not IMapped.providedBy(item):
+ item = relations.persist(item)
- setattr(instance, kls.name, value)
-
+ if item.id is None:
+ session = Session()
+ session.save(item)
+
+ setattr(instance, kls.name, item)
+
class RelationList(object):
__emulates__ = None
+ __Security_checker__ = NamesChecker(
+ ('append', 'remove'))
def __init__(self):
self.data = []
@@ -89,7 +108,7 @@
# add relation to internal list
self.data.append(relation)
-
+
def remove(self, item, _sa_initiator=None):
if IMapped.providedBy(item):
uuid = item.uuid
@@ -169,10 +188,7 @@
return {
field.__name__: orm.relation(
bootstrap.Relation,
- #secondary=relation_table,
primaryjoin=soup_table.c.uuid==relation_table.c.left,
- #secondaryjoin=relation_table.c.target==soup_table.c.uuid,
- #foreign_keys=[relation_table.c.source],
collection_class=RelationList,
enable_typechecks=False)
}
@@ -214,20 +230,20 @@
schema.Bool: FieldTranslator(rdb.BOOLEAN),
schema.Bytes: FieldTranslator(rdb.BLOB),
schema.BytesLine: FieldTranslator(rdb.CLOB),
- schema.Choice: StringTranslator(),
+ schema.Choice: StringTranslator(rdb.Unicode),
schema.Date: FieldTranslator(rdb.DATE),
schema.Dict: (ObjectTranslator(), DictProperty()),
schema.DottedName: StringTranslator(),
schema.Float: FieldTranslator(rdb.Float),
- schema.Id: StringTranslator(),
+ schema.Id: StringTranslator(rdb.Unicode),
schema.Int: FieldTranslator(rdb.Integer),
schema.List: (None, ListProperty()),
schema.Object: (ObjectTranslator(), ObjectProperty()),
- schema.Password: StringTranslator(),
- schema.SourceText: StringTranslator(),
- schema.Text: StringTranslator(),
- schema.TextLine: StringTranslator(),
- schema.URI: StringTranslator(),
+ schema.Password: StringTranslator(rdb.Unicode),
+ schema.SourceText: StringTranslator(rdb.UnicodeText),
+ schema.Text: StringTranslator(rdb.UnicodeText),
+ schema.TextLine: StringTranslator(rdb.Unicode),
+ schema.URI: StringTranslator(rdb.Unicode),
interface.interface.Method: None,
}
@@ -287,6 +303,13 @@
__spec__ = '%s.%s' % (spec.__module__, spec.__name__)
+ def __init__(self, *args, **kwargs):
+ super(Mapper, self).__init__(*args, **kwargs)
+
+ # set soup metadata
+ self.uuid = uuid()
+ self.spec = self.__spec__
+
# if the specification is an interface class, try to look up a
# security checker and define it on the mapper
if interface.interfaces.IInterface.providedBy(spec):
More information about the Checkins
mailing list