Test coverage for vnccollab.common.browser.search
vnccollab/ | | covered 95% (12 of 287 uncovered) |
common/ | | covered 95% (12 of 287 uncovered) |
browser/ | | covered 90% (11 of 119 uncovered) |
search.py | | covered 91% (6 of 68 uncovered) |
1: from plone import api
1: from plone.app.search.browser import Search as OriginalSearch
1: from plone.app.contentlisting.interfaces import IContentListing
1: from Products.ZCTextIndex.ParseTree import ParseError
1: from Products.CMFPlone.PloneBatch import Batch
1: from vnccollab.common import searchutil
2: class Search(OriginalSearch):
1: '''Search extension to allow keyword searchs'''
1: def results(self, query=None, batch=True, b_size=10, b_start=0,
1: allowed_keys=None):
''' Get properly wrapped search results from the catalog.
Everything in Plone that performs searches should go through this
view.
'query' should be a dictionary of catalog parameters.
'''
2: searchable_text = self.get_searchable_text(query)
2: if searchutil._is_keyword_search(searchable_text, allowed_keys):
2: results = self.keyword_results(query, batch, b_size, b_start)
2: return results
else:
>>>>>> return OriginalSearch.results(self, query, batch, b_size, b_start)
1: def get_searchable_text(self, query=None):
'''Returns the searchable text for the query.'''
4: if query is None:
4: query = {}
4: request = self.request
4: text = query.get('SearchableText', '')
4: if not text:
4: text = request.form.get('SearchableText', '')
4: if not text:
# Without text, the only meaningful case is Subject
>>>>>> text = request.form.get('Subject', '')
4: return text
1: def keyword_results(self, query=None, batch=True, b_size=10, b_start=0):
'''Returns the result of a keywor query.
The current accepted keywords are:
user: An ORed list of words that should appear in the user info.
type: An ORed list of content types.
'''
2: searchable_text = self.get_searchable_text(query)
2: key, val = searchutil._key_and_val_from_searchable_text(searchable_text)
2: if key == 'type':
1: return self.type_results(query, batch, b_size, b_start, val)
1: elif key == 'user':
1: return self.user_results(query, batch, b_size, b_start, val)
else:
>>>>>> return []
1: def type_results(self, query=None, batch=True, b_size=10, b_start=0, type_string=''):
'''Returns the result of a search for the given content types.
'''
1: query = self._prepare_query(query, batch, b_size, b_start)
1: types = searchutil._types_from_type_string(type_string)
10: portal_type = [x for x in query.get('portal_type', []) if x in types]
1: query['portal_type'] = portal_type
1: del(query['SearchableText'])
1: results = self._result_from_query(query, batch, b_size, b_start)
1: return results
1: def user_results(self, query=None, batch=True, b_size=10, b_start=0, users_string=''):
'''Returns the result of a search for the user which info coincides with args.
'''
1: query = self._prepare_query(query, batch, b_size, b_start)
1: user_ids = searchutil._user_ids_from_users_string(users_string)
1: query['Creator'] = user_ids
1: del(query['SearchableText'])
1: results = self._result_from_query(query, batch, b_size, b_start)
1: return results
1: def _prepare_query(self, query=None, batch=True, b_size=10, b_start=0):
'''Converts the query in a dict, obtaining info from the request, if not
directly available.'''
2: if query is None:
2: query = {}
2: if batch:
2: query['b_start'] = b_start = int(b_start)
2: query['b_size'] = b_size
2: query = self.filter_query(query)
2: return query
1: def _result_from_query(self, query=None, batch=True, b_size=10, b_start=0):
'''Given a query (as dict or None) returns its result.'''
2: if query is None:
>>>>>> results = []
else:
2: catalog = api.portal.get_tool(name='portal_catalog')
2: try:
2: results = catalog(**query)
>>>>>> except ParseError:
>>>>>> return []
2: results = IContentListing(results)
2: if batch:
2: results = Batch(results, b_size, b_start)
2: return results