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 """

Roundup Issue Tracker: http://roundup-tracker.org/