[Checkins] SVN: z3c.dobbin/trunk/src/z3c/dobbin/ Added support for
tuple relation.
Malthe Borch
mborch at gmail.com
Thu Jun 19 20:57:04 EDT 2008
Log message for revision 87581:
Added support for tuple relation.
Changed:
U z3c.dobbin/trunk/src/z3c/dobbin/collections.py
U z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
-=-
Modified: z3c.dobbin/trunk/src/z3c/dobbin/collections.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/collections.py 2008-06-19 22:21:36 UTC (rev 87580)
+++ z3c.dobbin/trunk/src/z3c/dobbin/collections.py 2008-06-20 00:57:00 UTC (rev 87581)
@@ -6,10 +6,7 @@
import relations
import soup
-class OrderedList(object):
- __Security_checker__ = NamesChecker(
- ('append', 'remove'))
-
+class Tuple(object):
def __init__(self):
self.data = []
@@ -29,9 +26,55 @@
def _remover(self, item):
self.data.remove(item)
+ @orm.collections.collection.converter
+ def convert(self, items):
+ converted = []
+
+ for item in items:
+ if not interfaces.IMapped.providedBy(item):
+ item = soup.persist(item)
+
+ # set up relation
+ relation = relations.Relation()
+ relation.target = item
+ relation.order = len(converted)
+
+ converted.append(relation)
+
+ return converted
+
+ def __iter__(self):
+ for relation in iter(self.data):
+ obj = relation.target
+ if interfaces.IBasicType.providedBy(obj):
+ yield obj.value
+ else:
+ yield obj
+
+ def __len__(self):
+ return len(self.data)
+
+ def __repr__(self):
+ return repr(tuple(self))
+
+class OrderedList(Tuple):
+ __Security_checker__ = NamesChecker(
+ ('append', 'remove'))
+
+ @orm.collections.collection.appender
+ def _appender(self, item):
+ self.data.append(item)
+
+ @orm.collections.collection.iterator
+ def _iterator(self):
+ return iter(self.data)
+
+ @orm.collections.collection.remover
+ def _remover(self, item):
+ self.data.remove(item)
+
@orm.collections.collection.internally_instrumented
def append(self, item, _sa_initiator=None):
- # make sure item is mapped
if not interfaces.IMapped.providedBy(item):
item = soup.persist(item)
@@ -56,25 +99,19 @@
if relation.right == uuid:
self.adapter.fire_remove_event(relation, _sa_initiator)
self.data.remove(relation)
-
- return
+ break
else:
- return ValueError("Not in list: %s" % item)
+ raise ValueError("Not in list: %s" % item)
def extend(self, items):
map(self.append, items)
- def __iter__(self):
- return (relation.target for relation in iter(self.data))
-
def __repr__(self):
return repr(list(self))
- def __len__(self):
- return len(self.data)
-
def __getitem__(self, index):
return self.data[index].target
def __setitem__(self, index, value):
return NotImplementedError("Setting items at an index is not implemented.")
+
Modified: z3c.dobbin/trunk/src/z3c/dobbin/mapper.py
===================================================================
--- z3c.dobbin/trunk/src/z3c/dobbin/mapper.py 2008-06-19 22:21:36 UTC (rev 87580)
+++ z3c.dobbin/trunk/src/z3c/dobbin/mapper.py 2008-06-20 00:57:00 UTC (rev 87581)
@@ -69,12 +69,11 @@
lazy=True)
}
-class ListProperty(object):
- """A list property.
+class CollectionProperty(object):
+ """A collection property."""
- Model the schema.List
- """
-
+ collection_class = None
+
def __call__(self, field, column, metadata):
relation_table = metadata.tables['relation']
soup_table = metadata.tables['soup']
@@ -83,9 +82,15 @@
field.__name__: orm.relation(
relations.Relation,
primaryjoin=soup_table.c.uuid==relation_table.c.left,
- collection_class=collections.OrderedList,
+ collection_class=self.collection_class,
enable_typechecks=False)
}
+
+class ListProperty(CollectionProperty):
+ collection_class = collections.OrderedList
+
+class TupleProperty(CollectionProperty):
+ collection_class = collections.Tuple
class DictProperty(object):
"""A dict property.
@@ -132,6 +137,7 @@
schema.Id: StringTranslator(rdb.Unicode),
schema.Int: FieldTranslator(rdb.Integer),
schema.List: (None, ListProperty()),
+ schema.Tuple: (None, TupleProperty()),
schema.Object: (ObjectTranslator(), ObjectProperty()),
schema.Password: StringTranslator(rdb.Unicode),
schema.SourceText: StringTranslator(rdb.UnicodeText),
More information about the Checkins
mailing list