def testNoI18NAwareCatalog(self): original = bool(I18NAWARE_CATALOG) try: languageFilter.func_globals['I18NAWARE_CATALOG'] = False query = {'Language': 'all'} languageFilter(query) self.failUnless('Language' in query) finally: languageFilter.func_globals['I18NAWARE_CATALOG'] = original
def searchResults(self, REQUEST=None, **kw): """ Calls ZCatalog.searchResults with extra arguments that limit the results to what the user is allowed to see. This version only returns the results for the current language, unless you explicitly ask for all results by providing the Language="all" keyword. """ if REQUEST is not None and kw.get('Language', '') != 'all': languageFilter(REQUEST) else: languageFilter(kw) return self.__lp_old_searchResults(REQUEST, **kw)
def search_solr(query, request=None, lang_query=True, **params): search = queryUtility(ISearch) if lang_query: dummy = {} languageFilter(dummy) prepareData(dummy) # this replaces '' with 'any' langquery = 'Language:(%s)' % ' OR '.join(dummy['Language']) query = '(%s) AND %s' % (query, langquery) response = search(query, **params) if request is None: request = getSite().REQUEST response.request = request results = response.results() for idx, flare in enumerate(results): results[idx] = PloneFlare(flare, request=request) padResults(results, **params) # pad the batch return response
def testNoFilter(self): self.failUnless('UID' in NOFILTERKEYS) query = {'UID': '123'} languageFilter(query) self.failIf('Language' in query)
def testAll(self): query = {'review_state': 'published', 'Language': 'all'} languageFilter(query) self.failIf('Language' in query)
def testNeutral(self): query = {'review_state': 'published', 'Language': ''} languageFilter(query) self.failUnless('Language' in query) self.assertEquals(query['Language'], '')
def testMultiple(self): query = {'review_state': 'published', 'Language': ['en', 'de']} languageFilter(query) self.failUnless('Language' in query) self.assertEquals(query['Language'], ['en', 'de'])
def testGerman(self): query = {'review_state': 'published', 'Language': 'de'} languageFilter(query) self.failUnless('Language' in query) self.assertEquals(query['Language'], 'de')
def testNoTool(self): self.loginAsPortalOwner() del self.portal['portal_languages'] query = {'Language': 'all'} languageFilter(query) self.failUnless('Language' in query)
def testEnglish(self): query = {'review_state': 'published'} languageFilter(query) self.failUnless('Language' in query) self.assertEquals(query['Language'], ['en', ''])
def buildQueryAndParameters(self, default=None, **args): """ helper to build a querystring for simple use-cases """ schema = self.getManager().getSchema() or {} params = subtractQueryParameters(args) params = cleanupQueryParameters(params, schema) config = self.getConfig() languageFilter(args) prepareData(args) mangleQuery(args, config, schema) logger.debug('building query for "%r", %r', default, args) schema = self.getManager().getSchema() or {} # no default search field in Solr 7 defaultSearchField = getattr( schema, 'defaultSearchField', 'SearchableText' ) args[None] = default query = {} for name, value in sorted(args.items()): field = schema.get(name or defaultSearchField, None) if field is None or not field.indexed: logger.info( 'dropping unknown search attribute "%s" ' ' (%r) for query: %r', name, value, args ) continue if isinstance(value, bool): value = str(value).lower() elif not value: # solr doesn't like empty fields (+foo:"") if not name: continue logger.info( 'empty search term form "%s:%s", aborting buildQuery' % ( name, value ) ) return {}, params elif field.class_ == 'solr.BoolField': if not isinstance(value, (tuple, list)): value = [value] falses = '0', 'False', MV true = lambda v: bool(v) and v not in falses value = set(map(true, value)) if not len(value) == 1: assert len(value) == 2 # just to make sure continue # skip when "true or false" value = str(value.pop()).lower() elif isinstance(value, (tuple, list)): # list items should be treated as literals, but # nevertheless only get quoted when necessary value = '(%s)' % ' OR '.join(map(quote_iterable_item, value)) elif isinstance(value, set): # sets are taken literally if len(value) == 1: query[name] = ''.join(value) else: query[name] = '(%s)' % ' OR '.join(value) continue elif isinstance(value, basestring): if field.class_ == 'solr.TextField': if isWildCard(value): value = prepare_wildcard(value) value = quote(value, textfield=True) # if we have an intra-word hyphen, we need quotes if '\\-' in value or '\\+' in value: if value[0] != '"': value = '"%s"' % value else: value = quote(value) if not value: # don't search for empty strings, even quoted continue else: logger.info( 'skipping unsupported value "%r" (%s)', value, name ) continue if name is None: if value and value[0] not in '+-': value = '+%s' % value else: value = '+%s:%s' % (name, value) query[name] = value logger.debug('built query "%s"', query) if query: optimizeQueryParameters(query, params) return query, params
def testNoFilterExplicitLanguage(self): self.failUnless('UID' in NOFILTERKEYS) query = {'UID': '123', 'Language': 'de'} languageFilter(query) self.failUnless('Language' in query) self.assertEquals(query['Language'], 'de')
def buildQueryAndParameters(self, default=None, **args): """ helper to build a querystring for simple use-cases """ schema = self.getManager().getSchema() or {} params = subtractQueryParameters(args) params = cleanupQueryParameters(params, schema) config = self.getConfig() languageFilter(args) prepareData(args) mangleQuery(args, config, schema) logger.debug('building query for "%r", %r', default, args) schema = self.getManager().getSchema() or {} defaultSearchField = getattr(schema, 'defaultSearchField', None) args[None] = default query = {} for name, value in sorted(args.items()): field = schema.get(name or defaultSearchField, None) if field is None or not field.indexed: logger.info( 'dropping unknown search attribute "%s" ' ' (%r) for query: %r', name, value, args) continue if isinstance(value, bool): value = str(value).lower() elif not value: # solr doesn't like empty fields (+foo:"") if not name: continue logger.info( 'empty search term form "%s:%s", aborting buildQuery' % (name, value)) return {}, params elif field.class_ == 'solr.BoolField': if not isinstance(value, (tuple, list)): value = [value] falses = '0', 'False', MV true = lambda v: bool(v) and v not in falses value = set(map(true, value)) if not len(value) == 1: assert len(value) == 2 # just to make sure continue # skip when "true or false" value = str(value.pop()).lower() elif isinstance(value, (tuple, list)): # list items should be treated as literals, but # nevertheless only get quoted when necessary value = '(%s)' % ' OR '.join(map(quote_iterable_item, value)) elif isinstance(value, set): # sets are taken literally if len(value) == 1: query[name] = ''.join(value) else: query[name] = '(%s)' % ' OR '.join(value) continue elif isinstance(value, basestring): if field.class_ == 'solr.TextField': if isWildCard(value): value = prepare_wildcard(value) value = quote(value, textfield=True) # if we have an intra-word hyphen, we need quotes if '\\-' in value or '\\+' in value: if value[0] != '"': value = '"%s"' % value else: value = quote(value) if not value: # don't search for empty strings, even quoted continue else: logger.info('skipping unsupported value "%r" (%s)', value, name) continue if name is None: if value and value[0] not in '+-': value = '+%s' % value else: value = '+%s:%s' % (name, value) query[name] = value logger.debug('built query "%s"', query) if query: optimizeQueryParameters(query, params) return query, params