[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