changeset 6404:e29d5f4e0af4

issue2551132 - Setting form value in query string --- issues Code now uses value in query string even if there is a default_value set. Also handle the exception caused by an invalid value specified in the query string.
author John Rouillard <rouilj@ieee.org>
date Mon, 10 May 2021 16:47:51 -0400
parents 9957d8d10783
children a21b574554c3
files roundup/cgi/templating.py test/test_templating.py
diffstat 2 files changed, 62 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/roundup/cgi/templating.py	Mon May 10 16:19:37 2021 +0200
+++ b/roundup/cgi/templating.py	Mon May 10 16:47:51 2021 -0400
@@ -733,9 +733,8 @@
         for klass, htmlklass in propclasses:
             if not isinstance(prop, klass):
                 continue
-            value = prop.get_default_value()
             return htmlklass(self._client, self._classname, None, prop, item,
-                value, self._anonymous)
+                None, self._anonymous)
 
         # no good
         raise KeyError(item)
@@ -1516,6 +1515,10 @@
                 value = form.getfirst(self._formname).strip() or None
             self._value = value
 
+        # if self._value is None see if we have a default value
+        if self._value is None:
+            self._value = prop.get_default_value()
+
         HTMLInputMixin.__init__(self)
 
     def __repr__(self):
@@ -2507,7 +2510,14 @@
 
         for optionid in options:
             # get the option value, and if it's None use an empty string
-            option = linkcl.get(optionid, k) or ''
+            try:
+                option = linkcl.get(optionid, k) or ''
+            except IndexError:
+                # optionid does not exist. E.G.
+                #   IndexError: no such queue z
+                # can be set using ?queue=z in URL for
+                # a new issue
+                continue
 
             # figure if this option is selected
             s = ''
--- a/test/test_templating.py	Mon May 10 16:19:37 2021 +0200
+++ b/test/test_templating.py	Mon May 10 16:47:51 2021 -0400
@@ -45,7 +45,7 @@
 class MockDatabase(MockNull):
     def getclass(self, name):
         # limit class names
-        if name not in [ 'issue', 'user' ]:
+        if name not in [ 'issue', 'user', 'status' ]:
             raise KeyError('There is no class called "%s"' % name)
         # Class returned must have hasnode(id) method that returns true
         # otherwise designators like 'issue1' can't be hyperlinked.
@@ -144,15 +144,60 @@
         def lookup(key) :
             self.assertEqual(key, key.strip())
             return "Status%s"%key
-        self.form.list.append(MiniFieldStorage("status", "1"))
-        self.form.list.append(MiniFieldStorage("status", "2"))
+        self.form.list.append(MiniFieldStorage("issue@status", "1"))
+        self.form.list.append(MiniFieldStorage("issue@status", "2"))
         status = hyperdb.Link("status")
         self.client.db.classes = dict \
             ( issue = MockNull(getprops = lambda : dict(status = status))
             , status  = MockNull(get = lambda id, name : id, lookup = lookup)
             )
+        self.client.form = self.form
         cls = HTMLClass(self.client, "issue")
-        cls["status"]
+
+        s = cls["status"]
+        self.assertEqual(s._value, '1')
+
+    def test_link_default(self):
+        """Make sure default value for link is returned
+           if new item and no value in form."""
+        def lookup(key) :
+            self.assertEqual(key, key.strip())
+            return "Status%s"%key
+        status = hyperdb.Link("status")
+        # set default_value
+        status.__dict__['_Type__default_value'] = "4"
+
+        self.client.db.classes = dict \
+            ( issue = MockNull(getprops = lambda : dict(status = status))
+            , status  = MockNull(get = lambda id, name : id, lookup = lookup, get_default_value = lambda: 4)
+            )
+        self.client.form = self.form
+
+        cls = HTMLClass(self.client, "issue")
+        s = cls["status"]
+        self.assertEqual(s._value, '4')
+
+    def test_link_with_value_and_default(self):
+        """Make sure default value is not used if there
+           is a value in the form."""
+        def lookup(key) :
+            self.assertEqual(key, key.strip())
+            return "Status%s"%key
+        self.form.list.append(MiniFieldStorage("issue@status", "2"))
+        self.form.list.append(MiniFieldStorage("issue@status", "1"))
+        status = hyperdb.Link("status")
+        # set default_value
+        status.__dict__['_Type__default_value'] = "4"
+
+        self.client.db.classes = dict \
+            ( issue = MockNull(getprops = lambda : dict(status = status))
+            , status  = MockNull(get = lambda id, name : id, lookup = lookup, get_default_value = lambda: 4)
+            )
+        self.client.form = self.form
+
+        cls = HTMLClass(self.client, "issue")
+        s = cls["status"]
+        self.assertEqual(s._value, '2')
 
     def test_multilink(self):
         """`lookup` of an item will fail if leading or trailing whitespace

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