[Zope3-checkins] CVS: Zope3/src/zope/app/browser/form/tests - __init__.py:1.2 test_add.py:1.2 test_browserwidget.py:1.2 test_checkboxwidget.py:1.2 test_editview.py:1.2 test_filewidget.py:1.2 test_listwidget.py:1.2 test_multicheckboxwidget.py:1.2 test_multilistwidget.py:1.2 test_passwordwidget.py:1.2 test_radiowidget.py:1.2 test_setprefix.py:1.2 test_textareawidget.py:1.2 test_textwidget.py:1.2 testconfigure.zcml:1.2 testeditform.pt:1.2

Jim Fulton jim@zope.com
Wed, 25 Dec 2002 09:14:05 -0500


Update of /cvs-repository/Zope3/src/zope/app/browser/form/tests
In directory cvs.zope.org:/tmp/cvs-serv15352/src/zope/app/browser/form/tests

Added Files:
	__init__.py test_add.py test_browserwidget.py 
	test_checkboxwidget.py test_editview.py test_filewidget.py 
	test_listwidget.py test_multicheckboxwidget.py 
	test_multilistwidget.py test_passwordwidget.py 
	test_radiowidget.py test_setprefix.py test_textareawidget.py 
	test_textwidget.py testconfigure.zcml testeditform.pt 
Log Message:
Grand renaming:

- Renamed most files (especially python modules) to lower case.

- Moved views and interfaces into separate hierarchies within each
  project, where each top-level directory under the zope package
  is a separate project.

- Moved everything to src from lib/python.

  lib/python will eventually go away. I need access to the cvs
  repository to make this happen, however.

There are probably some bits that are broken. All tests pass
and zope runs, but I haven't tried everything. There are a number
of cleanups I'll work on tomorrow.



=== Zope3/src/zope/app/browser/form/tests/__init__.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:03 2002
+++ Zope3/src/zope/app/browser/form/tests/__init__.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,2 @@
+#
+# This file is necessary to make this directory a package.


