Mercurial > p > roundup > code
comparison test/test_templating.py @ 8286:6445e63bb423
feat(web) - Use native number type input for Number() and Integer().
When editing hyperdb.Number() or hyperdb.Integer() properties, use a
native number input.
For Number you can enter digits, +/-, . and e/E for exponent (1E2 =
100).
For integer we have the same keys as number, but also add step=1 to
the input. This stops submitting 23.5 suggesting 23 or 24. It does
allow 2E4 to be submitted that is rejected with an error from the
backend. However if the spinner is used with 2E4 it is turned into
20000, a pure integer and incremented/decremented by the spinner.
The upgrade happens automatically. Directions on going back to text
input provided. User guide updated to describe addition of spinner.
Tests added.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Sat, 18 Jan 2025 14:54:31 -0500 |
| parents | 2bf0c4e7795e |
| children | 60e682add9ea |
comparison
equal
deleted
inserted
replaced
| 8285:2bf0c4e7795e | 8286:6445e63bb423 |
|---|---|
| 1251 | 1251 |
| 1252 def test_string_rst(self): | 1252 def test_string_rst(self): |
| 1253 p = StringHTMLProperty(self.client, 'test', '1', None, 'test', u2s(u'A string with cmeerw@example.com *embedded* \u00df')) | 1253 p = StringHTMLProperty(self.client, 'test', '1', None, 'test', u2s(u'A string with cmeerw@example.com *embedded* \u00df')) |
| 1254 self.assertEqual(p.rst(), u2s(u'A string with <a href="mailto:cmeerw@example.com">cmeerw@example.com</a> *embedded* \u00df')) | 1254 self.assertEqual(p.rst(), u2s(u'A string with <a href="mailto:cmeerw@example.com">cmeerw@example.com</a> *embedded* \u00df')) |
| 1255 | 1255 |
| 1256 class NumberIntegerHTMLPropertyTestCase(HTMLPropertyTestClass): | |
| 1257 | |
| 1258 def setUp(self): | |
| 1259 super(NumberIntegerHTMLPropertyTestCase, self).setUp() | |
| 1260 | |
| 1261 db = self.client.db | |
| 1262 db.issue.addprop(numberval=hyperdb.Number()) | |
| 1263 db.issue.addprop(intval=hyperdb.Integer()) | |
| 1264 | |
| 1265 self.client.db.issue.create(title="title", | |
| 1266 numberval = "3.14", | |
| 1267 intval="314") | |
| 1268 | |
| 1269 def tearDown(self): | |
| 1270 self.client.db.close() | |
| 1271 memorydb.db_nuke('') | |
| 1272 | |
| 1273 def test_IntegerHTML(self): | |
| 1274 test_hyperdbInteger = self.client.db.issue.getprops("1")['intval'] | |
| 1275 test_Integer = test_hyperdbInteger.from_raw( | |
| 1276 self.client.db.issue.get("1", 'intval') | |
| 1277 ) | |
| 1278 | |
| 1279 # client, classname, nodeid, prop, name, value, | |
| 1280 # anonymous=0, offset=None | |
| 1281 d = IntegerHTMLProperty(self.client, 'issue', '1', | |
| 1282 test_hyperdbInteger, | |
| 1283 'intval', test_Integer) | |
| 1284 | |
| 1285 self.assertIsInstance(d._value, int) | |
| 1286 | |
| 1287 self.assertEqual(d.plain(), "314") | |
| 1288 | |
| 1289 input_expected = """<input id="issue1@intval" name="issue1@intval" size="30" step="1" type="number" value="314">""" | |
| 1290 self.assertEqual(d.field(), input_expected) | |
| 1291 | |
| 1292 input_expected = """<input id="issue1@intval" name="issue1@intval" size="30" step="50" type="number" value="314">""" | |
| 1293 self.assertEqual(d.field(step="50"), input_expected) | |
| 1294 | |
| 1295 input_expected = """<input id="issue1@intval" name="issue1@intval" size="30" type="text" value="314">""" | |
| 1296 self.assertEqual(d.field(type="text"), input_expected) | |
| 1297 | |
| 1298 | |
| 1299 # check permissions return | |
| 1300 is_view_ok_orig = d.is_view_ok | |
| 1301 is_edit_ok_orig = d.is_edit_ok | |
| 1302 no_access = lambda : False | |
| 1303 | |
| 1304 d.is_view_ok = no_access | |
| 1305 self.assertEqual(d.plain(), "[hidden]") | |
| 1306 | |
| 1307 d.is_edit_ok = no_access | |
| 1308 self.assertEqual(d.field(), "[hidden]") | |
| 1309 | |
| 1310 d.is_view_ok = is_view_ok_orig | |
| 1311 self.assertEqual(d.field(), "314") | |
| 1312 d.is_edit_ok = is_edit_ok_orig | |
| 1313 | |
| 1314 def test_NumberHTML(self): | |
| 1315 test_hyperdbNumber = self.client.db.issue.getprops("1")['numberval'] | |
| 1316 test_Number = test_hyperdbNumber.from_raw( | |
| 1317 self.client.db.issue.get("1", 'numberval') | |
| 1318 ) | |
| 1319 | |
| 1320 # client, classname, nodeid, prop, name, value, | |
| 1321 # anonymous=0, offset=None | |
| 1322 d = NumberHTMLProperty(self.client, 'issue', '1', | |
| 1323 test_hyperdbNumber, | |
| 1324 'numberval', test_Number) | |
| 1325 | |
| 1326 # string needed for memorydb/anydbm backend. Float?? when | |
| 1327 # running against sql backends. | |
| 1328 self.assertIsInstance(d._value, float) | |
| 1329 | |
| 1330 self.assertEqual(d._value, 3.14) | |
| 1331 | |
| 1332 input_expected = """<input id="issue1@numberval" name="issue1@numberval" size="30" type="number" value="3.14">""" | |
| 1333 self.assertEqual(d.field(), input_expected) | |
| 1334 | |
| 1335 input_expected = """<input id="issue1@numberval" name="issue1@numberval" size="30" step="50" type="number" value="3.14">""" | |
| 1336 self.assertEqual(d.field(step="50"), input_expected) | |
| 1337 | |
| 1338 input_expected = """<input id="issue1@numberval" name="issue1@numberval" size="30" type="text" value="3.14">""" | |
| 1339 self.assertEqual(d.field(type="text"), input_expected) | |
| 1340 | |
| 1341 self.assertEqual(d.pretty("%0.3f"), "3.140") | |
| 1342 self.assertEqual(d.pretty("%0.3d"), "003") | |
| 1343 self.assertEqual(d.pretty("%2d"), " 3") | |
| 1344 | |
| 1345 # see what happens if for other values | |
| 1346 value = d._value | |
| 1347 d._value = "1" # integer | |
| 1348 self.assertEqual(d.pretty("%2d"), "1") | |
| 1349 d._value = "I'mNotAFloat" # not a number | |
| 1350 self.assertEqual(d.pretty("%2d"), "I'mNotAFloat") | |
| 1351 d._value = value | |
| 1352 | |
| 1353 # check permissions return | |
| 1354 is_view_ok_orig = d.is_view_ok | |
| 1355 is_edit_ok_orig = d.is_edit_ok | |
| 1356 no_access = lambda : False | |
| 1357 | |
| 1358 d.is_view_ok = no_access | |
| 1359 self.assertEqual(d.plain(), "[hidden]") | |
| 1360 | |
| 1361 d.is_edit_ok = no_access | |
| 1362 self.assertEqual(d.field(), "[hidden]") | |
| 1363 | |
| 1364 d.is_view_ok = is_view_ok_orig | |
| 1365 self.assertEqual(d.field(), "3.14") | |
| 1366 d.is_edit_ok = is_edit_ok_orig | |
| 1367 | |
| 1256 class ZUtilsTestcase(TemplatingTestCase): | 1368 class ZUtilsTestcase(TemplatingTestCase): |
| 1257 | 1369 |
| 1258 def test_Iterator(self): | 1370 def test_Iterator(self): |
| 1259 """Test all the iterator functions and properties. | 1371 """Test all the iterator functions and properties. |
| 1260 """ | 1372 """ |
