def results(self, b_size=5, b_start=0): """Apply a custom query over the collection results.""" custom_query = {} b_start = int(b_start) text = self.request.form.get('SearchableText', '') if text: custom_query['SearchableText'] = quote_chars(text) created = self.request.form.get('created', {}) if self.valid_period(created): custom_query['created'] = created sort_on = self.request.form.get('sort_on', '') if sort_on not in ('', 'Date', 'sortable_title'): sort_on = '' sort_order = 'reverse' if sort_on == 'Date' else 'ascending' custom_query['sort_order'] = sort_order results = self.context.results( b_start=b_start, b_size=b_size, custom_query=custom_query, sort_on=sort_on, ) return results
def results(self, b_size=5, b_start=0): """Apply a custom query over the collection results.""" custom_query = {} b_start = int(b_start) text = self.request.form.get('SearchableText', '') if text: custom_query['SearchableText'] = quote_chars(text) created = self.request.form.get('created', {}) if self.valid_period(created): custom_query['created'] = created sort_on = self.request.form.get('sort_on', '') if sort_on not in ('', 'Date', 'sortable_title'): sort_on = '' sort_order = 'reverse' if sort_on == 'Date' else 'ascending' custom_query['sort_order'] = sort_order results = self.context.results( b_start=b_start, b_size=b_size, custom_query=custom_query, sort_on=sort_on, ) return results
def results(self, batch=True, b_size=16, b_start=0): """Return latests media on the site""" query = { 'sort_on': 'Date', 'sort_order': 'reverse', } if batch: b_start = int(b_start) text = self.request.form.get('SearchableText', '') if text: query['SearchableText'] = quote_chars(text) portal_type = self.request.form.get('portal_type', '') portal_type = self.filter_types(portal_type) query['portal_type'] = self.filter_types(portal_type) created = self.request.form.get('created', {}) if self.valid_period(created): query['created'] = created # TODO: include results in current context only results = api.content.find(**query) results = IContentListing(results) if batch: results = Batch(results, b_size, b_start) return results
def searchterms(self, quote=True): q = self.request.get('q', '') for char in ('?', '-', '+', '*'): q = q.replace(char, ' ') q = quote_chars(q) if quote: return url_quote_plus(q) return q
def _filter_query(self, query): """The _filter_query of the standard search view (plone.app.search) cancel the query generation if not SearchableText is given. In some case (for example in opengever.advancedsearch), we generate also searches without a searchabletext. So we temporarily fake the SearchableText. Besides that we also handle date range queries and subject queries separately. XXX This method should be removed, after the solr integration meta-XXX should it? now it contains custom stuff. """ request = self.request text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') for key, value in request.form.items(): self.handle_query_filter_value(query, key, value) if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) # Special treatment for the Subject index # The index only stores unicode values, so we have to search # for unicode values. if 'Subject' in query: query['Subject'] = safe_unicode(query['Subject']) return query
def _filter_query(self, query): """The _filter_query of the standard search view (plone.app.search) cancel the query generation if not SearchableText is given. In some case (for example in opengever.advancedsearch), we generate also searches without a searchabletext. So we temporarily fake the SearchableText. Besides that we also handle date range queries and subject queries separately. XXX This method should be removed, after the solr integration meta-XXX should it? now it contains custom stuff. """ request = self.request text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') for key, value in request.form.items(): self.handle_query_filter_value(query, key, value) if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) # Special treatment for the Subject index # The index only stores unicode values, so we have to search # for unicode values. if 'Subject' in query: query['Subject'] = safe_unicode(query['Subject']) return query
def _update_query(self): """build query from request""" self.query = { "path": self.context_path, "sort_on": "modified", "sort_order": "reverse", } self._update_query_portal_type() text = self.request.get('SearchableText', None) if text is not None: self.query["SearchableText"] = quote_chars(text) for k, v in self.request.form.items(): if v and k in self.valid_keys: self.query[k] = v if self.query['sort_on'] == 'relevance': del self.query['sort_on']
def _update_query(self): """build query from request""" self.query = { "path": self.context_path, "sort_on": "modified", "sort_order": "reverse", } self._update_query_portal_type() text = self.request.get('SearchableText', None) if text is not None: self.query["SearchableText"] = quote_chars(text) for k, v in self.request.form.items(): if v and k in self.valid_keys: self.query[k] = v if self.query['sort_on'] == 'relevance': del self.query['sort_on']
def filter_query(self, query): """The filter query of the standard search view (plone.app.search) cancel the query generation if not SearchableText is given. In some case (for example in opengever.advancedsearch), we generate also searches without a searchabletext. So we temporarily fake the SearchableText. XXX This method should be removed, after the solr integration""" request = self.request text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') catalog = getToolByName(self.context, 'portal_catalog') valid_keys = self.valid_keys + tuple(catalog.indexes()) for k, v in request.form.items(): if v and ((k in valid_keys) or k.startswith('facet.')) \ and not k.endswith('_usage'): if '%s_usage' % (k) in request.form.keys(): v = {'query': (DateTime(v[0]), DateTime(v[1])), 'range': 'min:max'} query[k] = v if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query
def filter_query(self, query): request = self.request text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') if not text: # Without text, the only meaningful case is Subject subjects = request.form.get('Subject') if not subjects: return valid_keys = self.valid_keys for catalog_name in self.catalogs: catalog = getToolByName(self.context, catalog_name) valid_keys = valid_keys + tuple(catalog.indexes()) valid_keys = sorted(set(valid_keys)) for k, v in request.form.items(): if v and ((k in valid_keys) or k.startswith('facet.')): query[k] = v if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query
def filter_query(self, query): request = self.request catalog = getToolByName(self.context, 'portal_catalog') valid_indexes = tuple(catalog.indexes()) valid_keys = self.valid_keys + valid_indexes text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') if not text: # Without text, must provide a meaningful non-empty search valid = set(valid_indexes).intersection(request.form.keys()) or \ set(valid_indexes).intersection(query.keys()) if not valid: return for k, v in request.form.items(): if v and ((k in valid_keys) or k.startswith('facet.')): query[k] = v if text: query['SearchableText'] = quote_chars(text) + '*' # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query
def filter_query(self, query): request = self.request text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') if not text: # Without text, the only meaningful case is Subject subjects = request.form.get('Subject') if not subjects: return valid_keys = self.valid_keys for catalog_name in self.catalogs: catalog = getToolByName(self.context, catalog_name) valid_keys = valid_keys + tuple(catalog.indexes()) valid_keys = sorted(set(valid_keys)) for k, v in request.form.items(): if v and ((k in valid_keys) or k.startswith('facet.')): query[k] = v if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query
def filter_query(self, query): request = self.request catalog = getToolByName(self.context, 'portal_catalog') valid_indexes = tuple(catalog.indexes()) valid_keys = self.valid_keys + valid_indexes text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') if not text: # Without text, must provide a meaningful non-empty search valid = set(valid_indexes).intersection(request.form.keys()) or \ set(valid_indexes).intersection(query.keys()) if not valid: return for k, v in request.form.items(): if v and ((k in valid_keys) or k.startswith('facet.')): query[k] = v if text: query['SearchableText'] = quote_chars(text) + '*' # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # respect effective/expiration date query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query
def base_filter_query(self, query): # based on filter_query, but with substantial difference so not # subclassing the original method. request = self.request rawtext = text = query.get('SearchableText', None) if text is None: text = request.form.get('SearchableText', '') if not text: # Without text, the only meaningful case is Subject subjects = request.form.get('Subject') if not subjects: return else: rawtext = text = text.strip() if '*' not in text: text += '*' # Stuff text into all PMR2/CellML/Cmeta indexes. cmeta_indexes = ( 'pmr2_authors_family_name', # XXX ^ this will become # 'cmeta_authors_family_name', 'cmeta_citation_title_keyword', 'cmeta_citation_publication_year', ) if rawtext: searchkeys = rawtext.lower().split() for i in cmeta_indexes: query[i] = searchkeys # XXX this should be configurable query['pmr2_review_state'] = ['published'] catalog = getToolByName(self.context, 'portal_catalog') # AdvancedQuery does not understand these other keywords # valid_keys = self.valid_keys + tuple(catalog.indexes()) valid_keys = tuple(catalog.indexes()) for k, v in request.form.items(): # XXX not sure what facet is, aside from a deprecated # product. # if v and ((k in valid_keys) or k.startswith('facet.')): if v and (k in valid_keys): query[k] = v if text: query['SearchableText'] = quote_chars(text) # don't filter on created at all if we want all results created = query.get('created') if created: if created.get('query'): if created['query'][0] <= EVER: del query['created'] # respect `types_not_searched` setting types = query.get('portal_type', []) if 'query' in types: types = types['query'] query['portal_type'] = self.filter_types(types) # # respect effective/expiration date # query['show_inactive'] = False # respect navigation root if 'path' not in query: query['path'] = getNavigationRoot(self.context) return query