changeset 8281:669dfccca898

issue2551391 - checkboxes and radiobutton inputs get wrong id's. Actually it breaks automatic id assignment for all inputs. Inputs now get an automatic id assignment that matches the name. It can be overridden by supplting an id parameter in the call to the field() method. This is also a partial fix for issue1513369. I think it obsoletes the changes to templating.py.
author John Rouillard <rouilj@ieee.org>
date Thu, 16 Jan 2025 02:32:58 -0500
parents 8d3085b4d047
children 78b1e283afcd
files CHANGES.txt roundup/cgi/templating.py test/test_cgi.py test/test_liveserver.py test/test_templating.py
diffstat 5 files changed, 19 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGES.txt	Sun Jan 12 20:21:57 2025 -0500
+++ b/CHANGES.txt	Thu Jan 16 02:32:58 2025 -0500
@@ -74,6 +74,9 @@
 - close http socket and send a 408 status when a timeout exception
   is handed in roundup-server. This prevents another exception
   caused by using a timed out socket. (John Rouillard)
+- issue2551391, partial fix for issue1513369. input fields were
+  not getting id's assigned. Fixed automatic id assignment to
+  input fields. Thinko in the code. (John Rouillard)
 
 Features:
 
--- a/roundup/cgi/templating.py	Sun Jan 12 20:21:57 2025 -0500
+++ b/roundup/cgi/templating.py	Thu Jan 16 02:32:58 2025 -0500
@@ -607,7 +607,7 @@
     # useful e.g for HTML LABELs:
     if 'id' not in dic:
         try:
-            if dic['text'] in ('radio', 'checkbox'):
+            if dic['type'] in ('radio', 'checkbox'):
                 dic['id'] = '%(name)s-%(value)s' % dic
             else:
                 dic['id'] = dic['name']
--- a/test/test_cgi.py	Sun Jan 12 20:21:57 2025 -0500
+++ b/test/test_cgi.py	Thu Jan 16 02:32:58 2025 -0500
@@ -950,7 +950,7 @@
           <p>deferred</p>
           <p>admin, anonymous</p>
           <p></p>
