SVN: r23737 - trunk/quixote/form2

Neil Schemenauer <nascheme-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Thu, 18 Mar 2004 12:47:27 -0500
Newsgroups gmane.comp.web.quixote.cvs
Message-ID <[email protected]>
Author: nascheme
Date: 2004-03-18 12:47:27 -0500 (Thu, 18 Mar 2004)
New Revision: 23737

Added:
   trunk/quixote/form2/compatibility.py
Log:
Add subclass of quixote.form2.Form that makes it easier to transition
form1 forms.


Added: trunk/quixote/form2/compatibility.py
===================================================================
--- trunk/quixote/form2/compatibility.py	2004-03-18 17:46:15 UTC (rev 23736)
+++ trunk/quixote/form2/compatibility.py	2004-03-18 17:47:27 UTC (rev 23737)
@@ -0,0 +1,91 @@
+'''$URL$
+$Id$
+
+A Form subclass that provides close to the same API as the old form
+class (useful for transitioning existing forms).
+'''
+
+from quixote.form2 import Form as _Form, Widget, StringWidget, FileWidget, \
+    PasswordWidget, TextWidget, CheckboxWidget, RadiobuttonsWidget, \
+    SingleSelectWidget, SelectWidget, OptionSelectWidget, \
+    MultipleSelectWidget, SubmitWidget, HiddenWidget, \
+    FloatWidget, IntWidget
+
+
+_widget_names = {
+    "string" : StringWidget,
+    "file" : FileWidget,
+    "password" : PasswordWidget,
+    "text" : TextWidget,
+    "checkbox" : CheckboxWidget,
+    "single_select" : SingleSelectWidget,
+    "radiobuttons" : RadiobuttonsWidget,
+    "multiple_select" : MultipleSelectWidget,
+    "submit_button" : SubmitWidget,
+    "hidden" : HiddenWidget,
+    "float" : FloatWidget,
+    "int" : IntWidget,
+    "option_select" : OptionSelectWidget,
+}
+
+
+class Form(_Form):
+    def __init__(self, *args, **kwargs):
+        _Form.__init__(self, *args, **kwargs)
+        self.cancel_url = None
+
+    def add_widget(self, widget_class, name, value=None,
+                   title=None, hint=None, required=0, **kwargs):
+        try:
+            widget_class = _widget_names[widget_class]
+        except KeyError:
+            pass
+        self.add(widget_class, name, value, title=title, hint=hint,
+                 required=required, **kwargs)
+
+    def add_submit_button(self, name, value):
+        self.add_submit(name, value)
+
+    def add_cancel_button(self, caption, url):
+        self.add_submit("cancel", caption)
+        self.cancel_url = url
+    
+    def render(self, request, action_url=None):
+        if action_url:
+            self.action_url = action_url
+        return _Form.render(self)
+
+    def process(self, request):
+        values = {}
+        for name, widget in self._names.items():
+            values[name] = widget.parse(request)
+        return values
+
+    def action(self, request, submit, values):
+        raise NotImplementedError, "sub-classes must implement 'action()'"
+        
+    def handle(self, request):
+        """handle(request : HTTPRequest) -> string
+
+        Master method for handling forms.  It should be called after
+        initializing a form.  Controls form action based on a request.  You
+        probably should override 'process' and 'action' instead of
+        overriding this method.
+        """
+        if not self.is_submitted():
+            return self.render(request, self.action_url)
+        submit = self.get_submit()
+        if submit == "cancel":
+            return request.redirect(self.cancel_url)
+        values = self.process(request)
+        if submit == "":
+            # The form was submitted by unknown submit button, assume that
+            # the submission was required to update the layout of the form.
+            # Clear the errors and re-render the form.
+            self.clear_errors()
+            return self.render(request, self.action_url)
+
+        if self.has_errors():
+            return self.render(request, self.action_url)
+        else:
+            return self.action(request, submit, values)