# HG changeset patch # User John Rouillard # Date 1620679671 14400 # Node ID e29d5f4e0af441176b7d988d7c094c3516f2f2c2 # Parent 9957d8d10783d3f6796550fc929e0f17913c1aa1 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. diff -r 9957d8d10783 -r e29d5f4e0af4 roundup/cgi/templating.py --- 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 = '' diff -r 9957d8d10783 -r e29d5f4e0af4 test/test_templating.py --- 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