Ticket #337: force_select_value.patch

File force_select_value.patch, 4.8 KB (added by desmaj, 3 years ago)
  • tests/test_select.py

     
    131131    display = single_form.submit("button") 
    132132    assert "<p>You selected 6</p>" in display, display 
    133133 
     134def test_single_select_forced_value(): 
     135    app = webtest.TestApp(select_app) 
     136    res = app.get('/') 
     137    assert res.status_int == 200 
     138    assert res.headers['content-type'] == 'text/html' 
     139    assert res.content_type == 'text/html' 
     140     
     141    single_form = res.forms["single_select_form"] 
     142    assert single_form["single"].value == "5" 
     143    try: 
     144        single_form.set("single", "984") 
     145        assert False, "not-an-option value error should have been raised" 
     146    except ValueError, exc: 
     147        pass 
     148    single_form["single"].force_value("984") 
     149    assert single_form["single"].value == "984" 
     150    display = single_form.submit("button") 
     151    assert "<p>You selected 984</p>" in display, display 
     152 
    134153def test_single_select_no_default(): 
    135154    app = webtest.TestApp(select_app_without_default) 
    136155    res = app.get('/') 
     
    182201    display = multiple_form.submit("button") 
    183202    assert "<p>You selected 9</p>" in display, display 
    184203 
     204def test_multiple_select_forced_values(): 
     205    app = webtest.TestApp(select_app) 
     206    res = app.get('/') 
     207    assert res.status_int == 200 
     208    assert res.headers['content-type'] == 'text/html' 
     209    assert res.content_type == 'text/html' 
     210     
     211    multiple_form = res.forms["multiple_select_form"] 
     212    assert multiple_form["multiple"].value == ["8", "11"],\ 
     213        multiple_form["multiple"].value 
     214    try: 
     215        multiple_form.set("multiple", ["24", "88"]) 
     216        assert False, "not-an-option value error should have been raised" 
     217    except ValueError, exc: 
     218        pass 
     219    multiple_form["multiple"].force_value(["24", "88"]) 
     220    assert multiple_form["multiple"].value == ["24", "88"],\ 
     221        multiple_form["multiple"].value 
     222    display = multiple_form.submit("button") 
     223    assert "<p>You selected 24, 88</p>" in display, display 
     224 
    185225def test_multiple_select_no_default(): 
    186226    app = webtest.TestApp(select_app_without_default) 
    187227    res = app.get('/') 
  • webtest/__init__.py

     
    11761176 
    11771177    value = property(value__get, value__set) 
    11781178 
     1179class NoValue(object): 
     1180    pass 
     1181 
    11791182class Select(Field): 
    11801183 
    11811184    """ 
     
    11871190        self.options = [] 
    11881191        # Undetermined yet: 
    11891192        self.selectedIndex = None 
    1190  
     1193        # we have no forced value 
     1194        self._forced_value = NoValue 
     1195     
     1196    def force_value(self, value): 
     1197        self._forced_value = value 
     1198     
    11911199    def value__set(self, value): 
     1200        if self._forced_value is not NoValue: 
     1201            self._forced_value = NoValue 
    11921202        for i, (option, checked) in enumerate(self.options): 
    11931203            if option == str(value): 
    11941204                self.selectedIndex = i 
     
    12001210                [repr(o) for o, c in self.options]))) 
    12011211 
    12021212    def value__get(self): 
    1203         if self.selectedIndex is not None: 
     1213        if self._forced_value is not NoValue: 
     1214            return self._forced_value 
     1215        elif self.selectedIndex is not None: 
    12041216            return self.options[self.selectedIndex][0] 
    12051217        else: 
    12061218            for option, checked in self.options: 
     
    12271239        self.options = [] 
    12281240        # Undetermined yet: 
    12291241        self.selectedIndices = [] 
    1230  
     1242        self._forced_values = [] 
     1243     
     1244    def force_value(self, values): 
     1245        self._forced_values = values 
     1246        self.selectedIndices = [] 
     1247     
    12311248    def value__set(self, values): 
    12321249        str_values = [str(value) for value in values] 
    12331250        self.selectedIndicies = [] 
     
    12431260                        [repr(o) for o, c in self.options]))) 
    12441261 
    12451262    def value__get(self): 
     1263        selected_values = [] 
    12461264        if self.selectedIndices: 
    1247             return [self.options[i][0] for i in self.selectedIndices] 
    1248         else: 
     1265            selected_values = [self.options[i][0] for i in self.selectedIndices] 
     1266        elif not self._forced_values: 
    12491267            selected_values = [] 
    12501268            for option, checked in self.options: 
    12511269                if checked: 
    12521270                    selected_values.append(option) 
    1253                  
    1254             if self.options and (not selected_values): 
    1255                 selected_values = None 
    1256             return selected_values 
    1257      
     1271        if self._forced_values: 
     1272            selected_values += self._forced_values 
     1273         
     1274        if self.options and (not selected_values): 
     1275            selected_values = None 
     1276        return selected_values 
    12581277    value = property(value__get, value__set) 
    12591278 
    12601279Field.classes['multiple_select'] = MultipleSelect