Commit d72d381a authored by Serge S. Koval's avatar Serge S. Koval

Updated tests and removed as_unicode() compat helper

parent d7fb51f2
...@@ -24,17 +24,16 @@ if not PY2: ...@@ -24,17 +24,16 @@ if not PY2:
itervalues = lambda d: iter(d.values()) itervalues = lambda d: iter(d.values())
iteritems = lambda d: iter(d.items()) iteritems = lambda d: iter(d.items())
def as_unicode(text): def as_unicode(s):
if isinstance(text, bytes): if isinstance(s, bytes):
return text.decode('utf-8') return s.decode('utf-8')
return str(text) return str(s)
# Various tools # Various tools
from functools import reduce from functools import reduce
from urllib.parse import urljoin from urllib.parse import urljoin
else: else:
unicode_type = unicode
text_type = unicode text_type = unicode
string_types = (str, unicode) string_types = (str, unicode)
integer_types = (int, long) integer_types = (int, long)
...@@ -43,8 +42,11 @@ else: ...@@ -43,8 +42,11 @@ else:
itervalues = lambda d: d.itervalues() itervalues = lambda d: d.itervalues()
iteritems = lambda d: d.iteritems() iteritems = lambda d: d.iteritems()
def as_unicode(text): def as_unicode(s):
return unicode(text) if isinstance(s, str):
return s.decode('utf-8')
return unicode(s)
# Helpers # Helpers
reduce = __builtins__['reduce'] reduce = __builtins__['reduce']
......
from flask import request, url_for, redirect from flask import request, url_for, redirect
from flask.ext.admin import tools, _compat from flask.ext.admin import tools
from flask.ext.admin._compat import text_type
def action(name, text, confirmation=None): def action(name, text, confirmation=None):
...@@ -85,12 +86,11 @@ class ActionsMixin(object): ...@@ -85,12 +86,11 @@ class ActionsMixin(object):
name, text = act name, text = act
if self.is_action_allowed(name): if self.is_action_allowed(name):
text = _compat.as_unicode(text) actions.append((name, text_type(text)))
actions.append((name, text))
confirmation = self._actions_data[name][2] confirmation = self._actions_data[name][2]
if confirmation: if confirmation:
actions_confirmation[name] = _compat.text_type(confirmation) actions_confirmation[name] = text_type(confirmation)
return actions, actions_confirmation return actions, actions_confirmation
......
...@@ -233,11 +233,11 @@ class ModelView(BaseModelView): ...@@ -233,11 +233,11 @@ class ModelView(BaseModelView):
def scaffold_form(self): def scaffold_form(self):
# TODO: Fix base_class # TODO: Fix base_class
form_class = model_form(self.model, form_class = model_form(self.model,
base_class=BaseForm, base_class=BaseForm,
only=self.form_columns, only=self.form_columns,
exclude=self.form_excluded_columns, exclude=self.form_excluded_columns,
field_args=self.form_args, field_args=self.form_args,
converter=self.model_form_converter()) converter=self.model_form_converter())
return form_class return form_class
......
...@@ -8,7 +8,7 @@ from wtforms.fields import SelectFieldBase ...@@ -8,7 +8,7 @@ from wtforms.fields import SelectFieldBase
from wtforms.validators import ValidationError from wtforms.validators import ValidationError
from .tools import get_primary_key from .tools import get_primary_key
from flask.ext.admin import _compat from flask.ext.admin._compat import text_type, string_types
from flask.ext.admin.model.fields import InlineFieldList, InlineModelFormField from flask.ext.admin.model.fields import InlineFieldList, InlineModelFormField
...@@ -71,7 +71,7 @@ class QuerySelectField(SelectFieldBase): ...@@ -71,7 +71,7 @@ class QuerySelectField(SelectFieldBase):
if get_label is None: if get_label is None:
self.get_label = lambda x: x self.get_label = lambda x: x
elif isinstance(get_label, _compat.string_types): elif isinstance(get_label, string_types):
self.get_label = operator.attrgetter(get_label) self.get_label = operator.attrgetter(get_label)
else: else:
self.get_label = get_label self.get_label = get_label
...@@ -99,7 +99,7 @@ class QuerySelectField(SelectFieldBase): ...@@ -99,7 +99,7 @@ class QuerySelectField(SelectFieldBase):
if self._object_list is None: if self._object_list is None:
query = self.query or self.query_factory() query = self.query or self.query_factory()
get_pk = self.get_pk get_pk = self.get_pk
self._object_list = [(_compat.as_unicode(get_pk(obj)), obj) for obj in query] self._object_list = [(text_type(get_pk(obj)), obj) for obj in query]
return self._object_list return self._object_list
def iter_choices(self): def iter_choices(self):
...@@ -239,4 +239,4 @@ class InlineModelFormList(InlineFieldList): ...@@ -239,4 +239,4 @@ class InlineModelFormList(InlineFieldList):
def get_pk_from_identity(obj): def get_pk_from_identity(obj):
# TODO: Remove me # TODO: Remove me
cls, key = identity_key(instance=obj) cls, key = identity_key(instance=obj)
return u':'.join(_compat.as_unicode(x) for x in key) return u':'.join(text_type(x) for x in key)
from flask.ext.admin import _compat from flask.ext.admin._compat import text_type
from flask.ext.admin.babel import lazy_gettext from flask.ext.admin.babel import lazy_gettext
...@@ -31,7 +31,7 @@ class BaseFilter(object): ...@@ -31,7 +31,7 @@ class BaseFilter(object):
Associated administrative view class. Associated administrative view class.
""" """
if self.options: if self.options:
return [(v, _compat.as_unicode(n)) for v, n in self.options] return [(v, text_type(n)) for v, n in self.options]
return None return None
...@@ -83,8 +83,8 @@ class BaseBooleanFilter(BaseFilter): ...@@ -83,8 +83,8 @@ class BaseBooleanFilter(BaseFilter):
""" """
def __init__(self, name, options=None, data_type=None): def __init__(self, name, options=None, data_type=None):
super(BaseBooleanFilter, self).__init__(name, super(BaseBooleanFilter, self).__init__(name,
(('1', lazy_gettext('Yes')), (('1', lazy_gettext(u'Yes')),
('0', lazy_gettext('No'))), ('0', lazy_gettext(u'No'))),
data_type) data_type)
def validate(self, value): def validate(self, value):
......
from jinja2 import Markup from jinja2 import Markup
from flask.ext.admin import _compat from flask.ext.admin._compat import text_type
def null_formatter(view, value): def null_formatter(view, value):
...@@ -39,7 +39,7 @@ def list_formatter(view, values): ...@@ -39,7 +39,7 @@ def list_formatter(view, values):
:param values: :param values:
Value to check Value to check
""" """
return u', '.join(_compat.as_unicode(v) for v in values) return u', '.join(text_type(v) for v in values)
BASE_FORMATTERS = { BASE_FORMATTERS = {
......
from nose.tools import eq_, ok_ from nose.tools import eq_, ok_
import os.path as op import os.path as op
from flask.ext.admin import _compat
from flask.ext.admin.contrib import fileadmin from flask.ext.admin.contrib import fileadmin
from . import setup from . import setup
...@@ -24,6 +23,6 @@ def test_file_admin(): ...@@ -24,6 +23,6 @@ def test_file_admin():
rv = client.get('/admin/fileadmin/') rv = client.get('/admin/fileadmin/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
ok_('dummy.txt' in _compat.as_unicode(rv.data)) ok_('dummy.txt' in rv.data.decode('utf-8'))
# TODO: Check actions, etc # TODO: Check actions, etc
...@@ -2,7 +2,7 @@ from nose.tools import eq_, ok_, raises ...@@ -2,7 +2,7 @@ from nose.tools import eq_, ok_, raises
from wtforms import fields from wtforms import fields
from flask.ext.admin import _compat from flask.ext.admin._compat import iteritems
from flask.ext.admin.contrib.sqlamodel import ModelView from flask.ext.admin.contrib.sqlamodel import ModelView
from . import setup from . import setup
...@@ -12,7 +12,7 @@ class CustomModelView(ModelView): ...@@ -12,7 +12,7 @@ class CustomModelView(ModelView):
def __init__(self, model, session, def __init__(self, model, session,
name=None, category=None, endpoint=None, url=None, name=None, category=None, endpoint=None, url=None,
**kwargs): **kwargs):
for k, v in _compat.iteritems(kwargs): for k, v in iteritems(kwargs):
setattr(self, k, v) setattr(self, k, v)
super(CustomModelView, self).__init__(model, session, super(CustomModelView, self).__init__(model, session,
...@@ -103,14 +103,14 @@ def test_model(): ...@@ -103,14 +103,14 @@ def test_model():
eq_(rv.status_code, 302) eq_(rv.status_code, 302)
model = db.session.query(Model1).first() model = db.session.query(Model1).first()
eq_(model.test1, 'test1large') eq_(model.test1, u'test1large')
eq_(model.test2, 'test2') eq_(model.test2, u'test2')
eq_(model.test3, '') eq_(model.test3, u'')
eq_(model.test4, '') eq_(model.test4, u'')
rv = client.get('/admin/model1view/') rv = client.get('/admin/model1view/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
ok_('test1large' in _compat.as_unicode(rv.data)) ok_(u'test1large' in rv.data.decode('utf-8'))
url = '/admin/model1view/edit/?id=%s' % model.id url = '/admin/model1view/edit/?id=%s' % model.id
rv = client.get(url) rv = client.get(url)
...@@ -159,7 +159,7 @@ def test_list_columns(): ...@@ -159,7 +159,7 @@ def test_list_columns():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/model1view/') rv = client.get('/admin/model1view/')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('Column1' in data) ok_('Column1' in data)
ok_('Test2' not in data) ok_('Test2' not in data)
...@@ -183,7 +183,7 @@ def test_exclude_columns(): ...@@ -183,7 +183,7 @@ def test_exclude_columns():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/model1view/') rv = client.get('/admin/model1view/')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('Test1' in data) ok_('Test1' in data)
ok_('Test2' not in data) ok_('Test2' not in data)
...@@ -211,7 +211,7 @@ def test_column_searchable_list(): ...@@ -211,7 +211,7 @@ def test_column_searchable_list():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/model1view/?search=model1') rv = client.get('/admin/model1view/?search=model1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('model1' in data) ok_('model1' in data)
ok_('model2' not in data) ok_('model2' not in data)
...@@ -230,24 +230,23 @@ def test_column_filters(): ...@@ -230,24 +230,23 @@ def test_column_filters():
eq_(len(view._filters), 4) eq_(len(view._filters), 4)
eq_(view._filter_dict, { eq_(view._filter_dict, {
'Test1': [ u'Test1': [
(0, 'equals'), (0, u'equals'),
(1, 'not equal'), (1, u'not equal'),
(2, 'contains'), (2, u'contains'),
(3, 'not contains') (3, u'not contains')
], ]})
})
# Test filter that references property # Test filter that references property
view = CustomModelView(Model2, db.session, view = CustomModelView(Model2, db.session,
column_filters=['model1']) column_filters=['model1'])
eq_(view._filter_dict, { eq_(view._filter_dict, {
'Model1 / Test1': [ u'Model1 / Test1': [
(0, 'equals'), (0, u'equals'),
(1, 'not equal'), (1, u'not equal'),
(2, 'contains'), (2, u'contains'),
(3, 'not contains') (3, u'not contains')
], ],
'Model1 / Test2': [ 'Model1 / Test2': [
(4, 'equals'), (4, 'equals'),
...@@ -255,27 +254,26 @@ def test_column_filters(): ...@@ -255,27 +254,26 @@ def test_column_filters():
(6, 'contains'), (6, 'contains'),
(7, 'not contains') (7, 'not contains')
], ],
'Model1 / Test3': [ u'Model1 / Test3': [
(8, 'equals'), (8, u'equals'),
(9, 'not equal'), (9, u'not equal'),
(10, 'contains'), (10, u'contains'),
(11, 'not contains') (11, u'not contains')
], ],
'Model1 / Test4': [ u'Model1 / Test4': [
(12, 'equals'), (12, u'equals'),
(13, 'not equal'), (13, u'not equal'),
(14, 'contains'), (14, u'contains'),
(15, 'not contains') (15, u'not contains')
], ],
'Model1 / Bool Field': [ u'Model1 / Bool Field': [
(16, 'equals'), (16, u'equals'),
(17, 'not equal'), (17, u'not equal'),
], ],
'Model1 / Enum Field': [ u'Model1 / Enum Field': [
(18, u'equals'), (18, u'equals'),
(19, u'not equal'), (19, u'not equal'),
] ]})
})
# Test filter with a dot # Test filter with a dot
view = CustomModelView(Model2, db.session, view = CustomModelView(Model2, db.session,
...@@ -285,8 +283,8 @@ def test_column_filters(): ...@@ -285,8 +283,8 @@ def test_column_filters():
'Model1 / Bool Field': [ 'Model1 / Bool Field': [
(0, 'equals'), (0, 'equals'),
(1, 'not equal'), (1, 'not equal'),
], ]})
})
# Fill DB # Fill DB
model1_obj1 = Model1('model1_obj1', bool_field=True) model1_obj1 = Model1('model1_obj1', bool_field=True)
model1_obj2 = Model1('model1_obj2') model1_obj2 = Model1('model1_obj2')
...@@ -307,13 +305,13 @@ def test_column_filters(): ...@@ -307,13 +305,13 @@ def test_column_filters():
rv = client.get('/admin/model1view/?flt0_0=model1_obj1') rv = client.get('/admin/model1view/?flt0_0=model1_obj1')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('model1_obj1' in data) ok_('model1_obj1' in data)
ok_('model1_obj2' not in data) ok_('model1_obj2' not in data)
rv = client.get('/admin/model1view/?flt0_5=model1_obj1') rv = client.get('/admin/model1view/?flt0_5=model1_obj1')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('model1_obj1' in data) ok_('model1_obj1' in data)
ok_('model1_obj2' in data) ok_('model1_obj2' in data)
...@@ -341,7 +339,7 @@ def test_column_filters(): ...@@ -341,7 +339,7 @@ def test_column_filters():
rv = client.get('/admin/_model2/?flt1_0=1') rv = client.get('/admin/_model2/?flt1_0=1')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('model2_obj1' in data) ok_('model2_obj1' in data)
ok_('model2_obj2' in data) ok_('model2_obj2' in data)
ok_('model2_obj3' not in data) ok_('model2_obj3' not in data)
...@@ -368,41 +366,41 @@ def test_url_args(): ...@@ -368,41 +366,41 @@ def test_url_args():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/model1view/') rv = client.get('/admin/model1view/')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data1' in data) ok_('data1' in data)
ok_('data3' not in data) ok_('data3' not in data)
# page # page
rv = client.get('/admin/model1view/?page=1') rv = client.get('/admin/model1view/?page=1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data1' not in data) ok_('data1' not in data)
ok_('data3' in data) ok_('data3' in data)
# sort # sort
rv = client.get('/admin/model1view/?sort=0&desc=1') rv = client.get('/admin/model1view/?sort=0&desc=1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data1' not in data) ok_('data1' not in data)
ok_('data3' in data) ok_('data3' in data)
ok_('data4' in data) ok_('data4' in data)
# search # search
rv = client.get('/admin/model1view/?search=data1') rv = client.get('/admin/model1view/?search=data1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data1' in data) ok_('data1' in data)
ok_('data2' not in data) ok_('data2' not in data)
rv = client.get('/admin/model1view/?search=^data1') rv = client.get('/admin/model1view/?search=^data1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data2' not in data) ok_('data2' not in data)
# like # like
rv = client.get('/admin/model1view/?flt0=0&flt0v=data1') rv = client.get('/admin/model1view/?flt0=0&flt0v=data1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data1' in data) ok_('data1' in data)
# not like # not like
rv = client.get('/admin/model1view/?flt0=1&flt0v=data1') rv = client.get('/admin/model1view/?flt0=1&flt0v=data1')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('data2' in data) ok_('data2' in data)
...@@ -429,12 +427,12 @@ def test_non_int_pk(): ...@@ -429,12 +427,12 @@ def test_non_int_pk():
rv = client.get('/admin/modelview/') rv = client.get('/admin/modelview/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('test1' in data) ok_('test1' in data)
rv = client.get('/admin/modelview/edit/?id=test1') rv = client.get('/admin/modelview/edit/?id=test1')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('test2' in data) ok_('test2' in data)
......
...@@ -4,7 +4,8 @@ from flask import Flask ...@@ -4,7 +4,8 @@ from flask import Flask
from wtforms import fields from wtforms import fields
from flask.ext.admin import Admin, form, _compat from flask.ext.admin import Admin, form
from flask.ext.admin._compat import iteritems, itervalues
from flask.ext.admin.model import base, filters from flask.ext.admin.model import base, filters
...@@ -35,7 +36,7 @@ class MockModelView(base.BaseModelView): ...@@ -35,7 +36,7 @@ class MockModelView(base.BaseModelView):
def __init__(self, model, name=None, category=None, endpoint=None, url=None, def __init__(self, model, name=None, category=None, endpoint=None, url=None,
**kwargs): **kwargs):
# Allow to set any attributes from parameters # Allow to set any attributes from parameters
for k, v in _compat.iteritems(kwargs): for k, v in iteritems(kwargs):
setattr(self, k, v) setattr(self, k, v)
super(MockModelView, self).__init__(model, name, category, endpoint, url) super(MockModelView, self).__init__(model, name, category, endpoint, url)
...@@ -77,7 +78,7 @@ class MockModelView(base.BaseModelView): ...@@ -77,7 +78,7 @@ class MockModelView(base.BaseModelView):
# Data # Data
def get_list(self, page, sort_field, sort_desc, search, filters): def get_list(self, page, sort_field, sort_desc, search, filters):
self.search_arguments.append((page, sort_field, sort_desc, search, filters)) self.search_arguments.append((page, sort_field, sort_desc, search, filters))
return len(self.all_models), _compat.itervalues(self.all_models) return len(self.all_models), itervalues(self.all_models)
def get_one(self, id): def get_one(self, id):
return self.all_models.get(int(id)) return self.all_models.get(int(id))
...@@ -153,7 +154,7 @@ def test_mockview(): ...@@ -153,7 +154,7 @@ def test_mockview():
# Try model edit view # Try model edit view
rv = client.get('/admin/modelview/edit/?id=3') rv = client.get('/admin/modelview/edit/?id=3')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('test1' in data) ok_('test1' in data)
rv = client.post('/admin/modelview/edit/?id=3', rv = client.post('/admin/modelview/edit/?id=3',
...@@ -232,7 +233,7 @@ def test_list_columns(): ...@@ -232,7 +233,7 @@ def test_list_columns():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/modelview/') rv = client.get('/admin/modelview/')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('Column1' in data) ok_('Column1' in data)
ok_('Col2' not in data) ok_('Col2' not in data)
...@@ -248,7 +249,7 @@ def test_exclude_columns(): ...@@ -248,7 +249,7 @@ def test_exclude_columns():
client = app.test_client() client = app.test_client()
rv = client.get('/admin/modelview/') rv = client.get('/admin/modelview/')
data = _compat.as_unicode(rv.data) data = rv.data.decode('utf-8')
ok_('Col1' in data) ok_('Col1' in data)
ok_('Col2' not in data) ok_('Col2' not in data)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment