Mercurial > p > roundup > code
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
