Ticket #337: force_select_value.patch
| File force_select_value.patch, 4.8 KB (added by desmaj, 3 years ago) |
|---|
-
tests/test_select.py
131 131 display = single_form.submit("button") 132 132 assert "<p>You selected 6</p>" in display, display 133 133 134 def 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 134 153 def test_single_select_no_default(): 135 154 app = webtest.TestApp(select_app_without_default) 136 155 res = app.get('/') … … 182 201 display = multiple_form.submit("button") 183 202 assert "<p>You selected 9</p>" in display, display 184 203 204 def 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 185 225 def test_multiple_select_no_default(): 186 226 app = webtest.TestApp(select_app_without_default) 187 227 res = app.get('/') -
webtest/__init__.py
1176 1176 1177 1177 value = property(value__get, value__set) 1178 1178 1179 class NoValue(object): 1180 pass 1181 1179 1182 class Select(Field): 1180 1183 1181 1184 """ … … 1187 1190 self.options = [] 1188 1191 # Undetermined yet: 1189 1192 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 1191 1199 def value__set(self, value): 1200 if self._forced_value is not NoValue: 1201 self._forced_value = NoValue 1192 1202 for i, (option, checked) in enumerate(self.options): 1193 1203 if option == str(value): 1194 1204 self.selectedIndex = i … … 1200 1210 [repr(o) for o, c in self.options]))) 1201 1211 1202 1212 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: 1204 1216 return self.options[self.selectedIndex][0] 1205 1217 else: 1206 1218 for option, checked in self.options: … … 1227 1239 self.options = [] 1228 1240 # Undetermined yet: 1229 1241 self.selectedIndices = [] 1230 1242 self._forced_values = [] 1243 1244 def force_value(self, values): 1245 self._forced_values = values 1246 self.selectedIndices = [] 1247 1231 1248 def value__set(self, values): 1232 1249 str_values = [str(value) for value in values] 1233 1250 self.selectedIndicies = [] … … 1243 1260 [repr(o) for o, c in self.options]))) 1244 1261 1245 1262 def value__get(self): 1263 selected_values = [] 1246 1264 if self.selectedIndices: 1247 return[self.options[i][0] for i in self.selectedIndices]1248 el se:1265 selected_values = [self.options[i][0] for i in self.selectedIndices] 1266 elif not self._forced_values: 1249 1267 selected_values = [] 1250 1268 for option, checked in self.options: 1251 1269 if checked: 1252 1270 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 1258 1277 value = property(value__get, value__set) 1259 1278 1260 1279 Field.classes['multiple_select'] = MultipleSelect
