[Checkins] SVN: zope.schema/branches/faassen-transformer/src/zope/schema/ Allow adding a field as well.
Martijn Faassen
faassen at startifact.com
Thu Feb 4 13:53:29 EST 2010
Log message for revision 108777:
Allow adding a field as well.
Changed:
U zope.schema/branches/faassen-transformer/src/zope/schema/_transformer.py
U zope.schema/branches/faassen-transformer/src/zope/schema/transformer.txt
-=-
Modified: zope.schema/branches/faassen-transformer/src/zope/schema/_transformer.py
===================================================================
--- zope.schema/branches/faassen-transformer/src/zope/schema/_transformer.py 2010-02-04 18:43:33 UTC (rev 108776)
+++ zope.schema/branches/faassen-transformer/src/zope/schema/_transformer.py 2010-02-04 18:53:28 UTC (rev 108777)
@@ -36,8 +36,30 @@
order += 1
return self._transformer(attrs)
-
-
+ def add(self, field, name=None, before=None):
+ attrs = {}
+ order = 0
+ added = False
+ add_name = name
+ for name in getFieldNamesInOrder(self.schema):
+ if not added and name == before:
+ field.order = order
+ if add_name is not None:
+ field.__name__ = add_name
+ attrs[field.__name__] = field
+ order += 1
+ added = True
+ attrs[name] = self._copy_field(self.schema[name],
+ order=order)
+ order += 1
+ if not added:
+ if add_name is not None:
+ field.__name__ = add_name
+ field.order = order
+ attrs[field.__name__] = field
+
+ return self._transformer(attrs)
+
def _transformer(self, attrs):
return transformer(InterfaceClass(name=self.schema.__name__,
bases=self.schema.__bases__,
Modified: zope.schema/branches/faassen-transformer/src/zope/schema/transformer.txt
===================================================================
--- zope.schema/branches/faassen-transformer/src/zope/schema/transformer.txt 2010-02-04 18:43:33 UTC (rev 108776)
+++ zope.schema/branches/faassen-transformer/src/zope/schema/transformer.txt 2010-02-04 18:53:28 UTC (rev 108777)
@@ -84,11 +84,38 @@
Now we override the title, producing a new schema::
- >>> schema = ifoo_transformer.override('a', title=u'A overridden').schema
- >>> schema['a'].title
+ >>> s = ifoo_transformer.override('a', title=u'A overridden').schema
+ >>> s['a'].title
u'A overridden'
You can override any property, and also more than one, by using
keyword arguments.
-
+Add
+---
+
+We can also add a field to the schema. Let's add a field ``z``. First
+we need to create one::
+
+ >>> z = schema.TextLine(__name__='z', title=u'Z')
+ >>> s = ifoo_transformer.add(z).schema
+ >>> getFieldNamesInOrder(s)
+ ['a', 'b', 'c', 'd', 'z']
+
+Note that we have to set the __name__ manually in the field to be added. There
+is a convenience for this::
+
+ >>> z = schema.TextLine(title=u'Z')
+ >>> s = ifoo_transformer.add(z, name='z').schema
+ >>> getFieldNamesInOrder(s)
+ ['a', 'b', 'c', 'd', 'z']
+
+We can also insert a field before another one::
+
+ >>> s = ifoo_transformer.add(z, name='z', before='a').schema
+ >>> getFieldNamesInOrder(s)
+ ['z', 'a', 'b', 'c', 'd']
+
+ >>> s = ifoo_transformer.add(z, name='z', before='c').schema
+ >>> getFieldNamesInOrder(s)
+ ['a', 'b', 'z', 'c', 'd']
More information about the checkins
mailing list