[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