[Checkins] SVN: grok/trunk/src/grok/ support for keyword arguments to a custom grok

Martijn Faassen faassen at infrae.com
Thu Dec 7 16:50:55 EST 2006


Log message for revision 71499:
  support for keyword arguments to a custom grok
  Fields. If a keyword argument is a schema-level field,
  use it, otherwise pass keyword parameters along
  to formlib.

Changed:
  U   grok/trunk/src/grok/__init__.py
  U   grok/trunk/src/grok/formlib.py
  A   grok/trunk/src/grok/tests/form/fields.py

-=-
Modified: grok/trunk/src/grok/__init__.py
===================================================================
--- grok/trunk/src/grok/__init__.py	2006-12-07 21:49:47 UTC (rev 71498)
+++ grok/trunk/src/grok/__init__.py	2006-12-07 21:50:55 UTC (rev 71499)
@@ -16,7 +16,6 @@
 
 from zope.interface import implements
 from zope.component import adapts
-from zope.formlib.form import Fields
 from zope.event import notify
 from zope.app.component.hooks import getSite
 from zope.lifecycleevent import (
@@ -37,7 +36,7 @@
 from grok._grok import do_grok as grok  # Avoid name clash within _grok
 from grok._grok import SubscribeDecorator as subscribe
 from grok.error import GrokError, GrokImportError
-from grok.formlib import action, AutoFields
+from grok.formlib import action, AutoFields, Fields
 
 # Our __init__ provides the grok API directly so using 'import grok' is enough.
 from grok.interfaces import IGrokAPI

Modified: grok/trunk/src/grok/formlib.py
===================================================================
--- grok/trunk/src/grok/formlib.py	2006-12-07 21:49:47 UTC (rev 71498)
+++ grok/trunk/src/grok/formlib.py	2006-12-07 21:50:55 UTC (rev 71499)
@@ -18,6 +18,16 @@
         if self.success_handler is not None:
             return self.success_handler(self.form.grok_form, **data)
 
+def Fields(*args, **kw):
+    fields = []
+    for key, value in kw.items():
+        if IField.providedBy(value):
+            value.__name__ = key
+            fields.append(value)
+            del kw[key]
+    fields.sort(key=lambda field: field.order)
+    return form.Fields(*(args + tuple(fields)), **kw)
+    
 def setup_editform(factory, context):
     """Construct the real edit form, taking needed information from factory.
     """

Added: grok/trunk/src/grok/tests/form/fields.py
===================================================================
--- grok/trunk/src/grok/tests/form/fields.py	2006-12-07 21:49:47 UTC (rev 71498)
+++ grok/trunk/src/grok/tests/form/fields.py	2006-12-07 21:50:55 UTC (rev 71499)
@@ -0,0 +1,29 @@
+"""
+A grok.Fields can receive keyword parameters with schema fields. These
+should be avaible in the definition order.
+
+  >>> grok.grok(__name__)
+
+  >>> from zope import component
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> view = component.getMultiAdapter((Mammoth(), request), name='edit')
+  >>> len(view.form.form_fields)
+  4
+  >>> [w.__name__ for w in view.form.form_fields]
+  ['a', 'b', 'g', 'd']
+
+"""
+import grok
+from zope import schema
+
+class Mammoth(grok.Model):
+    pass
+
+class Edit(grok.EditForm):
+    form_fields = grok.Fields(
+        a = schema.TextLine(title=u"Alpha"),
+        b = schema.TextLine(title=u"Beta"),
+        g = schema.TextLine(title=u"Gamma"),
+        d = schema.TextLine(title=u"Delta"))
+    



More information about the Checkins mailing list