Changeset 196
- Timestamp:
- 03/27/06 19:52:01 (3 years ago)
- Files:
-
- trunk/examples.tac (modified) (1 diff)
- trunk/formal/__init__.py (modified) (3 diffs)
- trunk/formal/converters.py (modified) (7 diffs)
- trunk/formal/examples/actionbuttons.py (modified) (2 diffs)
- trunk/formal/examples/datestimes.py (modified) (2 diffs)
- trunk/formal/examples/fileupload.py (modified) (2 diffs)
- trunk/formal/examples/main.py (modified) (5 diffs)
- trunk/formal/examples/missing.py (modified) (2 diffs)
- trunk/formal/examples/nofields.py (modified) (2 diffs)
- trunk/formal/examples/prepopulate.py (modified) (2 diffs)
- trunk/formal/examples/required.py (modified) (2 diffs)
- trunk/formal/examples/restwidget.py (modified) (2 diffs)
- trunk/formal/examples/selections.py (modified) (2 diffs)
- trunk/formal/examples/simple.py (modified) (2 diffs)
- trunk/formal/examples/smartupload.py (modified) (2 diffs)
- trunk/formal/examples/types.py (modified) (2 diffs)
- trunk/formal/examples/validator.py (modified) (4 diffs)
- trunk/formal/experimental.py (modified) (1 diff)
- trunk/formal/form.py (modified) (18 diffs)
- trunk/formal/htmleditor.py (modified) (4 diffs)
- trunk/formal/iformal.py (moved) (moved from trunk/formal/iforms.py)
- trunk/formal/test/test_converters.py (modified) (1 diff)
- trunk/formal/test/test_form.py (modified) (2 diffs)
- trunk/formal/test/test_formerrors.py (modified) (1 diff)
- trunk/formal/test/test_types.py (modified) (4 diffs)
- trunk/formal/test/test_util.py (modified) (1 diff)
- trunk/formal/test/test_validation.py (modified) (1 diff)
- trunk/formal/test/test_widget.py (modified) (6 diffs)
- trunk/formal/types.py (modified) (1 diff)
- trunk/formal/util.py (modified) (2 diffs)
- trunk/formal/validation.py (modified) (5 diffs)
- trunk/formal/widget.py (modified) (53 diffs)
- trunk/formal/widgets/multiselect.py (modified) (6 diffs)
- trunk/formal/widgets/restwidget.py (modified) (3 diffs)
- trunk/setup.py (modified) (2 diffs)
- trunk/test.tac (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/examples.tac
r65 r196 1 1 from twisted.application import internet, service 2 2 from nevow import appserver 3 from form s.examples import main3 from formal.examples import main 4 4 5 5 application = service.Application('examples') trunk/formal/__init__.py
r194 r196 9 9 10 10 from nevow import static 11 from form s.types import *12 from form s.validation import *13 from form s.widget import *14 from form s.widgets.restwidget import *15 from form s.widgets.multiselect import *16 from form s.form import Form, ResourceMixin, renderForm17 from form s import iforms11 from formal.types import * 12 from formal.validation import * 13 from formal.widget import * 14 from formal.widgets.restwidget import * 15 from formal.widgets.multiselect import * 16 from formal.form import Form, ResourceMixin, renderForm 17 from formal import iformal 18 18 19 19 def widgetFactory(widgetClass, *a, **k): … … 29 29 formsJS = static.File(os.path.join(os.path.split(__file__)[0], 'js')) 30 30 else: 31 from form s.util import LazyResource32 defaultCSS = LazyResource(lambda: static.File(pkg_resources.resource_filename('form s', 'forms.css')))33 formsJS = LazyResource(lambda: static.File(pkg_resources.resource_filename('form s', 'js')))31 from formal.util import LazyResource 32 defaultCSS = LazyResource(lambda: static.File(pkg_resources.resource_filename('formal', 'forms.css'))) 33 formsJS = LazyResource(lambda: static.File(pkg_resources.resource_filename('formal', 'js'))) 34 34 del LazyResource 35 35 36 36 # Register standard adapters 37 37 from twisted.python.components import registerAdapter 38 from form simport converters39 from form s.util import SequenceKeyLabelAdapter40 registerAdapter(TextInput, String, iform s.IWidget)41 registerAdapter(TextInput, Integer, iform s.IWidget)42 registerAdapter(TextInput, Float, iform s.IWidget)43 registerAdapter(Checkbox, Boolean, iform s.IWidget)44 registerAdapter(DatePartsInput, Date, iform s.IWidget)45 registerAdapter(TextInput, Time, iform s.IWidget)46 registerAdapter(FileUploadRaw, File, iform s.IWidget)47 registerAdapter(SequenceKeyLabelAdapter, tuple, iform s.IKey)48 registerAdapter(SequenceKeyLabelAdapter, tuple, iform s.ILabel)49 registerAdapter(converters.NullConverter, String, iform s.IStringConvertible)50 registerAdapter(converters.DateToDateTupleConverter, Date, iform s.IDateTupleConvertible)51 registerAdapter(converters.BooleanToStringConverter, Boolean, iform s.IBooleanConvertible)52 registerAdapter(converters.IntegerToStringConverter, Integer, iform s.IStringConvertible)53 registerAdapter(converters.FloatToStringConverter, Float, iform s.IStringConvertible)54 registerAdapter(converters.DateToStringConverter, Date, iform s.IStringConvertible)55 registerAdapter(converters.TimeToStringConverter, Time, iform s.IStringConvertible)56 registerAdapter(converters.NullConverter, File, iform s.IFileConvertible)57 registerAdapter(converters.NullConverter, Sequence, iform s.ISequenceConvertible)38 from formal import converters 39 from formal.util import SequenceKeyLabelAdapter 40 registerAdapter(TextInput, String, iformal.IWidget) 41 registerAdapter(TextInput, Integer, iformal.IWidget) 42 registerAdapter(TextInput, Float, iformal.IWidget) 43 registerAdapter(Checkbox, Boolean, iformal.IWidget) 44 registerAdapter(DatePartsInput, Date, iformal.IWidget) 45 registerAdapter(TextInput, Time, iformal.IWidget) 46 registerAdapter(FileUploadRaw, File, iformal.IWidget) 47 registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.IKey) 48 registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.ILabel) 49 registerAdapter(converters.NullConverter, String, iformal.IStringConvertible) 50 registerAdapter(converters.DateToDateTupleConverter, Date, iformal.IDateTupleConvertible) 51 registerAdapter(converters.BooleanToStringConverter, Boolean, iformal.IBooleanConvertible) 52 registerAdapter(converters.IntegerToStringConverter, Integer, iformal.IStringConvertible) 53 registerAdapter(converters.FloatToStringConverter, Float, iformal.IStringConvertible) 54 registerAdapter(converters.DateToStringConverter, Date, iformal.IStringConvertible) 55 registerAdapter(converters.TimeToStringConverter, Time, iformal.IStringConvertible) 56 registerAdapter(converters.NullConverter, File, iformal.IFileConvertible) 57 registerAdapter(converters.NullConverter, Sequence, iformal.ISequenceConvertible) 58 58 try: 59 59 Decimal … … 61 61 pass 62 62 else: 63 registerAdapter(TextInput, Decimal, iform s.IWidget)64 registerAdapter(converters.DecimalToStringConverter, Decimal, iform s.IStringConvertible)63 registerAdapter(TextInput, Decimal, iformal.IWidget) 64 registerAdapter(converters.DecimalToStringConverter, Decimal, iformal.IStringConvertible) 65 65 del SequenceKeyLabelAdapter 66 66 del registerAdapter trunk/formal/converters.py
r194 r196 9 9 except ImportError: 10 10 haveDecimal = False 11 from form s import iforms, validation11 from formal import iformal, validation 12 12 from zope.interface import implements 13 13 … … 19 19 20 20 class NullConverter(_Adapter): 21 implements( iform s.IStringConvertible )21 implements( iformal.IStringConvertible ) 22 22 23 23 def fromType(self, value): … … 33 33 34 34 class NumberToStringConverter(_Adapter): 35 implements( iform s.IStringConvertible )35 implements( iformal.IStringConvertible ) 36 36 cast = None 37 37 … … 70 70 71 71 class BooleanToStringConverter(_Adapter): 72 implements( iform s.IStringConvertible )72 implements( iformal.IStringConvertible ) 73 73 74 74 def fromType(self, value): … … 90 90 91 91 class DateToStringConverter(_Adapter): 92 implements( iform s.IStringConvertible )92 implements( iformal.IStringConvertible ) 93 93 94 94 def fromType(self, value): … … 117 117 118 118 class TimeToStringConverter(_Adapter): 119 implements( iform s.IStringConvertible )119 implements( iformal.IStringConvertible ) 120 120 121 121 def fromType(self, value): … … 160 160 161 161 class DateToDateTupleConverter(_Adapter): 162 implements( iform s.IDateTupleConvertible )162 implements( iformal.IDateTupleConvertible ) 163 163 164 164 def fromType(self, value): trunk/formal/examples/actionbuttons.py
r134 r196 1 1 from nevow import url 2 import form s3 from form s.examples import main2 import formal 3 from formal.examples import main 4 4 5 5 class ActionButtonsPage(main.FormExamplePage): … … 9 9 10 10 def form_example(self, ctx): 11 form = form s.Form()12 form.addField('aString', form s.String(required=True))11 form = formal.Form() 12 form.addField('aString', formal.String(required=True)) 13 13 form.addAction(self.submitted, label="Click, click, clickety-click!") 14 14 form.addAction(self.redirect, 'back', validate=False) trunk/formal/examples/datestimes.py
r135 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class DatesTimesFormPage(main.FormExamplePage): … … 8 8 9 9 def form_example(self, ctx): 10 form = form s.Form()11 form.addField('isoFormatDate', form s.Date(), forms.TextInput)12 form.addField('monthFirstDate', form s.Date(), forms.DatePartsInput)13 form.addField('dayFirstDate', form s.Date(), forms.widgetFactory(forms.DatePartsInput, dayFirst=True))14 form.addField('monthYearDate', form s.Date(), forms.MMYYDatePartsInput)15 form.addField('twoCharYearDate', form s.Date(), forms.widgetFactory(forms.DatePartsInput, twoCharCutoffYear=70))16 form.addField('time', form s.Time())10 form = formal.Form() 11 form.addField('isoFormatDate', formal.Date(), formal.TextInput) 12 form.addField('monthFirstDate', formal.Date(), formal.DatePartsInput) 13 form.addField('dayFirstDate', formal.Date(), formal.widgetFactory(formal.DatePartsInput, dayFirst=True)) 14 form.addField('monthYearDate', formal.Date(), formal.MMYYDatePartsInput) 15 form.addField('twoCharYearDate', formal.Date(), formal.widgetFactory(formal.DatePartsInput, twoCharCutoffYear=70)) 16 form.addField('time', formal.Time()) 17 17 form.addAction(self.submitted) 18 18 return form trunk/formal/examples/fileupload.py
r134 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class FileUploadFormPage(main.FormExamplePage): … … 8 8 9 9 def form_example(self, ctx): 10 form = form s.Form()11 form.addField('file', form s.File())10 form = formal.Form() 11 form.addField('file', formal.File()) 12 12 form.addAction(self.submitted) 13 13 return form trunk/formal/examples/main.py
r185 r196 3 3 from twisted.python import reflect 4 4 from nevow import appserver, inevow, loaders, rend, static, tags as T, url 5 import form s5 import formal 6 6 7 7 DOCTYPE = T.xml('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">') … … 9 9 10 10 examples = [ 11 'form s.examples.simple.SimpleFormPage',12 'form s.examples.types.TypesFormPage',13 'form s.examples.required.RequiredFormPage',14 'form s.examples.missing.MissingFormPage',15 'form s.examples.prepopulate.PrepopulateFormPage',16 'form s.examples.fileupload.FileUploadFormPage',17 'form s.examples.smartupload.SmartUploadFormPage',18 'form s.examples.selections.SelectionFormPage',19 'form s.examples.datestimes.DatesTimesFormPage',20 'form s.examples.actionbuttons.ActionButtonsPage',21 'form s.examples.validator.ValidatorFormPage',22 'form s.examples.restwidget.ReSTWidgetFormPage',23 'form s.examples.nofields.NoFieldsFormPage',11 'formal.examples.simple.SimpleFormPage', 12 'formal.examples.types.TypesFormPage', 13 'formal.examples.required.RequiredFormPage', 14 'formal.examples.missing.MissingFormPage', 15 'formal.examples.prepopulate.PrepopulateFormPage', 16 'formal.examples.fileupload.FileUploadFormPage', 17 'formal.examples.smartupload.SmartUploadFormPage', 18 'formal.examples.selections.SelectionFormPage', 19 'formal.examples.datestimes.DatesTimesFormPage', 20 'formal.examples.actionbuttons.ActionButtonsPage', 21 'formal.examples.validator.ValidatorFormPage', 22 'formal.examples.restwidget.ReSTWidgetFormPage', 23 'formal.examples.nofields.NoFieldsFormPage', 24 24 ] 25 25 … … 65 65 66 66 67 class FormExamplePage(form s.ResourceMixin, rend.Page):67 class FormExamplePage(formal.ResourceMixin, rend.Page): 68 68 """ 69 69 A base page for the actual examples. The page renders something sensible, … … 73 73 Each example page is expected to provide the title and description 74 74 attributes as well as a form_example method that builds and returns a 75 form s.Form instance.75 formal.Form instance. 76 76 """ 77 77 docFactory = loaders.stan( … … 103 103 104 104 # Add child_ attributes 105 examples_css = pkg_resources.resource_filename('form s.examples', 'examples.css')105 examples_css = pkg_resources.resource_filename('formal.examples', 'examples.css') 106 106 setattr(RootPage, 'child_examples.css', static.File(examples_css)) 107 setattr(RootPage, 'child_forms.css', form s.defaultCSS)108 setattr(RootPage, 'child_js', form s.formsJS)107 setattr(RootPage, 'child_forms.css', formal.defaultCSS) 108 setattr(RootPage, 'child_js', formal.formsJS) trunk/formal/examples/missing.py
r134 r196 1 1 from datetime import date 2 import form s3 from form s.examples import main2 import formal 3 from formal.examples import main 4 4 5 5 class MissingFormPage(main.FormExamplePage): … … 9 9 10 10 def form_example(self, ctx): 11 form = form s.Form()12 form.addField('aString', form s.String(missing='<nothing>'))13 form.addField('aDate', form s.Date(missing=date(2005, 8, 1)))11 form = formal.Form() 12 form.addField('aString', formal.String(missing='<nothing>')) 13 form.addField('aDate', formal.Date(missing=date(2005, 8, 1))) 14 14 form.addAction(self.submitted) 15 15 return form trunk/formal/examples/nofields.py
r185 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class NoFieldsFormPage(main.FormExamplePage): … … 9 9 10 10 def form_example(self, ctx): 11 form = form s.Form()11 form = formal.Form() 12 12 form.addAction(self.submitted) 13 13 return form trunk/formal/examples/prepopulate.py
r134 r196 1 1 from datetime import datetime 2 import form s3 from form s.examples import main2 import formal 3 from formal.examples import main 4 4 5 5 class PrepopulateFormPage(main.FormExamplePage): … … 9 9 10 10 def form_example(self, ctx): 11 form = form s.Form()12 form.addField('aString', form s.String())13 form.addField('aTime', form s.Time())11 form = formal.Form() 12 form.addField('aString', formal.String()) 13 form.addField('aTime', formal.Time()) 14 14 form.addAction(self.submitted) 15 15 form.data = { trunk/formal/examples/required.py
r134 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class RequiredFormPage(main.FormExamplePage): … … 8 8 9 9 def form_example(self, ctx): 10 form = form s.Form()11 form.addField('name', form s.String(required=True))12 form.addField('age', form s.Integer())10 form = formal.Form() 11 form.addField('name', formal.String(required=True)) 12 form.addField('age', formal.Integer()) 13 13 form.addAction(self.submitted) 14 14 return form trunk/formal/examples/restwidget.py
r175 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 # Let the examples run if docutils is not installed … … 45 45 46 46 def form_example(self, ctx): 47 form = form s.Form()48 form.addField('restString', form s.String(required=True),49 widgetFactory=form s.ReSTTextArea)47 form = formal.Form() 48 form.addField('restString', formal.String(required=True), 49 widgetFactory=formal.ReSTTextArea) 50 50 if docutilsAvailable: 51 51 w = Writer() 52 52 w.translator_class = CustomisedHTMLTranslator 53 form.addField('customRestString', form s.String(required=True),54 form s.widgetFactory(forms.ReSTTextArea, restWriter=w))53 form.addField('customRestString', formal.String(required=True), 54 formal.widgetFactory(formal.ReSTTextArea, restWriter=w)) 55 55 form.addAction(self.submitted) 56 56 return form trunk/formal/examples/selections.py
r191 r196 1 1 from twisted.internet import defer 2 2 from datetime import date 3 import form s4 from form s.examples import main3 import formal 4 from formal.examples import main 5 5 6 6 # A boring list of (value, label) pairs. … … 30 30 31 31 def form_example(self, ctx): 32 form = form s.Form()33 form.addField('required', form s.String(required=True))34 form.addField('oneString', form s.String(),35 form s.widgetFactory(forms.SelectChoice, options=strings))36 form.addField('anotherString', form s.String(),37 form s.widgetFactory(forms.SelectChoice, options=data_strings))38 form.addField('oneMoreString', form s.String(required=True),39 form s.widgetFactory(forms.RadioChoice, options=data_strings))40 form.addField('oneDate', form s.Date(),41 form s.widgetFactory(forms.SelectChoice, options=dates))42 form.addField('multipleStrings', form s.Sequence(forms.String()),43 form s.widgetFactory(forms.CheckboxMultiChoice,32 form = formal.Form() 33 form.addField('required', formal.String(required=True)) 34 form.addField('oneString', formal.String(), 35 formal.widgetFactory(formal.SelectChoice, options=strings)) 36 form.addField('anotherString', formal.String(), 37 formal.widgetFactory(formal.SelectChoice, options=data_strings)) 38 form.addField('oneMoreString', formal.String(required=True), 39 formal.widgetFactory(formal.RadioChoice, options=data_strings)) 40 form.addField('oneDate', formal.Date(), 41 formal.widgetFactory(formal.SelectChoice, options=dates)) 42 form.addField('multipleStrings', formal.Sequence(formal.String()), 43 formal.widgetFactory(formal.CheckboxMultiChoice, 44 44 options=data_strings)) 45 form.addField('multipleDates', form s.Sequence(forms.Date()),46 form s.widgetFactory(forms.CheckboxMultiChoice, options=dates))47 form.addField('differentNoneSelect', form s.String(),48 form s.widgetFactory(forms.SelectChoice, options=strings,45 form.addField('multipleDates', formal.Sequence(formal.Date()), 46 formal.widgetFactory(formal.CheckboxMultiChoice, options=dates)) 47 form.addField('differentNoneSelect', formal.String(), 48 formal.widgetFactory(formal.SelectChoice, options=strings, 49 49 noneOption=differentNone)) 50 form.addField('differentNoneRadios', form s.String(),51 form s.widgetFactory(forms.RadioChoice, options=data_strings,50 form.addField('differentNoneRadios', formal.String(), 51 formal.widgetFactory(formal.RadioChoice, options=data_strings, 52 52 noneOption=differentNone)) 53 form.addField('selectOther', form s.String(),54 form s.widgetFactory(forms.SelectOtherChoice, options=['Mr',53 form.addField('selectOther', formal.String(), 54 formal.widgetFactory(formal.SelectOtherChoice, options=['Mr', 55 55 'Mrs'])) 56 form.addField('selectOtherRequired', form s.String(required=True),57 form s.widgetFactory(forms.SelectOtherChoice, options=['Mr',56 form.addField('selectOtherRequired', formal.String(required=True), 57 formal.widgetFactory(formal.SelectOtherChoice, options=['Mr', 58 58 'Mrs'])) 59 form.addField('multiselect', form s.String(),60 form s.widgetFactory(forms.MultiselectChoice, options=strings))59 form.addField('multiselect', formal.String(), 60 formal.widgetFactory(formal.MultiselectChoice, options=strings)) 61 61 form.addAction(self.submitted) 62 62 return form trunk/formal/examples/simple.py
r134 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class SimpleFormPage(main.FormExamplePage): … … 8 8 9 9 def form_example(self, ctx): 10 form = form s.Form()11 form.addField('aString', form s.String())10 form = formal.Form() 11 form.addField('aString', formal.String()) 12 12 form.addAction(self.submitted) 13 13 return form trunk/formal/examples/smartupload.py
r134 r196 1 import form s2 from form s.examples import main1 import formal 2 from formal.examples import main 3 3 4 4 class SmartUploadFormPage(main.FormExamplePage): … … 8 8 9 9 def form_example(self, ctx): 10 form = form s.Form()11 form.addField('required', form s.String(required=True))12 form.addField('file', form s.File(), forms.FileUploadWidget)10 form = formal.Form() 11 form.addField('required', formal.String(required=True)) 12 form.addField('file', formal.File(), formal.FileUploadWidget) 13 13 form.addAction(self.submitted) 14 14 return form trunk/formal/examples/types.py
r193 r196 4 4 except ImportError: 5 5 haveDecimal = False 6 import form s7 from form s.examples import main6 import formal 7 from formal.examples import main 8 8 9 9 class TypesFormPage(main.FormExamplePage): … … 13 13 14 14 def form_example(self, ctx): 15 form = form s.Form()16 form.addField('aString', form s.String())17 form.addField('aInteger', form s.Integer())18 form.addField('aFloat', form s.Float())15 form = formal.Form() 16 form.addField('aString', formal.String()) 17 form.addField('aInteger', formal.Integer()) 18 form.addField('aFloat', formal.Float()) 19 19 if haveDecimal: 20 form.addField('aDecimal', form s.Decimal())21 form.addField('aBoolean', form s.Boolean())22 form.addField('aDate', form s.Date())23 form.addField('aTime', form s.Time())20 form.addField('aDecimal', formal.Decimal()) 21 form.addField('aBoolean', formal.Boolean()) 22 form.addField('aDate', formal.Date()) 23 form.addField('aTime', formal.Time()) 24 24 form.addAction(self.submitted) 25 25 return form trunk/formal/examples/validator.py
r138 r196 1 1 from zope.interface import implements 2 import form s3 from form s import iforms4 from form s.examples import main2 import formal 3 from formal import iformal 4 from formal.examples import main 5 5 6 6 # A not-too-good regex for matching an IP address. … … 13 13 14 14 def form_example(self, ctx): 15 form = form s.Form()15 form = formal.Form() 16 16 # This actually installs a RequiredValidator for you. 17 form.addField('required', form s.String(required=True))17 form.addField('required', formal.String(required=True)) 18 18 # Exactly the same as above, only with a "manually" installed validator. 19 form.addField('required2', form s.String(validators=[forms.RequiredValidator()]))19 form.addField('required2', formal.String(validators=[formal.RequiredValidator()])) 20 20 # Check for a minimum length, if anything entered. 21 form.addField('atLeastFiveChars', form s.String(validators=[forms.LengthValidator(min=5)]))21 form.addField('atLeastFiveChars', formal.String(validators=[formal.LengthValidator(min=5)])) 22 22 # Check for a minimum length, if anything entered. 23 form.addField('ipAddress', form s.String(strip=True, validators=[forms.PatternValidator(regex=IP_ADDRESS_PATTERN)]))23 form.addField('ipAddress', formal.String(strip=True, validators=[formal.PatternValidator(regex=IP_ADDRESS_PATTERN)])) 24 24 # Check for the word 'silly' 25 form.addField('silly', form s.String(validators=[SillyValidator()]))25 form.addField('silly', formal.String(validators=[SillyValidator()])) 26 26 # Check age is between 18 and 30 27 form.addField('ohToBeYoungAgain', form s.Integer(validators=[forms.RangeValidator(min=18, max=30)]))27 form.addField('ohToBeYoungAgain', formal.Integer(validators=[formal.RangeValidator(min=18, max=30)])) 28 28 form.addAction(self.submitted) 29 29 return form … … 36 36 A pointless example that checks a specific word, 'silly', is entered. 37 37 """ 38 implements(iform s.IValidator)38 implements(iformal.IValidator) 39 39 40 40 word = u'silly' … … 44 44 return 45 45 if value.lower() != self.word.lower(): 46 raise form s.FieldValidationError(u'You must enter \'%s\''%self.word)46 raise formal.FieldValidationError(u'You must enter \'%s\''%self.word) trunk/formal/experimental.py
r115 r196 1 1 from nevow import appserver, rend 2 from form s.form import FormsResourceBehaviour2 from formal.form import FormsResourceBehaviour 3 3 4 4 trunk/formal/form.py
r194 r196 8 8 from nevow import appserver, context, loaders, inevow, tags as T, url 9 9 from nevow.util import getPOSTCharset 10 from form s import iforms, util, validation10 from formal import iformal, util, validation 11 11 from resourcemanager import ResourceManager 12 12 from zope.interface import implements … … 24 24 def _processForm( form, ctx, name ): 25 25 # Remember the form 26 ctx.remember(form, iform s.IForm)26 ctx.remember(form, iformal.IForm) 27 27 28 28 # Create a keyed tag that will render the form when flattened. … … 35 35 36 36 # Find errors for *this* form and remember things on the context 37 errors = iform s.IFormErrors(ctx, None)37 errors = iformal.IFormErrors(ctx, None) 38 38 if errors is not None and errors.formName == name: 39 ctx.remember(errors.data, iform s.IFormData)39 ctx.remember(errors.data, iformal.IFormData) 40 40 else: 41 ctx.remember(None, iform s.IFormErrors)42 ctx.remember(form.data or {}, iform s.IFormData)41 ctx.remember(None, iformal.IFormErrors) 42 ctx.remember(form.data or {}, iformal.IFormData) 43 43 44 44 return ctx … … 67 67 class Form(object): 68 68 69 implements( iform s.IForm )69 implements( iformal.IForm ) 70 70 71 71 callback = None … … 123 123 return widgetFactory(type) 124 124 125 return iform s.IWidget(type)125 return iformal.IWidget(type) 126 126 127 127 def process(self, ctx): … … 161 161 errors = FormErrors(self.name) 162 162 errors.data = args 163 ctx.remember(errors, iform s.IFormErrors)163 ctx.remember(errors, iformal.IFormErrors) 164 164 165 165 # Iterate the items and collect the form data and/or errors. … … 193 193 e = failure.value 194 194 failure.trap(validation.FormError, validation.FieldError) 195 errors = iform s.IFormErrors(ctx)195 errors = iformal.IFormErrors(ctx) 196 196 errors.add(failure.value) 197 197 return errors … … 199 199 200 200 class FormErrors(object): 201 implements( iform s.IFormErrors )201 implements( iformal.IFormErrors ) 202 202 203 203 def __init__(self, formName): … … 238 238 239 239 def _fileFromWidget(self, form, ctx, segments): 240 ctx.remember(form, iform s.IForm)240 ctx.remember(form, iformal.IForm) 241 241 widget = form.widgetForItem(segments[0]) 242 242 return widget.getResource(ctx, segments[0], segments[1:]) … … 278 278 279 279 def remember(self, ctx): 280 ctx.remember(self.parent, iform s.IFormFactory)280 ctx.remember(self.parent, iformal.IFormFactory) 281 281 282 282 def render_form(self, name): … … 287 287 288 288 def _processForm(self, form, ctx): 289 ctx.remember(form, iform s.IForm)289 ctx.remember(form, iformal.IForm) 290 290 d = defer.maybeDeferred(form.process, ctx) 291 291 d.addCallback(self._formProcessed, ctx) … … 303 303 304 304 class ResourceMixin(object): 305 implements( iform s.IFormFactory )305 implements( iformal.IFormFactory ) 306 306 307 307 __formsBehaviour = None … … 317 317 return result 318 318 return super(ResourceMixin, self).locateChild(ctx, segments) 319 self.remember(self, iform s.IFormFactory)319 self.remember(self, iformal.IFormFactory) 320 320 d = defer.maybeDeferred(self.__behaviour().locateChild, ctx, segments) 321 321 d.addCallback(gotResult) … … 327 327 return result 328 328 return super(ResourceMixin, self).renderHTTP(ctx) 329 self.remember(self, iform s.IFormFactory)329 self.remember(self, iformal.IFormFactory) 330 330 d = defer.maybeDeferred(self.__behaviour().renderHTTP, ctx) 331 331 d.addCallback(gotResult) … … 377 377 return form 378 378 # Not known yet, ask a form factory to create the form 379 factory = ctx.locate(iform s.IFormFactory)379 factory = ctx.locate(iformal.IFormFactory) 380 380 381 381 def cacheForm( form, name ): … … 445 445 446 446 def _renderErrors(self, ctx, data): 447 errors = iform s.IFormErrors(ctx, None)447 errors = iformal.IFormErrors(ctx, None) 448 448 if errors is not None: 449 449 errors = errors.getFormErrors() … … 487 487 name, type, label, description, cssClass = data 488 488 form = self.original 489 formErrors = iform s.IFormErrors(ctx, None)490 formData = iform s.IFormData(ctx)489 formErrors = iformal.IFormErrors(ctx, None) 490 formData = iformal.IFormData(ctx) 491 491 492 492 widget = form.widgetForItem(name) … … 538 538 name, type, label, description, cssClass = data 539 539 form = self.original 540 formErrors = iform s.IFormErrors(ctx, None)541 formData = iform s.IFormData(ctx)540 formErrors = iformal.IFormErrors(ctx, None) 541 formData = iformal.IFormData(ctx) 542 542 543 543 widget = form.widgetForItem(name) trunk/formal/htmleditor.py
r40 r196 1 1 from nevow import tags as T, util 2 from form s import iforms2 from formal import iformal 3 3 from zope.interface import implements 4 4 … … 20 20 21 21 class TinyMCE(object): 22 implements( iform s.IWidget )22 implements( iformal.IWidget ) 23 23 24 24 def __init__(self, original): … … 29 29 value = args.get(key, [''])[0] 30 30 else: 31 value = iform s.IStringConvertible(self.original).fromType(args.get(key))31 value = iformal.IStringConvertible(self.original).fromType(args.get(key)) 32 32 return T.textarea(name=key, id=key, mce_editable='true')[value or ''] 33 33 34 34 def renderImmutable(self, ctx, key, args, errors): 35 value = iform s.IStringConvertible(self.original).fromType(args.get(key))35 value = iformal.IStringConvertible(self.original).fromType(args.get(key)) 36 36 if value: 37 37 value=T.xml(value) … … 44 44 def processInput(self, ctx, key, args): 45 45 value = args.get(key, [''])[0].decode(util.getPOSTCharset(ctx)) 46 value = iform s.IStringConvertible(self.original).toType(value)46 value = iformal.IStringConvertible(self.original).toType(value) 47 47 return self.original.validate(value) 48 48 trunk/formal/test/test_converters.py
r193 r196 6 6 haveDecimal = False 7 7 from twisted.trial import unittest 8 from form simport converters, validation8 from formal import converters, validation 9 9 10 10 trunk/formal/test/test_form.py
r178 r196 1 1 from twisted.trial import unittest 2 import form s2 import formal 3 3 4 4 … … 6 6 7 7 def test_fieldName(self): 8 form = form s.Form()9 form.addField('foo', form s.String())10 self.assertRaises(ValueError, form.addField, 'spaceAtTheEnd ', form s.String())11 self.assertRaises(ValueError, form.addField, 'got a space in it', form s.String())8 form = formal.Form() 9 form.addField('foo', formal.String()) 10 self.assertRaises(ValueError, form.addField, 'spaceAtTheEnd ', formal.String()) 11 self.assertRaises(ValueError, form.addField, 'got a space in it', formal.String()) trunk/formal/test/test_formerrors.py
r92 r196 1 1 from twisted.trial import unittest 2 from form simport form, validation2 from formal import form, validation 3 3 4 4 class TestFormErrors(unittest.TestCase): trunk/formal/test/test_types.py
r193 r196 6 6 haveDecimal = False 7 7 from twisted.trial import unittest 8 import form s9 from form simport validation8 import formal 9 from formal import validation 10 10 11 11 … … 13 13 14 14 def testHasValidator(self): 15  
