You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by jo...@apache.org on 2013/05/22 15:36:28 UTC
[02/14] git commit: [#6149] ticket:356 Fix select field value
splitting
[#6149] ticket:356 Fix select field value splitting
* Fall back to regular splitting if shlex.split raises exception
* Always encode unicode-strings before passing it to shlex (it doesn't work well with unicode)
Project: http://git-wip-us.apache.org/repos/asf/incubator-allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-allura/commit/a211a0d7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-allura/tree/a211a0d7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-allura/diff/a211a0d7
Branch: refs/heads/cj/5913
Commit: a211a0d7ffa2e50e635f05188a11796c2e1da5be
Parents: 05d660d
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon May 20 08:14:39 2013 +0000
Committer: Dave Brondsema <db...@slashdotmedia.com>
Committed: Mon May 20 17:20:30 2013 +0000
----------------------------------------------------------------------
.../forgetracker/tests/functional/test_root.py | 34 +++++++++++++++
ForgeTracker/forgetracker/widgets/ticket_form.py | 19 +++++++-
2 files changed, 51 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a211a0d7/ForgeTracker/forgetracker/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/tests/functional/test_root.py b/ForgeTracker/forgetracker/tests/functional/test_root.py
index b80e28b..6723778 100644
--- a/ForgeTracker/forgetracker/tests/functional/test_root.py
+++ b/ForgeTracker/forgetracker/tests/functional/test_root.py
@@ -645,6 +645,40 @@ class TestFunctionalController(TrackerTestController):
ticket_view = self.new_ticket(summary='test select custom fields', **kw).follow()
assert '<option selected value="test select">test select</option>' in ticket_view
+ def test_select_custom_field_unicode(self):
+ params = dict(
+ custom_fields=[
+ dict(name='_testselect', label='Test', type='select',
+ options='oné "one and á half" two'),
+ ],
+ open_status_names='aa bb',
+ closed_status_names='cc',
+ )
+ self.app.post(
+ '/admin/bugs/set_custom_fields',
+ params=variable_encode(params))
+ r = self.app.get('/bugs/new/')
+ assert u'<option value="oné">oné</option>'.encode('utf-8') in r
+ assert u'<option value="one and á half">one and á half</option>'.encode('utf-8') in r
+ assert u'<option value="two">two</option>' in r
+
+ def test_select_custom_field_invalid_quotes(self):
+ params = dict(
+ custom_fields=[
+ dict(name='_testselect', label='Test', type='select',
+ options='closéd "quote missing'),
+ ],
+ open_status_names='aa bb',
+ closed_status_names='cc',
+ )
+ self.app.post(
+ '/admin/bugs/set_custom_fields',
+ params=variable_encode(params))
+ r = self.app.get('/bugs/new/')
+ assert u'<option value="closéd">closéd</option>'.encode('utf-8') in r
+ assert u'<option value="quote">quote</option>' in r
+ assert u'<option value="missing">missing</option>' in r
+
def test_custom_field_update_comments(self):
params = dict(
custom_fields=[
http://git-wip-us.apache.org/repos/asf/incubator-allura/blob/a211a0d7/ForgeTracker/forgetracker/widgets/ticket_form.py
----------------------------------------------------------------------
diff --git a/ForgeTracker/forgetracker/widgets/ticket_form.py b/ForgeTracker/forgetracker/widgets/ticket_form.py
index f253484..5e3b61b 100644
--- a/ForgeTracker/forgetracker/widgets/ticket_form.py
+++ b/ForgeTracker/forgetracker/widgets/ticket_form.py
@@ -15,7 +15,6 @@
# specific language governing permissions and limitations
# under the License.
-from allura.lib.widgets import form_fields as ffw
import shlex
from pylons import tmpl_context as c
@@ -25,6 +24,8 @@ import ew as ew_core
import ew.jinja2_ew as ew
from allura import model as M
+from allura.lib.widgets import form_fields as ffw
+from allura.lib import helpers as h
class TicketCustomFields(ew.CompoundField):
template='jinja:forgetracker:templates/tracker_widgets/ticket_custom_fields.html'
@@ -150,7 +151,21 @@ class TicketCustomField(object):
def _select(field):
options = []
- for opt in shlex.split(field.options):
+ field_options = h.really_unicode(field.options)
+ try:
+ # shlex have problems with parsing unicode,
+ # it's better to pass properly encoded byte-string
+ field_options = shlex.split(field_options.encode('utf-8'))
+ # convert splitted string back to unicode
+ field_options = map(h.really_unicode, field_options)
+ except ValueError:
+ field_options = field_options.split()
+ # After regular split field_options might contain a " characters,
+ # which would break html when rendered inside tag's value attr.
+ # Escaping doesn't help here, 'cause it breaks EasyWidgets' validation,
+ # so we're getting rid of those.
+ field_options = [o.replace('"', '') for o in field_options]
+ for opt in field_options:
selected = False
if opt.startswith('*'):
opt = opt[1:]