Changeset 243

Show
Ignore:
Timestamp:
07/06/06 11:54:48 (3 years ago)
Author:
matt
Message:

Merge composite branch to composite-2.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/composite-2/formal/__init__.py

    r241 r243  
    1212from formal.validation import * 
    1313from formal.widget import * 
     14from formal.widgets.composite import * 
    1415from formal.widgets.restwidget import * 
    1516from formal.widgets.multiselect import * 
     
    4546registerAdapter(TextInput, Time, iformal.IWidget) 
    4647registerAdapter(FileUploadRaw, File, iformal.IWidget) 
     48registerAdapter(CompositeWidget, Composite, iformal.IWidget) 
    4749registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.IKey) 
    4850registerAdapter(SequenceKeyLabelAdapter, tuple, iformal.ILabel) 
  • branches/composite-2/formal/examples/main.py

    r231 r243  
    2424    'formal.examples.nofields.NoFieldsFormPage', 
    2525    'formal.examples.hidden.HiddenFieldsFormPage', 
     26    'formal.examples.composite.CompositeFormPage', 
    2627    ] 
    2728 
  • branches/composite-2/formal/form.py

    r240 r243  
    128128            return 
    129129 
    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. 
    131132        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) 
    133135        except validation.FieldError, e: 
    134136            if e.fieldName is None: 
  • branches/composite-2/formal/formal.css

    r231 r243  
    1919} 
    2020 
     21.nevow-form .composite .inputs div { 
     22  margin-bottom: 0.25em; 
     23} 
     24 
    2125.nevow-form .inputs { 
    2226  margin-left: 110px; 
     
    2731  font-weight: bold; 
    2832  color: #555; 
     33} 
     34 
     35.nevow-form .composite .inputs label { 
     36  font-style: normal; 
     37  font-weight: normal; 
     38  color: #222; 
    2939} 
    3040 
  • branches/composite-2/formal/test/test_types.py

    r196 r243  
    125125    test_file.skip = "write tests" 
    126126 
     127 
     128 
     129class 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  
    132132 
    133133 
     134 
     135class 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 
    134167__all__ = [ 
    135     'Boolean', 'Date', 'File', 'Float', 'Integer', 'Sequence', 'String', 'Time', 
     168    'Boolean', 'Composite', 'Date', 'File', 'Float', 'Integer', 'Sequence', 
     169    'String', 'Time', 
    136170    ] 
    137171 
  • branches/composite-2/formal/widget.py

    r231 r243  
    5353    def processInput(self, ctx, key, args): 
    5454        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) 
    5756 
    5857 
     
    9190        if not value: 
    9291            value = 'False' 
    93         value = iformal.IBooleanConvertible(self.original).toType(value) 
    94         return self.original.validate(value) 
     92        return iformal.IBooleanConvertible(self.original).toType(value) 
    9593 
    9694 
     
    142140    def processInput(self, ctx, key, args): 
    143141        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) 
    146143 
    147144 
     
    186183            if pwds[0] != pwds[1]: 
    187184                raise validation.FieldValidationError('Passwords do not match.') 
    188         return self.original.validate(pwds[0]) 
     185        return pwds[0] 
    189186 
    190187 
     
    218215        if self.noneOption is not None and value == self.noneOption[0]: 
    219216            value = None 
    220         return self.original.validate(value) 
     217        return value 
    221218 
    222219 
     
    369366        if self.noneOption is not None and value == self.noneOption[0]: 
    370367            value = None 
    371         return self.original.validate(value) 
     368        return value 
    372369 
    373370 
     
    533530            except ValueError, e: 
    534531                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) 
    537533 
    538534 
     
    609605                value[0] = 2000 + value[0] 
    610606            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 ) 
    613608 
    614609 
     
    674669        values = args.get(key, []) 
    675670        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] 
    678672 
    679673 
     
    706700        value = (name, fileitem.file) 
    707701 
    708         value = iformal.IFileConvertible(self.original).fromType(value) 
    709         return self.original.validate(value) 
     702        return iformal.IFileConvertible(self.original).fromType(value) 
    710703 
    711704 
     
    770763           value = args.get(namer('value'))[0] 
    771764 
    772         value = iformal.IStringConvertible(self.original).fromType(value) 
    773         return self.original.validate(value) 
     765        return iformal.IStringConvertible(self.original).fromType(value) 
    774766 
    775767 
     
    922914        # original file meet a required field validation? 
    923915        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 ) 
    926917 
    927918    def _registerWithResourceManager( self, key, args, resourceManager ): 
     
    992983    def processInput(self, ctx, key, args): 
    993984        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) 
    996986 
    997987