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