From bcdaea642d264c86beb3cfed8830f51d45db2e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 30 Oct 2018 09:44:29 +0100 Subject: [PATCH] tests: make field conditions work with unicode strings (#27664) --- tests/test_form_pages.py | 75 ++++++++++++++++++++++++++++++++++++++++ wcs/variables.py | 9 +++-- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index ae8557880..755b977cd 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -5261,6 +5261,81 @@ def test_field_condition(pub): assert 'Bar' in resp.body assert 'Foo' not in resp.body +def test_field_unicode_condition(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'Foo' + formdef.fields = [ + fields.PageField(id='0', label='2nd page', type='page'), + fields.StringField(type='string', id='1', label='Bar', size='40', + required=True, varname='bar'), + fields.PageField(id='3', label='1st page', type='page'), + fields.StringField(type='string', id='4', label='Baz', size='40', + required=True, varname='baz', + condition={'type': 'django', 'value': 'form_var_bar == "éléphant"'}), + ] + formdef.store() + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'hello' + resp = resp.form.submit('submit') + assert not 'f4' in resp.form.fields + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'éléphant' + resp = resp.form.submit('submit') + assert 'f4' in resp.form.fields + +def test_field_unicode_condition_contains_in_list(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'Foo' + formdef.fields = [ + fields.PageField(id='0', label='2nd page', type='page'), + fields.StringField(type='string', id='1', label='Bar', size='40', + required=True, varname='bar'), + fields.PageField(id='3', label='1st page', type='page'), + fields.StringField(type='string', id='4', label='Baz', size='40', + required=True, varname='baz', + condition={'type': 'django', 'value': 'form_var_bar in "éléphant"|split'}), + ] + formdef.store() + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'hello' + resp = resp.form.submit('submit') + assert not 'f4' in resp.form.fields + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'éléphant' + resp = resp.form.submit('submit') + assert 'f4' in resp.form.fields + +def test_field_unicode_condition_contains_in_string(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'Foo' + formdef.fields = [ + fields.PageField(id='0', label='2nd page', type='page'), + fields.StringField(type='string', id='1', label='Bar', size='40', + required=True, varname='bar'), + fields.PageField(id='3', label='1st page', type='page'), + fields.StringField(type='string', id='4', label='Baz', size='40', + required=True, varname='baz', + condition={'type': 'django', 'value': '"éléphant" in form_var_bar'}), + ] + formdef.store() + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'hello' + resp = resp.form.submit('submit') + assert not 'f4' in resp.form.fields + + resp = get_app(pub).get('/foo/') + resp.form['f1'] = 'éléphant' + resp = resp.form.submit('submit') + assert 'f4' in resp.form.fields + def test_field_live_condition(pub): FormDef.wipe() formdef = FormDef() diff --git a/wcs/variables.py b/wcs/variables.py index 01384a868..e90d5c0ce 100644 --- a/wcs/variables.py +++ b/wcs/variables.py @@ -341,10 +341,15 @@ class LazyFieldVar(object): value = self.data.get(self.field.id) if self.field.convert_value_to_str: return self.field.convert_value_to_str(value) + if isinstance(value, str): + return unicode(value, get_publisher().site_charset) return value def __str__(self): - return str(self.get_value()) + value = self.get_value() + if isinstance(value, unicode): + return value.encode(get_publisher().site_charset) + return str(value) def __nonzero__(self): if self.field.key == 'bool': @@ -360,7 +365,7 @@ class LazyFieldVar(object): return unicode(str(self), get_publisher().site_charset) def __eq__(self, other): - return str(self) == str(other) + return unicode(self) == unicode(other) def __getitem__(self, key): if isinstance(key, int): -- 2.19.1