Changeset 243
- Timestamp:
- 07/06/06 11:54:48 (3 years ago)
- Files:
-
- branches/composite-2/formal/__init__.py (modified) (2 diffs)
- branches/composite-2/formal/examples/composite.py (copied) (copied from branches/composite/formal/examples/composite.py)
- branches/composite-2/formal/examples/main.py (modified) (1 diff)
- branches/composite-2/formal/form.py (modified) (1 diff)
- branches/composite-2/formal/formal.css (modified) (2 diffs)
- branches/composite-2/formal/test/test_types.py (modified) (1 diff)
- branches/composite-2/formal/types.py (modified) (1 diff)
- branches/composite-2/formal/widget.py (modified) (13 diffs)
- branches/composite-2/formal/widgets/composite.py (copied) (copied from branches/composite/formal/widgets/composite.py)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/composite-2/formal/__init__.py
r241 r243 12 12 from formal.validation import * 13 13 from formal.widget import * 14 from formal.widgets.composite import * 14 15 from formal.widgets.restwidget import * 15 16 from formal.widgets.multiselect import * … … 45 46 registerAdapter(TextInput, Time, iformal.IWidget) 46 47 registerAdapter(FileUploadRaw, File, iformal.IWidget) 48 registerAdapter(CompositeWidget, Composite, iformal.IWidget) 47 49 registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.IKey) 48 50 registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.ILabel) branches/composite-2/formal/examples/main.py
r231 r243 24 24 'formal.examples.nofields.NoFieldsFormPage', 25 25 'formal.examples.hidden.HiddenFieldsFormPage', 26 'formal.examples.composite.CompositeFormPage', 26 27 ] 27 28 branches/composite-2/formal/form.py
r240 r243 128 128 return 129 129 130 # Process the input using the widget, storing the data back on the form. 130 # Process and the input using the widget, validate the value, and store 131 # the data back on the form. Either of these can raise a FieldError. 131 132 try: 132 form.data[self.key] = self.makeWidget().processInput(ctx, self.key, args) 133 processed = self.makeWidget().processInput(ctx, self.key, args) 134 form.data[self.key] = self.type.validate(processed) 133 135 except validation.FieldError, e: 134 136 if e.fieldName is None: branches/composite-2/formal/formal.css
r231 r243 19 19 } 20 20 21 .nevow-form .composite .inputs div { 22 margin-bottom: 0.25em; 23 } 24 21 25 .nevow-form .inputs { 22 26 margin-left: 110px; … … 27 31 font-weight: bold; 28 32 color: #555; 33 } 34 35 .nevow-form .composite .inputs label { 36 font-style: normal; 37 font-weight: normal; 38 color: #222; 29 39 } 30 40 branches/composite-2/formal/test/test_types.py
r196 r243 125 125 test_file.skip = "write tests" 126 126 127 128 129 class TestComposite(unittest.TestCase): 130 131 def test_one(self): 132 self.assertEquals(formal.Composite([ 133 ('foo', formal.String()) 134 ]).validate([u'bar']), {'foo': u'bar'}) 135 self.assertEquals(formal.Composite([ 136 ('foo', formal.Integer()) 137 ]).validate([123]), {'foo': 123}) 138 139 def test_multisame(self): 140 self.assertEquals(formal.Composite([ 141 ('foo', formal.String()), 142 ('bar', formal.String()) 143 ]).validate([u'foo', u'bar']), {'foo': u'foo', 'bar': u'bar'}) 144 self.assertEquals(formal.Composite([ 145 ('foo', formal.Integer()), 146 ('bar', formal.Integer()), 147 ]).validate([123, 456]), {'foo': 123, 'bar': 456}) 148 149 def test_multidiff(self): 150 self.assertEquals(formal.Composite([ 151 ('foo', formal.String()), 152 ('bar', formal.Integer()) 153 ]).validate([u'foo', 123]), {'foo': u'foo', 'bar': 123}) 154 self.assertEquals(formal.Composite([ 155 ('foo', formal.String()), 156 ('bar', formal.Integer()) 157 ]).validate([u'foo', None]), {'foo': u'foo', 'bar': None}) 158 159 def test_none(self): 160 self.assertEquals(formal.Composite([('foo', 161 formal.String())]).validate([None]), None) 162 self.assertEquals(formal.Composite([ 163 ('foo', formal.String()), 164 ('bar', formal.Integer()) 165 ]).validate([None, None]), None) 166 167 def test_missing(self): 168 missing = object() 169 self.assertEquals(formal.Composite([('foo', 170 formal.String())], missing=missing).validate([None]), missing) 171 172 def test_notrequired_required(self): 173 self.assertEquals(formal.Composite([ 174 ('foo', formal.String(required=True)) 175 ]).validate([u'foo']), {'foo': u'foo'}) 176 self.assertEquals(formal.Composite([ 177 ('foo', formal.String(required=True)), 178 ('bar', formal.Integer(required=True)) 179 ]).validate([u'foo', 123]), {'foo': u'foo', 'bar': 123}) 180 self.assertEquals(formal.Composite([ 181 ('foo', formal.String(required=True)) 182 ]).validate([None]), None) 183 self.assertEquals(formal.Composite([ 184 ('foo', formal.String(required=True)), 185 ('bar', formal.Integer(required=True)) 186 ]).validate([None, None]), None) 187 188 def test_notrequired_onerequired(self): 189 self.assertEquals(formal.Composite([ 190 ('foo', formal.String(required=True)), 191 ('bar', formal.Integer()) 192 ]).validate([u'foo', None]), {'foo': u'foo', 'bar': None}) 193 self.assertEquals(formal.Composite([ 194 ('foo', formal.String(required=True)), 195 ('bar', formal.Integer()) 196 ]).validate([None, None]), None) 197 self.assertRaises(formal.FieldValidationError, formal.Composite([ 198 ('foo', formal.String(required=True)), 199 ('bar', formal.Integer()) 200 ]).validate, [None, 123]) 201 202 def test_required(self): 203 self.assertEquals(formal.Composite([ 204 ('foo', formal.String()) 205 ], required=True).validate([u'foo']), {'foo': u'foo'}) 206 self.assertEquals(formal.Composite([ 207 ('foo', formal.String()), 208 ('bar', formal.Integer()) 209 ], required=True).validate([u'foo', None]), {'foo': u'foo', 'bar': None}) 210 self.assertEquals(formal.Composite([ 211 ('foo', formal.String()), 212 ('bar', formal.Integer()) 213 ], required=True).validate([None, 123]), {'foo': None, 'bar': 123}) 214 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 215 ('foo', formal.String()) 216 ], required=True).validate, [None]) 217 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 218 ('foo', formal.String()), 219 ('bar', formal.Integer()) 220 ], required=True).validate, [None, None]) 221 222 def test_required_onerequired(self): 223 self.assertEquals(formal.Composite([ 224 ('foo', formal.String(required=True)), 225 ('bar', formal.Integer()) 226 ], required=True).validate([u'foo', None]), {'foo': u'foo', 'bar': None}) 227 self.assertEquals(formal.Composite([ 228 ('foo', formal.String(required=True)), 229 ('bar', formal.Integer()) 230 ], required=True).validate([u'foo', 123]), {'foo': u'foo', 'bar': 123}) 231 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 232 ('foo', formal.String(required=True)), 233 ('bar', formal.Integer()) 234 ], required=True).validate, [None, None]) 235 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 236 ('foo', formal.String(required=True)), 237 ('bar', formal.Integer()) 238 ], required=True).validate, [None, 123]) 239 240 def test_required_allrequired(self): 241 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 242 ('foo', formal.String(required=True)) 243 ], required=True).validate, [None]) 244 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 245 ('foo', formal.String(required=True)), 246 ('bar', formal.Integer(required=True)) 247 ], required=True).validate, [None, None]) 248 self.assertRaises(formal.FieldRequiredError, formal.Composite([ 249 ('foo', formal.String(required=True)), 250 ('bar', formal.Integer(required=True)) 251 ], required=True).validate, [u'foo', None]) 252 253 def test_wrongNumberOfValues(self): 254 self.assertRaises(ValueError, formal.Composite([ 255 ('foo', formal.Integer()), 256 ('bar', formal.String()), 257 ]).validate, [123]) 258 branches/composite-2/formal/types.py
r196 r243 132 132 133 133 134 135 class Composite(Type): 136 137 138 def __init__(self, composition, *a, **k): 139 super(Composite, self).__init__(*a, **k) 140 self.composition = composition 141 142 143 def validate(self, value): 144 145 # Check we have the correct number of values, otherwise the final value 146 # could be completely wrong because we're relying on zip to build the 147 # dict. 148 if len(value) != len(self.composition): 149 raise ValueError("Incorrect number of values to validate") 150 151 # If nothing has been entered then we'll have a sequence of None 152 # instances, in which case my value if None (not a sequence). If there 153 # is anything other than None in the sequence then pass validation on to 154 # the composite types. 155 if not filter(None, value): 156 value = None 157 else: 158 value = dict([ 159 (name, type.validate(value)) 160 for (name, type), value in zip(self.composition, value)]) 161 162 # Allow normal validation to run on the new value 163 return super(Composite, self).validate(value) 164 165 166 134 167 __all__ = [ 135 'Boolean', 'Date', 'File', 'Float', 'Integer', 'Sequence', 'String', 'Time', 168 'Boolean', 'Composite', 'Date', 'File', 'Float', 'Integer', 'Sequence', 169 'String', 'Time', 136 170 ] 137 171 branches/composite-2/formal/widget.py
r231 r243 53 53 def processInput(self, ctx, key, args): 54 54 value = args.get(key, [''])[0].decode(util.getPOSTCharset(ctx)) 55 value = iformal.IStringConvertible(self.original).toType(value) 56 return self.original.validate(value) 55 return iformal.IStringConvertible(self.original).toType(value) 57 56 58 57 … … 91 90 if not value: 92 91 value = 'False' 93 value = iformal.IBooleanConvertible(self.original).toType(value) 94 return self.original.validate(value) 92 return iformal.IBooleanConvertible(self.original).toType(value) 95 93 96 94 … … 142 140 def processInput(self, ctx, key, args): 143 141 value = args.get(key, [''])[0].decode(util.getPOSTCharset(ctx)) 144 value = iformal.IStringConvertible(self.original).fromType(value) 145 return self.original.validate(value) 142 return iformal.IStringConvertible(self.original).fromType(value) 146 143 147 144 … … 186 183 if pwds[0] != pwds[1]: 187 184 raise validation.FieldValidationError('Passwords do not match.') 188 return self.original.validate(pwds[0])185 return pwds[0] 189 186 190 187 … … 218 215 if self.noneOption is not None and value == self.noneOption[0]: 219 216 value = None 220 return self.original.validate(value)217 return value 221 218 222 219 … … 369 366 if self.noneOption is not None and value == self.noneOption[0]: 370 367 value = None 371 return self.original.validate(value)368 return value 372 369 373 370 … … 533 530 except ValueError, e: 534 531 raise validation.FieldValidationError("Invalid date") 535 ymd = iformal.IDateTupleConvertible(self.original).toType(ymd) 536 return self.original.validate(ymd) 532 return iformal.IDateTupleConvertible(self.original).toType(ymd) 537 533 538 534 … … 609 605 value[0] = 2000 + value[0] 610 606 value.append(1) 611 value = iformal.IDateTupleConvertible(self.original).toType( value ) 612 return self.original.validate(value) 607 return iformal.IDateTupleConvertible(self.original).toType( value ) 613 608 614 609 … … 674 669 values = args.get(key, []) 675 670 converter = iformal.IStringConvertible(self.original.type) 676 values = [converter.toType(v) for v in values] 677 return self.original.validate(values) 671 return [converter.toType(v) for v in values] 678 672 679 673 … … 706 700 value = (name, fileitem.file) 707 701 708 value = iformal.IFileConvertible(self.original).fromType(value) 709 return self.original.validate(value) 702 return iformal.IFileConvertible(self.original).fromType(value) 710 703 711 704 … … 770 763 value = args.get(namer('value'))[0] 771 764 772 value = iformal.IStringConvertible(self.original).fromType(value) 773 return self.original.validate(value) 765 return iformal.IStringConvertible(self.original).fromType(value) 774 766 775 767 … … 922 914 # original file meet a required field validation? 923 915 value = resourceManager.getResourceForWidget( key ) 924 value = self.convertibleFactory(self.original).toType( value ) 925 return self.original.validate( value ) 916 return self.convertibleFactory(self.original).toType( value ) 926 917 927 918 def _registerWithResourceManager( self, key, args, resourceManager ): … … 992 983 def processInput(self, ctx, key, args): 993 984 value = args.get(key, [''])[0].decode(util.getPOSTCharset(ctx)) 994 value = iformal.IStringConvertible(self.original).toType(value) 995 return self.original.validate(value) 985 return iformal.IStringConvertible(self.original).toType(value) 996 986 997 987
