Commit 115eb996 authored by PJ Janse van Rensburg's avatar PJ Janse van Rensburg

Merge branch 'master' of git://github.com/algoo/flask-admin into prs-to-merge

parents b612215c ee9305db
...@@ -628,9 +628,22 @@ class ModelView(BaseModelView): ...@@ -628,9 +628,22 @@ class ModelView(BaseModelView):
column = columns[0] column = columns[0]
# If filter related to relation column (represented by
# relation_name.target_column) we collect here relation name
joined_column_name = None
if '.' in name:
joined_column_name = name.split('.')[0]
# Join not needed for hybrid properties # Join not needed for hybrid properties
if (not is_hybrid_property and tools.need_join(self.model, column.table) and if (not is_hybrid_property and tools.need_join(self.model, column.table) and
name not in self.column_labels): name not in self.column_labels):
if joined_column_name:
visible_name = '%s / %s / %s' % (
joined_column_name,
self.get_column_name(column.table.name),
self.get_column_name(column.name)
)
else:
visible_name = '%s / %s' % ( visible_name = '%s / %s' % (
self.get_column_name(column.table.name), self.get_column_name(column.table.name),
self.get_column_name(column.name) self.get_column_name(column.name)
...@@ -657,10 +670,19 @@ class ModelView(BaseModelView): ...@@ -657,10 +670,19 @@ class ModelView(BaseModelView):
options=self.column_choices.get(name), options=self.column_choices.get(name),
) )
key_name = column
# In case of filter related to relation column filter key
# must be named with relation name (to prevent following same
# target column to replace previous)
if joined_column_name:
key_name = "{0}.{1}".format(joined_column_name, column)
for f in flt:
f.key_name = key_name
if joins: if joins:
self._filter_joins[column] = joins self._filter_joins[key_name] = joins
elif not is_hybrid_property and tools.need_join(self.model, column.table): elif not is_hybrid_property and tools.need_join(self.model, column.table):
self._filter_joins[column] = [column.table] self._filter_joins[key_name] = [column.table]
return flt return flt
...@@ -900,7 +922,9 @@ class ModelView(BaseModelView): ...@@ -900,7 +922,9 @@ class ModelView(BaseModelView):
# Figure out joins # Figure out joins
if isinstance(flt, sqla_filters.BaseSQLAFilter): if isinstance(flt, sqla_filters.BaseSQLAFilter):
path = self._filter_joins.get(flt.column, []) # If no key_name is specified, use filter column as filter key
filter_key = flt.key_name or flt.column
path = self._filter_joins.get(filter_key, [])
query, joins, alias = self._apply_path_joins(query, joins, path, inner_join=False) query, joins, alias = self._apply_path_joins(query, joins, path, inner_join=False)
......
...@@ -8,7 +8,7 @@ class BaseFilter(object): ...@@ -8,7 +8,7 @@ class BaseFilter(object):
""" """
Base filter class. Base filter class.
""" """
def __init__(self, name, options=None, data_type=None): def __init__(self, name, options=None, data_type=None, key_name=None):
""" """
Constructor. Constructor.
...@@ -18,10 +18,13 @@ class BaseFilter(object): ...@@ -18,10 +18,13 @@ class BaseFilter(object):
List of fixed options. If provided, will use drop down instead of textbox. List of fixed options. If provided, will use drop down instead of textbox.
:param data_type: :param data_type:
Client-side widget type to use. Client-side widget type to use.
:param key_name:
Optional name who represent this filter.
""" """
self.name = name self.name = name
self.options = options self.options = options
self.data_type = data_type self.data_type = data_type
self.key_name = key_name
def get_options(self, view): def get_options(self, view):
""" """
......
...@@ -640,7 +640,7 @@ def test_column_filters(): ...@@ -640,7 +640,7 @@ def test_column_filters():
view = CustomModelView(Model2, db.session, view = CustomModelView(Model2, db.session,
column_filters=['model1.bool_field']) column_filters=['model1.bool_field'])
eq_([(f['index'], f['operation']) for f in view._filter_groups[u'Model1 / Bool Field']], eq_([(f['index'], f['operation']) for f in view._filter_groups[u'model1 / Model1 / Bool Field']],
[ [
(0, 'equals'), (0, 'equals'),
(1, 'not equal'), (1, 'not equal'),
......
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