Commit 19ae3be1 authored by Serge S. Koval's avatar Serge S. Koval

Peewee backend: support for search in related models

parent cdadb1bd
...@@ -45,8 +45,7 @@ class PostAdmin(peeweemodel.ModelView): ...@@ -45,8 +45,7 @@ class PostAdmin(peeweemodel.ModelView):
# a column. # a column.
#sortable_columns = ('title', ('user', User.username), 'date') #sortable_columns = ('title', ('user', User.username), 'date')
#searchable_columns = ('title', User.username) searchable_columns = ('title', User.username)
searchable_columns = ('title',)
column_filters = ('title', column_filters = ('title',
'date', 'date',
......
...@@ -38,13 +38,12 @@ class ModelView(BaseModelView): ...@@ -38,13 +38,12 @@ class ModelView(BaseModelView):
def __init__(self, model, name=None, def __init__(self, model, name=None,
category=None, endpoint=None, url=None): category=None, endpoint=None, url=None):
self._search_fields = []
super(ModelView, self).__init__(model, name, category, endpoint, url) super(ModelView, self).__init__(model, name, category, endpoint, url)
self._primary_key = self.scaffold_pk() self._primary_key = self.scaffold_pk()
self._search_fields = []
self._search_joins = dict()
def _get_model_fields(self, model=None): def _get_model_fields(self, model=None):
if model is None: if model is None:
model = self.model model = self.model
...@@ -90,8 +89,6 @@ class ModelView(BaseModelView): ...@@ -90,8 +89,6 @@ class ModelView(BaseModelView):
return columns return columns
def init_search(self): def init_search(self):
self._search_fields = []
if self.searchable_columns: if self.searchable_columns:
for p in self.searchable_columns: for p in self.searchable_columns:
if isinstance(p, basestring): if isinstance(p, basestring):
...@@ -105,17 +102,7 @@ class ModelView(BaseModelView): ...@@ -105,17 +102,7 @@ class ModelView(BaseModelView):
raise Exception('Can only search on text columns. ' + raise Exception('Can only search on text columns. ' +
'Failed to setup search for "%s"' % p) 'Failed to setup search for "%s"' % p)
# Try to find reference from this model to the field self._search_fields.append(p)
if p.model != self.model:
path = self._find_field(self.model, p, set())
if path is None:
raise Exception('Can not find relation path from the %s' +
'to the %s.%s' % (self.model, p.model, p.name))
self._search_fields.append(path)
else:
self._search_fields.append(p.name)
return bool(self._search_fields) return bool(self._search_fields)
...@@ -156,6 +143,16 @@ class ModelView(BaseModelView): ...@@ -156,6 +143,16 @@ class ModelView(BaseModelView):
field_args=self.form_args, field_args=self.form_args,
converter=CustomModelConverter()) converter=CustomModelConverter())
def _handle_join(self, query, field, joins):
if field.model != self.model:
model_name = field.model.__name__
if model_name not in joins:
query = query.join(field.model)
joins.add(model_name)
return query
def get_list(self, page, sort_column, sort_desc, search, filters, def get_list(self, page, sort_column, sort_desc, search, filters,
execute=True): execute=True):
query = self.model.select() query = self.model.select()
...@@ -172,10 +169,9 @@ class ModelView(BaseModelView): ...@@ -172,10 +169,9 @@ class ModelView(BaseModelView):
stmt = None stmt = None
for field in self._search_fields: for field in self._search_fields:
flt = '%s__icontains' % field query = self._handle_join(query, field, joins)
q = Q(**{flt: term})
#print flt, term q = field ** term
if stmt is None: if stmt is None:
stmt = q stmt = q
...@@ -189,13 +185,7 @@ class ModelView(BaseModelView): ...@@ -189,13 +185,7 @@ class ModelView(BaseModelView):
for flt, value in filters: for flt, value in filters:
f = self._filters[flt] f = self._filters[flt]
if f.column.model != self.model: query = self._handle_join(query, f.column, joins)
model_name = f.column.model.__name__
if model_name not in joins:
query = query.join(f.column.model)
joins.add(model_name)
query = self._filters[flt].apply(query, value) query = self._filters[flt].apply(query, value)
# Get count # Get count
......
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