Commit 13dc0bd0 authored by Gustaf Lindqvist's avatar Gustaf Lindqvist

Added _search method for mongoengine and pymongo backends for easier override

parent bd2fb1a3
...@@ -432,6 +432,26 @@ class ModelView(BaseModelView): ...@@ -432,6 +432,26 @@ class ModelView(BaseModelView):
""" """
return self.model.objects return self.model.objects
def _search(self, query, search_term):
# TODO: Unfortunately, MongoEngine contains bug which
# prevents running complex Q queries and, as a result,
# Flask-Admin does not support per-word searching like
# in other backends
op, term = parse_like_term(search_term)
criteria = None
for field in self._search_fields:
flt = {'%s__%s' % (field.name, op): term}
q = mongoengine.Q(**flt)
if criteria is None:
criteria = q
else:
criteria |= q
return query.filter(criteria)
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):
""" """
...@@ -460,24 +480,7 @@ class ModelView(BaseModelView): ...@@ -460,24 +480,7 @@ class ModelView(BaseModelView):
# Search # Search
if self._search_supported and search: if self._search_supported and search:
# TODO: Unfortunately, MongoEngine contains bug which query = self._search(query, search)
# prevents running complex Q queries and, as a result,
# Flask-Admin does not support per-word searching like
# in other backends
op, term = parse_like_term(search)
criteria = None
for field in self._search_fields:
flt = {'%s__%s' % (field.name, op): term}
q = mongoengine.Q(**flt)
if criteria is None:
criteria = q
else:
criteria |= q
query = query.filter(criteria)
# Get count # Get count
count = query.count() count = query.count()
......
...@@ -146,6 +146,42 @@ class ModelView(BaseModelView): ...@@ -146,6 +146,42 @@ class ModelView(BaseModelView):
""" """
return model.get(name) return model.get(name)
def _search(self, query, search_term):
values = search_term.split(' ')
queries = []
# Construct inner querie
for value in values:
if not value:
continue
regex = parse_like_term(value)
stmt = []
for field in self._search_fields:
stmt.append({field: {'$regex': regex}})
if stmt:
if len(stmt) == 1:
queries.append(stmt[0])
else:
queries.append({'$or': stmt})
# Construct final query
if queries:
if len(queries) == 1:
final = queries[0]
else:
final = {'$and': queries}
if query:
query = {'$and': [query, final]}
else:
query = final
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):
""" """
...@@ -182,38 +218,7 @@ class ModelView(BaseModelView): ...@@ -182,38 +218,7 @@ class ModelView(BaseModelView):
# Search # Search
if self._search_supported and search: if self._search_supported and search:
values = search.split(' ') query = self._search(query, search)
queries = []
# Construct inner querie
for value in values:
if not value:
continue
regex = parse_like_term(value)
stmt = []
for field in self._search_fields:
stmt.append({field: {'$regex': regex}})
if stmt:
if len(stmt) == 1:
queries.append(stmt[0])
else:
queries.append({'$or': stmt})
# Construct final query
if queries:
if len(queries) == 1:
final = queries[0]
else:
final = {'$and': queries}
if query:
query = {'$and': [query, final]}
else:
query = final
# Get count # Get count
count = self.coll.find(query).count() count = self.coll.find(query).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