Commit 94ef77ee authored by PJ Janse van Rensburg's avatar PJ Janse van Rensburg

Test 'form_choices' and enum field behaviour.

parent 29f17f21
...@@ -10,7 +10,7 @@ from flask_admin.contrib.sqla import ModelView, filters, tools ...@@ -10,7 +10,7 @@ from flask_admin.contrib.sqla import ModelView, filters, tools
from flask_babelex import Babel from flask_babelex import Babel
from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy_utils import EmailType, ChoiceType from sqlalchemy_utils import EmailType
from . import setup from . import setup
...@@ -18,11 +18,6 @@ from datetime import datetime, time, date ...@@ -18,11 +18,6 @@ from datetime import datetime, time, date
import enum import enum
class EnumChoices(enum.Enum):
first = 1
second = 2
class CustomModelView(ModelView): 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,
...@@ -32,14 +27,20 @@ class CustomModelView(ModelView): ...@@ -32,14 +27,20 @@ class CustomModelView(ModelView):
super(CustomModelView, self).__init__(model, session, name, category, super(CustomModelView, self).__init__(model, session, name, category,
endpoint, url) endpoint, url)
form_choices = {
'choice_field': [
('choice-1', 'One'),
('choice-2', 'Two')
]
}
def create_models(db): def create_models(db):
class Model1(db.Model): class Model1(db.Model):
def __init__(self, test1=None, test2=None, test3=None, test4=None, def __init__(self, test1=None, test2=None, test3=None, test4=None,
bool_field=False, date_field=None, time_field=None, bool_field=False, date_field=None, time_field=None,
datetime_field=None, enum_field=None, email_field=None, datetime_field=None, email_field=None,
choice_field=None, enum_choice_field=None): choice_field=None, enum_field=None):
self.test1 = test1 self.test1 = test1
self.test2 = test2 self.test2 = test2
self.test3 = test3 self.test3 = test3
...@@ -48,10 +49,9 @@ def create_models(db): ...@@ -48,10 +49,9 @@ def create_models(db):
self.date_field = date_field self.date_field = date_field
self.time_field = time_field self.time_field = time_field
self.datetime_field = datetime_field self.datetime_field = datetime_field
self.enum_field = enum_field
self.email_field = email_field self.email_field = email_field
self.choice_field = choice_field self.choice_field = choice_field
self.enum_choice_field = enum_choice_field self.enum_field = enum_field
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
test1 = db.Column(db.String(20)) test1 = db.Column(db.String(20))
...@@ -59,16 +59,12 @@ def create_models(db): ...@@ -59,16 +59,12 @@ def create_models(db):
test3 = db.Column(db.Text) test3 = db.Column(db.Text)
test4 = db.Column(db.UnicodeText) test4 = db.Column(db.UnicodeText)
bool_field = db.Column(db.Boolean) bool_field = db.Column(db.Boolean)
enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True)
date_field = db.Column(db.Date) date_field = db.Column(db.Date)
time_field = db.Column(db.Time) time_field = db.Column(db.Time)
datetime_field = db.Column(db.DateTime) datetime_field = db.Column(db.DateTime)
email_field = db.Column(EmailType) email_field = db.Column(EmailType)
choice_field = db.Column(ChoiceType([ enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True)
('choice-1', u'First choice'), choice_field = db.Column(db.String, nullable=True)
('choice-2', u'Second choice')
]))
enum_choice_field = db.Column(ChoiceType(EnumChoices, impl=db.Integer()))
def __unicode__(self): def __unicode__(self):
return self.test1 return self.test1
...@@ -147,6 +143,7 @@ def test_model(): ...@@ -147,6 +143,7 @@ def test_model():
Model1, Model2 = create_models(db) Model1, Model2 = create_models(db)
view = CustomModelView(Model1, db.session) view = CustomModelView(Model1, db.session)
admin.add_view(view) admin.add_view(view)
eq_(view.model, Model1) eq_(view.model, Model1)
...@@ -172,26 +169,30 @@ def test_model(): ...@@ -172,26 +169,30 @@ def test_model():
eq_(view._create_form_class.test4.field_class, fields.TextAreaField) eq_(view._create_form_class.test4.field_class, fields.TextAreaField)
eq_(view._create_form_class.email_field.field_class, fields.StringField) eq_(view._create_form_class.email_field.field_class, fields.StringField)
eq_(view._create_form_class.choice_field.field_class, Select2Field) eq_(view._create_form_class.choice_field.field_class, Select2Field)
eq_(view._create_form_class.enum_choice_field.field_class, Select2Field) eq_(view._create_form_class.enum_field.field_class, Select2Field)
# Make some test clients # Make some test clients
client = app.test_client() client = app.test_client()
# check that we can retrieve a list view
rv = client.get('/admin/model1/') rv = client.get('/admin/model1/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
# check that we can retrieve a 'create' view
rv = client.get('/admin/model1/new/') rv = client.get('/admin/model1/new/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
# create a new record
rv = client.post('/admin/model1/new/', rv = client.post('/admin/model1/new/',
data=dict(test1='test1large', data=dict(test1='test1large',
test2='test2', test2='test2',
time_field=time(0, 0, 0), time_field=time(0, 0, 0),
email_field="Test@TEST.com", email_field="Test@TEST.com",
choice_field="choice-1", choice_field="choice-1",
enum_choice_field=1)) enum_field='model1_v1'))
eq_(rv.status_code, 302) eq_(rv.status_code, 302)
# check that the new record was persisted
model = db.session.query(Model1).first() model = db.session.query(Model1).first()
eq_(model.test1, u'test1large') eq_(model.test1, u'test1large')
eq_(model.test2, u'test2') eq_(model.test2, u'test2')
...@@ -199,12 +200,14 @@ def test_model(): ...@@ -199,12 +200,14 @@ def test_model():
eq_(model.test4, u'') eq_(model.test4, u'')
eq_(model.email_field, u'test@test.com') eq_(model.email_field, u'test@test.com')
eq_(model.choice_field, u'choice-1') eq_(model.choice_field, u'choice-1')
eq_(model.enum_choice_field, EnumChoices(1)) eq_(model.enum_field, u'model1_v1')
# check that the new record shows up on the list view
rv = client.get('/admin/model1/') rv = client.get('/admin/model1/')
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
ok_(u'test1large' in rv.data.decode('utf-8')) ok_(u'test1large' in rv.data.decode('utf-8'))
# check that we can retrieve an edit view
url = '/admin/model1/edit/?id=%s' % model.id url = '/admin/model1/edit/?id=%s' % model.id
rv = client.get(url) rv = client.get(url)
eq_(rv.status_code, 200) eq_(rv.status_code, 200)
...@@ -212,20 +215,26 @@ def test_model(): ...@@ -212,20 +215,26 @@ def test_model():
# verify that midnight does not show as blank # verify that midnight does not show as blank
ok_(u'00:00:00' in rv.data.decode('utf-8')) ok_(u'00:00:00' in rv.data.decode('utf-8'))
# edit the record
rv = client.post(url, rv = client.post(url,
data=dict(test1='test1small', data=dict(test1='test1small',
test2='test2large', test2='test2large',
email_field='Test2@TEST.com', email_field='Test2@TEST.com',
choice_field=None)) choice_field='__None',
enum_field='__None'))
eq_(rv.status_code, 302) eq_(rv.status_code, 302)
# check that the changes were persisted
model = db.session.query(Model1).first() model = db.session.query(Model1).first()
eq_(model.test1, 'test1small') eq_(model.test1, 'test1small')
eq_(model.test2, 'test2large') eq_(model.test2, 'test2large')
eq_(model.test3, '') eq_(model.test3, '')
eq_(model.test4, '') eq_(model.test4, '')
eq_(model.email_field, u'test2@test.com') eq_(model.email_field, u'test2@test.com')
eq_(model.choice_field, None)
eq_(model.enum_field, None)
# check that the model can be deleted
url = '/admin/model1/delete/?id=%s' % model.id url = '/admin/model1/delete/?id=%s' % model.id
rv = client.post(url) rv = client.post(url)
eq_(rv.status_code, 302) eq_(rv.status_code, 302)
...@@ -316,8 +325,7 @@ def test_exclude_columns(): ...@@ -316,8 +325,7 @@ def test_exclude_columns():
eq_( eq_(
view._list_columns, view._list_columns,
[('test1', 'Test1'), ('test3', 'Test3'), ('bool_field', 'Bool Field'), [('test1', 'Test1'), ('test3', 'Test3'), ('bool_field', 'Bool Field'),
('email_field', 'Email Field'), ('choice_field', 'Choice Field'), ('email_field', 'Email Field'), ('choice_field', 'Choice Field')]
('enum_choice_field', 'Enum Choice Field')]
) )
client = app.test_client() client = app.test_client()
...@@ -672,13 +680,65 @@ def test_column_filters(): ...@@ -672,13 +680,65 @@ def test_column_filters():
) )
eq_( eq_(
[(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Enum Field']], [(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Date Field']],
[ [
(30, u'equals'), (30, u'equals'),
(31, u'not equal'), (31, u'not equal'),
(32, u'empty'), (32, u'greater than'),
(33, u'in list'), (33, u'smaller than'),
(34, u'not in list'), (34, u'between'),
(35, u'not between'),
(36, u'empty'),
]
)
eq_(
[(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Time Field']],
[
(37, u'equals'),
(38, u'not equal'),
(39, u'greater than'),
(40, u'smaller than'),
(41, u'between'),
(42, u'not between'),
(43, u'empty'),
]
)
eq_(
[(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Datetime Field']],
[
(44, u'equals'),
(45, u'not equal'),
(46, u'greater than'),
(47, u'smaller than'),
(48, u'between'),
(49, u'not between'),
(50, u'empty'),
]
)
eq_(
[(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Enum Field']],
[
(51, u'equals'),
(52, u'not equal'),
(53, u'empty'),
(54, u'in list'),
(55, u'not in list'),
]
)
eq_(
[(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Choice Field']],
[
(56, u'contains'),
(57, u'not contains'),
(58, u'equals'),
(59, u'not equal'),
(60, u'empty'),
(61, u'in list'),
(62, u'not in list'),
] ]
) )
...@@ -1533,10 +1593,13 @@ def test_form_columns(): ...@@ -1533,10 +1593,13 @@ def test_form_columns():
text_field = db.Column(db.UnicodeText) text_field = db.Column(db.UnicodeText)
excluded_column = db.Column(db.String) excluded_column = db.Column(db.String)
class ChildModel(db.Model): class ChildModel(db.Model):
id = db.Column(db.String, primary_key=True) id = db.Column(db.String, primary_key=True)
model_id = db.Column(db.Integer, db.ForeignKey(Model.id)) model_id = db.Column(db.Integer, db.ForeignKey(Model.id))
model = db.relationship(Model, backref='backref') model = db.relationship(Model, backref='backref')
enum_field = db.Column(db.Enum('model1_v1', 'model1_v2'), nullable=True)
choice_field = db.Column(db.String, nullable=True)
db.create_all() db.create_all()
...@@ -1555,17 +1618,21 @@ def test_form_columns(): ...@@ -1555,17 +1618,21 @@ def test_form_columns():
ok_('datetime_field' not in form1._fields) ok_('datetime_field' not in form1._fields)
ok_('excluded_column' not in form2._fields) ok_('excluded_column' not in form2._fields)
# check that relation shows up as a query select
ok_(type(form3.model).__name__ == 'QuerySelectField') ok_(type(form3.model).__name__ == 'QuerySelectField')
# check that select field is rendered if form_choices were specified
ok_(type(form3.choice_field).__name__ == 'Select2Field')
# check that select field is rendered for enum fields
ok_(type(form3.enum_field).__name__ == 'Select2Field')
# test form_columns with model objects # test form_columns with model objects
view4 = CustomModelView(Model, db.session, endpoint='view1', view4 = CustomModelView(Model, db.session, endpoint='view1',
form_columns=[Model.int_field]) form_columns=[Model.int_field])
form4 = view4.create_form() form4 = view4.create_form()
ok_('int_field' in form4._fields) ok_('int_field' in form4._fields)
# test form_columns with special sqlalchemy_utils types
@raises(Exception) @raises(Exception)
def test_complex_form_columns(): def test_complex_form_columns():
......
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