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)