=== Zope3/src/zope/app/browser/form/tests/test_add.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:03 2002
+++ Zope3/src/zope/app/browser/form/tests/test_add.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,198 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.add import add, AddViewFactory, AddView
+from zope.interface import Interface
+from zope.schema import TextLine
+from zope.app.interfaces.container import IAdding
+from zope.app.form.widget import CustomWidget
+from zope.app.browser.form.widget import TextWidget as Text
+from zope.publisher.browser import TestRequest
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.component import getView
+
+class Context:
+
+    def resolve(self, name):
+        return globals()[name]
+
+class I(Interface):
+
+    name = TextLine()
+    first = TextLine()
+    last = TextLine()
+    email = TextLine()
+    address = TextLine()
+    foo = TextLine()
+    extra1 = TextLine()
+    extra2 = TextLine()
+
+class C:
+
+    def __init__(self, *args, **kw):
+        self.args = args
+        self.kw = kw
+
+class V:
+    name = CustomWidget(Text)
+    first = CustomWidget(Text)
+    last = CustomWidget(Text)
+    email = CustomWidget(Text)
+    address = CustomWidget(Text)
+    foo = CustomWidget(Text)
+    extra1 = CustomWidget(Text)
+    extra2 = CustomWidget(Text)
+
+
+class SampleData:
+
+    name = "foo"
+    first = "bar"
+    last = "baz"
+    email = "baz@dot.com"
+    address = "aa"
+    foo = "foo"
+    extra1 = "extra1"
+    extra2 = "extra2"
+
+class Test(PlacelessSetup, TestCase):
+
+    def test_add_no_fields(self):
+
+        result1 = add(
+            Context(),
+            schema="I",
+            name="addthis",
+            permission="zope.Public",
+            label="Add this",
+            content_factory="C",
+            arguments="first last",
+            keyword_arguments="email",
+            set_before_add="foo",
+            set_after_add="extra1",
+            )
+
+        result2 = add(
+            Context(),
+            schema="I",
+            name="addthis",
+            permission="zope.Public",
+            label="Add this",
+            content_factory="C",
+            arguments="first last",
+            keyword_arguments="email",
+            set_before_add="foo",
+            set_after_add="extra1",
+            fields="name first last email address foo extra1 extra2",
+            )
+
+        self.assertEqual(result1, result2)
+
+    def test_add(self):
+
+        [(descriminator, callable, args, kw)] = add(
+            Context(),
+            schema="I",
+            name="addthis",
+            permission="zope.Public",
+            label="Add this",
+            content_factory="C",
+            class_="V",
+            arguments="first last",
+            keyword_arguments="email",
+            set_before_add="foo",
+            set_after_add="extra1",
+            )
+
+
+        self.assertEqual(descriminator,
+                         ('http://namespaces.zope.org/form/add',
+                          "addthis", "default"))
+        self.assertEqual(callable, AddViewFactory)
+
+        (name, schema, label, permission, layer, template,
+         default_template, bases, for_, fields, content_factory,
+         arguments, keyword_arguments, set_before_add,
+         set_after_add)  = args
+
+        self.assertEqual(name, 'addthis')
+        self.assertEqual(schema, I)
+        self.assertEqual(label, 'Add this')
+        self.assertEqual(permission, 'zope.Public')
+        self.assertEqual(layer, 'default')
+        self.assertEqual(template, 'edit.pt')
+        self.assertEqual(default_template, 'edit.pt')
+        self.assertEqual(bases, (V, AddView, ))
+        self.assertEqual(for_, IAdding)
+        self.assertEqual(" ".join(fields),
+                         "name first last email address foo extra1 extra2")
+        self.assertEqual(content_factory, C)
+        self.assertEqual(" ".join(arguments),
+                         "first last")
+        self.assertEqual(" ".join(keyword_arguments),
+                         "email")
+        self.assertEqual(" ".join(set_before_add),
+                         "foo")
+        self.assertEqual(" ".join(set_after_add),
+                         "extra1 name address extra2")
+        self.failIf(kw)
+
+        return args
+
+    def test_apply_update(self):
+
+        class Adding:
+
+            __implements__ = IAdding
+
+            def __init__(self, test):
+                self.test = test
+
+            def add(self, ob):
+                self.ob = ob
+                self.test.assertEqual(
+                    ob.__dict__,
+                    {'args': ("bar", "baz"),
+                     'kw': {'email': 'baz@dot.com'},
+                     'foo': 'foo',
+                    })
+                return ob
+            def nextURL(self):
+                return "."
+
+        adding = Adding(self)
+        args = self.test_add()
+        factory = AddViewFactory(*args)
+        request = TestRequest()
+        request.form.update(SampleData.__dict__)
+        view = getView(adding, 'addthis', request)
+        view.apply_update(SampleData.__dict__)
+
+        self.assertEqual(adding.ob.extra1, "extra1")
+        self.assertEqual(adding.ob.extra2, "extra2")
+        self.assertEqual(adding.ob.name, "foo")
+        self.assertEqual(adding.ob.address, "aa")
+
+def test_suite():
+    return TestSuite((
+        makeSuite(Test),
+        ))
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_browserwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:03 2002
+++ Zope3/src/zope/app/browser/form/tests/test_browserwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,123 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+
+$Id$
+"""
+import unittest
+from zope.app.browser.form.widget import BrowserWidget
+from zope.publisher.browser import TestRequest
+from zope.schema import Text
+
+class BrowserWidgetTest(unittest.TestCase):
+
+    _WidgetFactory = BrowserWidget
+
+    def setUp(self):
+        field = Text(__name__ = 'foo', title = u"Foo Title")
+        request = TestRequest()
+        request.form['field.foo'] = u'Foo Value'
+        self._widget = self._WidgetFactory(field, request)
+
+    def _verifyResult(self, result, check_list):
+        for check in check_list:
+            self.assertNotEqual(-1, result.find(check),
+                                '"'+check+'" not found in "'+result+'"')
+
+    def test_required(self):
+        self._widget.context.required = False
+        self.failIf(self._widget.required)
+        self._widget.context.required = True
+        self.failUnless(self._widget.required)
+
+    def test_haveData(self):
+        self.failUnless(self._widget.haveData())
+        del self._widget.request.form['field.foo']
+        self.failIf(self._widget.haveData())
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'text')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+
+    def testRender(self):
+        value = 'Foo Value'
+        check_list = ('type="text"', 'name="field.foo"', 'value="Foo Value"')
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"',) + check_list[1:]
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('type="hidden"', 'style="color: red"') + check_list[1:]
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+    def testLabel(self):
+        label = ' '.join(self._widget.label().strip().split())
+        self.assertEqual(label, '<label for="field.foo">Foo Title</label>')
+
+    def testRow(self):
+        self._widget.request.form.clear()
+        label = ''.join(self._widget.label().strip().split())
+        value = ''.join(self._widget().strip().split())
+        row = ''.join(self._widget.row().strip().split())
+        self.assertEqual(row, '<td>%s</td><td>%s</td>' % (label, value))
+
+class TestWidget(BrowserWidget):
+
+    def _convert(self, v):
+        return v or None
+
+class Test(BrowserWidgetTest):
+
+    _WidgetFactory = TestWidget
+
+    def test_showData(self):
+
+        class W(BrowserWidget):
+            def _convert(self, v):
+                return u'X' + (v or '')
+
+            def _unconvert(self, v):
+                return v and v[1:] or ''
+
+        field = Text(__name__ = 'foo', title = u"Foo Title")
+        request = TestRequest()
+
+        w = W(field, request)
+        self.assertEqual(w._showData(), '')
+        request.form['field.foo'] = 'val'
+        self.assertEqual(w._showData(), 'val')
+
+        w.setData('Xfoo')
+        self.assertEqual(w._showData(), 'foo')
+
+    def test_haveData(self):
+        self.failUnless(self._widget.haveData())
+        del self._widget.request.form['field.foo']
+        self.failIf(self._widget.haveData())
+        self._widget.request.form['field.foo'] = u''
+        self.failIf(self._widget.haveData())
+
+    def test_showData_w_default(self):
+        field = Text(__name__ = 'foo', title = u"Foo Title", default=u"def")
+        request = TestRequest()
+        widget = self._WidgetFactory(field, request)
+        self.assertEqual(widget._showData(), u'def')
+
+
+def test_suite():
+    return unittest.makeSuite(Test)
+
+if __name__ == '__main__':
+    unittest.main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_checkboxwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:03 2002
+++ Zope3/src/zope/app/browser/form/tests/test_checkboxwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,54 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import CheckBoxWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+
+class CheckBoxWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = CheckBoxWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'checkbox')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('default'), 0)
+
+    def testRender(self):
+        value = 1
+        check_list = ('type="checkbox"', 'name="field.foo"',
+                      'checked="checked"')
+        self._verifyResult(self._widget.render(value), check_list)
+        value = 0
+        check_list = check_list[:-1]
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(CheckBoxWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_editview.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_editview.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,139 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.tests.placelesssetup import PlacelessSetup
+from zope.app.event.tests.placelesssetup import getEvents
+from zope.interface import Interface
+from zope.schema import TextLine
+from zope.schema.interfaces import ITextLine
+from zope.publisher.browser import TestRequest
+from zope.publisher.interfaces.browser import IBrowserPresentation
+from zope.app.browser.form.editview import EditView
+from zope.component.view \
+     import provideView, setDefaultViewName
+from zope.app.browser.form.widget import TextWidget
+from zope.app.browser.form.submit import Update
+
+class I(Interface):
+    foo = TextLine(title=u"Foo")
+    bar = TextLine(title=u"Bar")
+    a   = TextLine(title=u"A")
+    b   = TextLine(title=u"B")
+    baz = TextLine(title=u"Baz")
+
+class EV(EditView):
+    schema = I
+
+class C:
+    foo = u"c foo"
+    bar = u"c bar"
+    a   = u"c a"
+    b   = u"c b"
+    baz = u"c baz"
+
+class Test(PlacelessSetup, TestCase):
+
+    def setUp(self):
+        PlacelessSetup.setUp(self)
+        provideView(ITextLine, 'edit', IBrowserPresentation, TextWidget)
+        setDefaultViewName(ITextLine, IBrowserPresentation, "edit")
+
+    def test_setPrefix_and_widgets(self):
+        v = EV(C(), TestRequest())
+        v.setPrefix("test")
+        self.assertEqual(
+            [w.name for w in v.widgets()],
+            ['test.foo', 'test.bar', 'test.a', 'test.b', 'test.baz']
+            )
+
+    def test_apply_update_no_data(self):
+        c = C()
+        request = TestRequest()
+        v = EV(c, request)
+        d = {}
+        d['foo'] = u'c foo'
+        d['bar'] = u'c bar'
+        d['baz'] = u'c baz'
+        self.failUnless(v.apply_update(d))
+        self.assertEqual(c.foo, u'c foo')
+        self.assertEqual(c.bar, u'c bar')
+        self.assertEqual(c.a  , u'c a')
+        self.assertEqual(c.b  , u'c b')
+        self.assertEqual(c.baz, u'c baz')
+        self.failIf(getEvents())
+
+    def test_apply_update(self):
+        c = C()
+        request = TestRequest()
+        v = EV(c, request)
+        d = {}
+        d['foo'] = u'd foo'
+        d['bar'] = u'd bar'
+        d['baz'] = u'd baz'
+        self.failIf(v.apply_update(d))
+        self.assertEqual(c.foo, u'd foo')
+        self.assertEqual(c.bar, u'd bar')
+        self.assertEqual(c.a  , u'c a')
+        self.assertEqual(c.b  , u'c b')
+        self.assertEqual(c.baz, u'd baz')
+        self.failUnless(getEvents(filter=lambda event: event.object == c))
+
+    def test_update_no_update(self):
+        c = C()
+        request = TestRequest()
+        v = EV(c, request)
+        self.assertEqual(v.update(), '')
+        self.assertEqual(c.foo, u'c foo')
+        self.assertEqual(c.bar, u'c bar')
+        self.assertEqual(c.a  , u'c a')
+        self.assertEqual(c.b  , u'c b')
+        self.assertEqual(c.baz, u'c baz')
+        request.form['field.foo'] = u'r foo'
+        request.form['field.bar'] = u'r bar'
+        request.form['field.a']   = u'r a'
+        request.form['field.b']   = u'r b'
+        request.form['field.baz'] = u'r baz'
+        self.assertEqual(v.update(), '')
+        self.assertEqual(c.foo, u'c foo')
+        self.assertEqual(c.bar, u'c bar')
+        self.assertEqual(c.a  , u'c a')
+        self.assertEqual(c.b  , u'c b')
+        self.assertEqual(c.baz, u'c baz')
+        self.failIf(getEvents())
+
+    def test_update(self):
+        c = C()
+        request = TestRequest()
+        v = EV(c, request)
+        request.form[Update] = ''
+        request.form['field.foo'] = u'r foo'
+        request.form['field.bar'] = u'r bar'
+        request.form['field.baz'] = u'r baz'
+        message = v.update()
+        self.failUnless(message.startswith('Updated '), message)
+        self.assertEqual(c.foo, u'r foo')
+        self.assertEqual(c.bar, u'r bar')
+        self.assertEqual(c.a  , u'c a')
+        self.assertEqual(c.b  , u'c b')
+        self.assertEqual(c.baz, u'r baz')
+
+def test_suite():
+    return TestSuite((
+        makeSuite(Test),
+        ))
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_filewidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_filewidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,59 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import FileWidget
+from StringIO import StringIO
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+class FileWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = FileWidget
+
+    def setUp(self):
+        BrowserWidgetTest.setUp(self)
+
+        file = StringIO('Foo Value')
+        file.filename = 'test.txt'
+        self._widget.request.form['field.foo'] = file
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'file')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('default'), '')
+        self.assertEqual(self._widget.getValue('displayWidth'), 20)
+        self.assertEqual(self._widget.getValue('displayMaxWidth'), '')
+
+    def testRender(self):
+        value = 'Foo Value'
+        check_list = ('type="file"', 'name="field.foo"', 'size="20"')
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(FileWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_listwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_listwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,74 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import ListWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+class ListWidgetTest(BrowserWidgetTest):
+
+    def setUp(self):
+        BrowserWidgetTest.setUp(self)
+        self._widget.context.allowed_values = (u'foo', u'bar')
+
+    _WidgetFactory = ListWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('cssClass'), "")
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('firstItem'), 0)
+        self.assertEqual(self._widget.getValue('size'), 5)
+
+
+    def testRenderItem(self):
+        check_list = ('option', 'value="foo"', 'Foo')
+        self._verifyResult(
+            self._widget.renderItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+        check_list += ('selected="selected"',)
+        self._verifyResult(
+            self._widget.renderSelectedItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+
+
+    def testRenderItems(self):
+        check_list = ('option', 'value="foo"', 'bar',
+                      'value="foo"', 'foo', 'selected="selected"')
+        self._verifyResult('\n'.join(self._widget.renderItems('foo')),
+                           check_list)
+
+
+    def testRender(self):
+        value = 'foo'
+        check_list = ('select', 'name="field.foo"', 'size="5"',
+                      'option', 'value="foo"', '>foo<',
+                      'value="foo"', '>bar<', 'selected="selected"')
+        self._verifyResult(self._widget.render(value), check_list)
+
+        check_list = ('type="hidden"', 'name="field.foo"', 'value="foo"')
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(ListWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_multicheckboxwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_multicheckboxwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,72 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import MultiCheckBoxWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+class MultiCheckBoxWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = MultiCheckBoxWidget
+
+    def setUp(self):
+        BrowserWidgetTest.setUp(self)
+        self._widget.context.allowed_values = (u'foo', u'bar')
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('cssClass'), "")
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('orientation'), 'vertical')
+
+
+    def testRenderItem(self):
+        check_list = ('type="checkbox"', 'name="field.bar"', 'value="foo"',
+                      'Foo')
+        self._verifyResult(
+            self._widget.renderItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+        check_list += ('checked="checked"',)
+        self._verifyResult(
+            self._widget.renderSelectedItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+
+
+    def testRenderItems(self):
+        check_list = ('type="checkbox"', 'name="field.foo"', 'value="bar"',
+                      'bar', 'value="foo"', 'foo', 'checked="checked"')
+        self._verifyResult('\n'.join(self._widget.renderItems('bar')),
+                           check_list)
+
+
+    def testRender(self):
+        value = 'bar'
+        check_list = ('type="checkbox"', 'name="field.foo"', 'value="bar"',
+                      'bar', 'value="foo"', 'foo', 'checked="checked"')
+        self._verifyResult(self._widget.render(value), check_list)
+
+        check_list = ('type="hidden"', 'name="field.foo"', 'value="bar"')
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+def test_suite():
+    return makeSuite(MultiCheckBoxWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_multilistwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_multilistwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,74 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import MultiListWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+class MultiListWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = MultiListWidget
+
+    def setUp(self):
+        BrowserWidgetTest.setUp(self)
+        self._widget.context.allowed_values = (u'foo', u'bar')
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('cssClass'), "")
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('size'), 5)
+
+
+    def testRenderItem(self):
+        check_list = ('option', 'value="foo"', 'Foo')
+        self._verifyResult(
+            self._widget.renderItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+        check_list += ('selected="selected"',)
+        self._verifyResult(
+            self._widget.renderSelectedItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+
+
+    def testRenderItems(self):
+        check_list = ('option', 'value="foo"', 'bar',
+                      'value="foo"', 'foo', 'selected="selected"')
+        self._verifyResult('\n'.join(self._widget.renderItems('foo')),
+                           check_list)
+
+
+    def testRender(self):
+        value = 'foo'
+        check_list = ('select', 'name="field.foo"', 'size="5"',
+                      'option', 'value="foo"', '>foo<',
+                      'value="foo"', '>bar<', 'selected="selected"',
+                      'multiple="multiple"')
+        self._verifyResult(self._widget.render(value), check_list)
+
+        check_list = ('type="hidden"', 'name="field.foo"', 'value="foo"')
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(MultiListWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_passwordwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_passwordwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,53 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import PasswordWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+
+class PasswordWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = PasswordWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'password')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('default'), '')
+        self.assertEqual(self._widget.getValue('displayWidth'), 20)
+        self.assertEqual(self._widget.getValue('displayMaxWidth'), '')
+
+    def testRender(self):
+        value = 'Foo Value'
+        check_list = ('type="password"', 'name="field.foo"',
+                      'value="Foo Value"', 'size="20"')
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(PasswordWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_radiowidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_radiowidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,74 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import RadioWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+class RadioWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = RadioWidget
+
+    def setUp(self):
+        BrowserWidgetTest.setUp(self)
+        self._widget.context.allowed_values = (u'foo', u'bar')
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('cssClass'), "")
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('firstItem'), 0)
+        self.assertEqual(self._widget.getValue('orientation'), 'vertical')
+
+
+    def testRenderItem(self):
+        check_list = ('type="radio"', 'name="field.bar"', 'value="foo"',
+                      'Foo')
+        self._verifyResult(
+            self._widget.renderItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+        check_list += ('checked="checked"',)
+        self._verifyResult(
+            self._widget.renderSelectedItem('Foo', 'foo', 'field.bar', None),
+            check_list)
+
+
+    def testRenderItems(self):
+        check_list = ('type="radio"', 'name="field.foo"', 'value="bar"',
+                      'bar', 'value="foo"', 'foo', 'checked="checked"')
+        self._verifyResult('\n'.join(self._widget.renderItems('bar')),
+                           check_list)
+
+
+    def testRender(self):
+        value = 'bar'
+        check_list = ('type="radio"', 'name="field.foo"', 'value="bar"',
+                      'bar', 'value="foo"', 'foo', 'checked="checked"')
+        self._verifyResult(self._widget.render(value), check_list)
+
+        check_list = ('type="hidden"', 'name="field.foo"', 'value="bar"')
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(RadioWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_setprefix.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_setprefix.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,59 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import TextWidget
+from zope.publisher.browser import TestRequest
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+from zope.schema import Text
+
+
+class Test(TestCase):
+
+    def setUp(self):
+        field = Text(__name__ = 'foo')
+        request = TestRequest()
+        request.form['spam.foo'] = u'Foo Value'
+        self._widget = TextWidget(field, request)
+        self._widget.setPrefix('spam')
+
+    def testGetData(self):
+        self.assertEqual(self._widget.getData(), u'Foo Value')
+
+    def testRender(self):
+        value = 'Foo Value 2'
+        check_list = ('type="text"', 'name="spam.foo"', 'value="Foo Value 2"',
+                      'size="20"')
+        self._widget.setData(value)
+        self._verifyResult(self._widget(), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self._verifyResult(self._widget.hidden(), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.hidden(), check_list)
+
+    def _verifyResult(self, result, check_list):
+        for check in check_list:
+            self.assertNotEqual(-1, result.find(check),
+                                '"'+check+'" not found in "'+result+'"')
+
+
+
+def test_suite():
+    return makeSuite(Test)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_textareawidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_textareawidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,59 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import TextAreaWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+
+class TextAreaWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = TextAreaWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'text')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('width'), 60)
+        self.assertEqual(self._widget.getValue('height'), 15)
+
+    def testRender(self):
+        value = "Foo Value"
+        check_list = ('rows="15"', 'cols="60"', 'name="field.foo"', 'textarea')
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"', 'name="field.foo"', 'value="Foo Value"')
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+    def testRow(self):
+        self._widget.request.form.clear()
+        label = ''.join(self._widget.label().strip().split())
+        value = ''.join(self._widget().strip().split())
+        row = ''.join(self._widget.row().strip().split())
+        self.assertEqual(row,
+                         '<tdcolspan="2">%s<br/>%s</td>' % (label, value))
+
+
+
+def test_suite():
+    return makeSuite(TextAreaWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/test_textwidget.py 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/test_textwidget.py	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,53 @@
+##############################################################################
+#
+# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""
+$Id$
+"""
+from unittest import TestCase, TestSuite, main, makeSuite
+from zope.app.browser.form.widget import TextWidget
+
+from zope.app.browser.form.tests.test_browserwidget import BrowserWidgetTest
+
+
+class TextWidgetTest(BrowserWidgetTest):
+
+    _WidgetFactory = TextWidget
+
+    def testProperties(self):
+        self.assertEqual(self._widget.getValue('tag'), 'input')
+        self.assertEqual(self._widget.getValue('type'), 'text')
+        self.assertEqual(self._widget.getValue('cssClass'), '')
+        self.assertEqual(self._widget.getValue('extra'), '')
+        self.assertEqual(self._widget.getValue('default'), '')
+        self.assertEqual(self._widget.getValue('displayWidth'), 20)
+        self.assertEqual(self._widget.getValue('displayMaxWidth'), '')
+
+    def testRender(self):
+        value = 'Foo Value'
+        check_list = ('type="text"', 'name="field.foo"', 'value="Foo Value"',
+                      'size="20"')
+        self._verifyResult(self._widget.render(value), check_list)
+        check_list = ('type="hidden"',) + check_list[1:-1]
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+        check_list = ('style="color: red"',) + check_list
+        self._widget.extra = 'style="color: red"'
+        self._verifyResult(self._widget.renderHidden(value), check_list)
+
+
+
+def test_suite():
+    return makeSuite(TextWidgetTest)
+
+if __name__=='__main__':
+    main(defaultTest='test_suite')


