Skip to content

Commit 0ec6195

Browse files
committed
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.
1 parent 141ac43 commit 0ec6195

File tree

2 files changed

+62
-7
lines changed

2 files changed

+62
-7
lines changed

roundup/cgi/templating.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -733,9 +733,8 @@ def __getitem__(self, item):
733733
for klass, htmlklass in propclasses:
734734
if not isinstance(prop, klass):
735735
continue
736-
value = prop.get_default_value()
737736
return htmlklass(self._client, self._classname, None, prop, item,
738-
value, self._anonymous)
737+
None, self._anonymous)
739738

740739
# no good
741740
raise KeyError(item)
@@ -1516,6 +1515,10 @@ def __init__(self, client, classname, nodeid, prop, name, value,
15161515
value = form.getfirst(self._formname).strip() or None
15171516
self._value = value
15181517

1518+
# if self._value is None see if we have a default value
1519+
if self._value is None:
1520+
self._value = prop.get_default_value()
1521+
15191522
HTMLInputMixin.__init__(self)
15201523

15211524
def __repr__(self):
@@ -2507,7 +2510,14 @@ def menu(self, size=None, height=None, showid=0, additional=[], value=None,
25072510

25082511
for optionid in options:
25092512
# get the option value, and if it's None use an empty string
2510-
option = linkcl.get(optionid, k) or ''
2513+
try:
2514+
option = linkcl.get(optionid, k) or ''
2515+
except IndexError:
2516+
# optionid does not exist. E.G.
2517+
# IndexError: no such queue z
2518+
# can be set using ?queue=z in URL for
2519+
# a new issue
2520+
continue
25112521

25122522
# figure if this option is selected
25132523
s = ''

test/test_templating.py

Lines changed: 49 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
class MockDatabase(MockNull):
4646
def getclass(self, name):
4747
# limit class names
48-
if name not in [ 'issue', 'user' ]:
48+
if name not in [ 'issue', 'user', 'status' ]:
4949
raise KeyError('There is no class called "%s"' % name)
5050
# Class returned must have hasnode(id) method that returns true
5151
# otherwise designators like 'issue1' can't be hyperlinked.
@@ -144,15 +144,60 @@ def test_link(self):
144144
def lookup(key) :
145145
self.assertEqual(key, key.strip())
146146
return "Status%s"%key
147-
self.form.list.append(MiniFieldStorage("status", "1"))
148-
self.form.list.append(MiniFieldStorage("status", "2"))
147+
self.form.list.append(MiniFieldStorage("issue@status", "1"))
148+
self.form.list.append(MiniFieldStorage("issue@status", "2"))
149149
status = hyperdb.Link("status")
150150
self.client.db.classes = dict \
151151
( issue = MockNull(getprops = lambda : dict(status = status))
152152
, status = MockNull(get = lambda id, name : id, lookup = lookup)
153153
)
154+
self.client.form = self.form
155+
cls = HTMLClass(self.client, "issue")
156+
157+
s = cls["status"]
158+
self.assertEqual(s._value, '1')
159+
160+
def test_link_default(self):
161+
"""Make sure default value for link is returned
162+
if new item and no value in form."""
163+
def lookup(key) :
164+
self.assertEqual(key, key.strip())
165+
return "Status%s"%key
166+
status = hyperdb.Link("status")
167+
# set default_value
168+
status.__dict__['_Type__default_value'] = "4"
169+
170+
self.client.db.classes = dict \
171+
( issue = MockNull(getprops = lambda : dict(status = status))
172+
, status = MockNull(get = lambda id, name : id, lookup = lookup, get_default_value = lambda: 4)
173+
)
174+
self.client.form = self.form
175+
176+
cls = HTMLClass(self.client, "issue")
177+
s = cls["status"]
178+
self.assertEqual(s._value, '4')
179+
180+
def test_link_with_value_and_default(self):
181+
"""Make sure default value is not used if there
182+
is a value in the form."""
183+
def lookup(key) :
184+
self.assertEqual(key, key.strip())
185+
return "Status%s"%key
186+
self.form.list.append(MiniFieldStorage("issue@status", "2"))
187+
self.form.list.append(MiniFieldStorage("issue@status", "1"))
188+
status = hyperdb.Link("status")
189+
# set default_value
190+
status.__dict__['_Type__default_value'] = "4"
191+
192+
self.client.db.classes = dict \
193+
( issue = MockNull(getprops = lambda : dict(status = status))
194+
, status = MockNull(get = lambda id, name : id, lookup = lookup, get_default_value = lambda: 4)
195+
)
196+
self.client.form = self.form
197+
154198
cls = HTMLClass(self.client, "issue")
155-
cls["status"]
199+
s = cls["status"]
200+
self.assertEqual(s._value, '2')
156201

157202
def test_multilink(self):
158203
"""`lookup` of an item will fail if leading or trailing whitespace

0 commit comments

Comments
 (0)