-          <p><input name="superseder" size="30" type="text" value="5000"></p>
+          <p><input id="superseder" name="superseder" size="30" type="text" value="5000"></p>
          </body>
         </html>
         """.strip ())
--- a/test/test_liveserver.py	Sun Jan 12 20:21:57 2025 -0500
+++ b/test/test_liveserver.py	Thu Jan 16 02:32:58 2025 -0500
@@ -1503,9 +1503,9 @@
         self.assertIn(b'done-cbb', f.content)
 
         if user == 'admin':
-            self.assertIn(b'<input name="submit_button" type="submit" value="Submit Changes">', f.content)
+            self.assertIn(b'<input id="submit_button" name="submit_button" type="submit" value="Submit Changes">', f.content)
         else:
-            self.assertNotIn(b'<input name="submit_button" type="submit" value="Submit Changes">', f.content)
+            self.assertNotIn(b'<input id="submit_button" name="submit_button" type="submit" value="Submit Changes">', f.content)
 
         # logout
         f = session.get(self.url_base()+'/?@action=logout')
--- a/test/test_templating.py	Sun Jan 12 20:21:57 2025 -0500
+++ b/test/test_templating.py	Thu Jan 16 02:32:58 2025 -0500
@@ -350,14 +350,15 @@
         p = NumberHTMLProperty(self.client, 'testnum', '1', None, 'test',
                                2345678.2345678)
         self.assertEqual(p.field(),
-                         ('<input name="testnum1@test" size="30" type="text" '
+                         ('<input id="testnum1@test" name="testnum1@test" size="30" type="text" '
                          'value="%s">')%expected_val)
         self.assertEqual(p.field(size=10),
-                         ('<input name="testnum1@test" size="10" type="text" '
+                         ('<input id="testnum1@test" name="testnum1@test" size="10" type="text" '
                          'value="%s">')%expected_val)
         self.assertEqual(p.field(size=10, dataprop="foo", dataprop2=5),
                          ('<input dataprop="foo" dataprop2="5" '
-                          'name="testnum1@test" size="10" type="text" '
+                          'id="testnum1@test" name="testnum1@test" '
+                          'size="10" type="text" '
                           'value="%s">'%expected_val))
 
         self.assertEqual(p.field(size=10, klass="class1", 
@@ -365,7 +366,8 @@
                                      "data-prop": "foo",
                                      "data-prop2": 5}),
                          ('<input class="class2 class3" data-prop="foo" '
-                          'data-prop2="5" klass="class1" '
+                          'data-prop2="5" id="testnum1@test" '
+                          'klass="class1" '
                           'name="testnum1@test" size="10" type="text" '
                           'value="%s">')%expected_val)
 
@@ -377,8 +379,8 @@
         p = NumberHTMLProperty(self.client, 'testnum', '1', None, 'test',
                                "2345678.2345678")
         self.assertEqual(p.field(),
-                         ('<input name="testnum1@test" size="30" type="text" '
-                          'value="2345678.2345678">'))
+                         ('<input id="testnum1@test" name="testnum1@test" '
+                          'size="30" type="text" value="2345678.2345678">'))
 
         # test with None value, pretend property.__default_value = Null which
         #    is the default. It would be returned by get_default_value
@@ -387,8 +389,8 @@
         p = NumberHTMLProperty(self.client, 'testnum', '1', property, 
                                'test', None)
         self.assertEqual(p.field(),
-                         ('<input name="testnum1@test" size="30" type="text" '
-                          'value="">'))
+                         ('<input id="testnum1@test" name="testnum1@test" '
+                         'size="30" type="text" value="">'))
 
     def test_number_plain(self):
         import sys
@@ -570,7 +572,7 @@
 
     def test_string_field(self):
         p = StringHTMLProperty(self.client, 'test', '1', None, 'test', 'A string <b> with rouilj@example.com embedded &lt; html</b>')
-        self.assertEqual(p.field(), '<input name="test1@test" size="30" type="text" value="A string &lt;b&gt; with rouilj@example.com embedded &amp;lt; html&lt;/b&gt;">')
+        self.assertEqual(p.field(), '<input id="test1@test" name="test1@test" size="30" type="text" value="A string &lt;b&gt; with rouilj@example.com embedded &amp;lt; html&lt;/b&gt;">')
 
     def test_string_multiline(self):
         p = StringHTMLProperty(self.client, 'test', '1', None, 'test', 'A string <b> with rouilj@example.com embedded &lt; html</b>')
@@ -746,7 +748,7 @@
         self.assertIs(type(d._value), str)
         self.assertEqual(d.pretty(), "2021-01-01 11:22:10")
         self.assertEqual(d.plain(), "2021-01-01 11:22:10")
-        input = """<input name="test1@test" size="30" type="text" value="2021-01-01 11:22:10"><a class="classhelp" data-calurl="test?@template=calendar&amp;amp;property=test&amp;amp;form=itemSynopsis&amp;date=2021-01-01 11:22:10" data-height="200" data-width="300" href="javascript:help_window('test?@template=calendar&amp;property=test&amp;form=itemSynopsis&date=2021-01-01 11:22:10', 300, 200)">(cal)</a>"""
+        input = """<input id="test1@test" name="test1@test" size="30" type="text" value="2021-01-01 11:22:10"><a class="classhelp" data-calurl="test?@template=calendar&amp;amp;property=test&amp;amp;form=itemSynopsis&amp;date=2021-01-01 11:22:10" data-height="200" data-width="300" href="javascript:help_window('test?@template=calendar&amp;property=test&amp;form=itemSynopsis&date=2021-01-01 11:22:10', 300, 200)">(cal)</a>"""
         self.assertEqual(d.field(), input)
 
 # common markdown test cases

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