=== Zope3/src/zope/app/browser/form/tests/testconfigure.zcml 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/testconfigure.zcml	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,15 @@
+<zopeConfigure
+   xmlns='http://namespaces.zope.org/zope'
+   xmlns:browser='http://namespaces.zope.org/browser'
+>
+
+  <!-- Test view for folders -->
+  <browser:view
+      permission="zope.View" 
+      for="zope.app.interfaces.content.folder.IFolder"  
+      factory=".SchemaTestObject.EditFactory">
+      <browser:page name="testSchemaFormView.html" attribute="form" />
+      <browser:page name="testSchemaFormAction.html" attribute="action" />
+  </browser:view>
+
+</zopeConfigure>


=== Zope3/src/zope/app/browser/form/tests/testeditform.pt 1.1 => 1.2 ===
--- /dev/null	Wed Dec 25 09:14:04 2002
+++ Zope3/src/zope/app/browser/form/tests/testeditform.pt	Wed Dec 25 09:12:32 2002
@@ -0,0 +1,40 @@
+<html>
+  <head>
+    <title>Simple Edit Form</title>
+  </head>
+
+  <body>
+
+    <h1>This is a Schema produced form</h1>
+
+    <div tal:condition="python: options.has_key('errors') and 
+                                options['errors']">
+      <span style="font-weight: bold">Errors:</span>
+      <div tal:repeat="error options/errors | nothing">
+        <span tal:replace="python: error[0].title" />: 
+        <span tal:replace="python: error[1].error_name" />
+      </div>
+    </div>
+    <br />
+    <form action="testSchemaFormAction.html" method="post">
+      <input type="hidden" name="nextURL" value=""
+          tal:attributes="value request/URL" />   
+      <table>
+
+        <tal:block repeat="field view/getFields">
+          <tr>
+            <th tal:content="field/title">Title:</th>
+	    <td tal:content="structure python: view.renderField(field)">
+              <input size="20" />
+            </td>            
+          </tr>
+	</tal:block>
+
+      </table>
+ 
+      <input type="submit" name="save" value="Save" />
+
+    </form>
+  </body>
+
+</html>