def _data(self): context = Acquisition.aq_inner(self.context) catalog = getToolByName(context, "portal_catalog") portal_languages = getToolByName(context, "portal_languages") preflang = portal_languages.getPreferredLanguage() # search in the navigation root of the currently selected # language and in the canonical path # with Language = preferredLanguage or neutral current_path = self.context.getPhysicalPath() if len(current_path) > 3 and current_path[3] in ("sub", "fop"): # in a subsite, take only the subsite or fop site path = "/".join(self.navigation_root_path.split("/")[:-1]) INFOP = True else: # in the main site, limit to the events folder #7932 path = "/osha/portal/en/events" INFOP = False oshaview = getMultiAdapter((context, self.request), name=u"oshaview") subsite = oshaview.getCurrentSubsite() # calendar = self.getCalendar(preflang) # # If we're in the root (i.e. no in a subiste), and a valid pointer to a # # calendar exists, use its path as a query parameter # if subsite is None and calendar: # paths = ['/'.join(calendar.getPhysicalPath())] subject = list(self.data.subject) limit = self.data.count # make sure to exclude the subs query = ( "portal_type:(Event) AND " "review_state:(%(review_state)s) AND path_parents:(%(path)s) " "AND end:[%(now)s TO *]" % {"review_state": " OR ".join(self.data.state), "path": path, "now": iso8601date(DateTime())} ) # If a subject is selected, use that for the query if subject: query += " AND Subject:(%s)" % " OR ".join(subject) if INFOP: results = search_solr(query, sort="start asc", rows=limit) else: lf_search_view = self.context.restrictedTraverse("@@language-fallback-search") results = lf_search_view.search_solr(query, sort="start asc", rows=limit, lang_query=False) items = list() for res in results[:limit]: try: items.append(res.getObject()) except AttributeError: pass if len(items) >= limit: break return items
def _data(self): """Search for news everywhere, then try to find translations in the current language. If no translation is found, use the 'en' version. """ current_path = self.context.getPhysicalPath() if len(current_path) > 3 and current_path[3] in ('sub', 'fop'): # in a subsite, take only the subsite or fop site path = '/'.join(self.navigation_root_path.split('/')[:-1]) INFOP = True else: # in the main site, exclude sub path = "/osha/portal AND -/osha/portal/sub AND -/osha/portal/fop" INFOP = False subject = list(self.data.subject) limit = self.data.count # make sure to exclude the subs query = '(portal_type:"News Item" OR isNews:true) AND ' \ 'review_state:(%(review_state)s) AND path_parents:(%(path)s) ' \ 'AND effective:[* TO %(effective)s]' % \ {'review_state': ' OR '.join(self.data.state), 'path': path, 'effective': iso8601date(DateTime()), } if subject: query += ' AND Subject:(%s)' % ' OR '.join(subject) if INFOP: results = search_solr(query, sort='Date desc', rows=limit) else: lf_search_view = self.context.restrictedTraverse( "@@language-fallback-search") results = lf_search_view.search_solr( query, sort='Date desc', rows=limit) # lang_query=False) items = list() for res in results[:limit]: if isExpired(res) and getattr(res, 'outdated', False): continue try: items.append(res.getObject()) except Exception: pass return items
def getResults(self): context = Acquisition.aq_inner(self.context) catalog = getToolByName(context, 'portal_catalog') if hasattr(catalog, 'getZCatalog'): catalog = catalog.getZCatalog() now = DateTime() #queryA = Eq('portal_type', 'News Item') #queryB = Eq('isNews', True) #queryBoth = In('review_state', 'published') & \ #Eq('path', '/'.join(context.getPhysicalPath())) \ # & Le('effective', now) #query = And(Or(queryA, queryB), queryBoth) #oldresults = catalog.evalAdvancedQuery(query, (('Date', 'desc'),)) query = '(portal_type:("News Item") OR isNews:true) AND ' \ 'review_state:published AND path_parents:%(path)s AND ' \ 'effective:[* TO %(effective)s]' % \ {'path': '/'.join(context.getPhysicalPath()), 'effective': iso8601date(now), } results = search_solr(query, sort='Date desc') return results
def buildQuery(self): """ Build the query based on the request """ context = Acquisition.aq_inner(self.context) queries = [self.search_portal_types()] local_keyword = context.getProperty('keyword', '') keywords = self.request.get('keywords', local_keyword) if keywords: queries.append('Subject:(%s)' % ' OR '.join(keywords)) #query.update({'Subject':keywords}) nace = list(self.request.get('nace', '')) if '' in nace: nace.remove('') if nace: queries.append('nace:(%s)' % ' OR '.join(nace)) #query.update({'nace':nace}) multilingual_thesaurus = list( self.request.get('multilingual_thesaurus', '')) if '' in multilingual_thesaurus: multilingual_thesaurus.remove('') if multilingual_thesaurus: queries.append('multilingual_thesaurus:(%s)' % ' OR '.join(multilingual_thesaurus)) #query.update({'multilingual_thesaurus':multilingual_thesaurus}) getRemoteLanguage = [ x for x in self.request.get('getRemoteLanguage', []) ] if getRemoteLanguage: if not isinstance(getRemoteLanguage, list): getRemoteLanguage = [getRemoteLanguage] if '' in getRemoteLanguage: getRemoteLanguage.remove('') getRemoteLanguage.append('any') queries.append('getRemoteLanguage:(%s)' % ' OR '.join(getRemoteLanguage)) #query.update({'getRemoteLanguage':getRemoteLanguage}) country = self.request.get('country', '') if country: queries.append('country:(%s)' % ' OR '.join(country)) #query.update({'country':country}) SearchableText = self.request.get('SearchableText', '') if SearchableText != '': queries.append('SearchableText:"%s"' % SearchableText) #query.update({'SearchableText': {'query': SearchableText, 'ranking_maxhits': 10000 }}) Creator = [x for x in self.request.get('Creator', [])] if Creator: if not isinstance(Creator, list): Creator = [Creator] if '' in Creator: Creator.remove('') queries.append('Creator:(%s)' % ' OR '.join(Creator)) #query.update(dict(Creator=Creator)) subcategory = list(self.request.get('subcategory', '')) if '' in subcategory: subcategory.remove('') if subcategory: queries.append('subcategory:(%s)' % ' OR '.join(['"%s"' % s for s in subcategory])) #query.update({'subcategory':subcategory}) getRemoteUrl = self.request.get('getRemoteUrl', '') if getRemoteUrl: queries.append('getRemoteUrl:%s' % getRemoteUrl) #query.update(dict(getRemoteUrl=getRemoteUrl)) review_state = self.request.get( 'review_state', ['private', 'published', 'to_amend', 'pending', 'checked']) if review_state: queries.append('review_state:(%s)' % ' OR '.join(review_state)) modified_year = self.request.get('modified_year', '') modified_month = self.request.get('modified_month', '') modified_day = self.request.get('modified_day', '') modified_mode = self.request.get('modified_mode', '') mdr = self.request.get('modified_days_range', 0) if modified_year and modified_month: if not modified_day: modified_day = 1 searchdate = DateTime( '%d/%d/%d' % (modified_year, modified_month, modified_day)) if modified_mode == 'before': queries.append('modified:[* TO %s]' % iso8601date(searchdate)) elif modified_mode == 'after': queries.append('modified:[%s TO *]' % iso8601date(searchdate)) elif modified_mode == 'range': queries.append('modified:[%(from)s TO %(to)s]' % \ {'from': iso8601date(searchdate - mdr), 'to': iso8601date(searchdate + mdr)}) lang = getToolByName(self.context, 'portal_languages').getPreferredLanguage() queries.append('Language:(%s OR any)' % lang) query = ' AND '.join(queries) return query
def _data(self): context = Acquisition.aq_inner(self.context) catalog = getToolByName(context, 'portal_catalog') portal_languages = getToolByName(context, 'portal_languages') preflang = portal_languages.getPreferredLanguage() # search in the navigation root of the currently selected # language and in the canonical path # with Language = preferredLanguage or neutral current_path = self.context.getPhysicalPath() if len(current_path) > 3 and current_path[3] in ('sub', 'fop'): # in a subsite, take only the subsite or fop site path = '/'.join(self.navigation_root_path.split('/')[:-1]) INFOP = True else: # in the main site, limit to the events folder #7932 path = "/osha/portal/en/events" INFOP = False oshaview = getMultiAdapter((context, self.request), name=u'oshaview') subsite = oshaview.getCurrentSubsite() # calendar = self.getCalendar(preflang) # # If we're in the root (i.e. no in a subiste), and a valid pointer to a # # calendar exists, use its path as a query parameter # if subsite is None and calendar: # paths = ['/'.join(calendar.getPhysicalPath())] subject = list(self.data.subject) limit = self.data.count # make sure to exclude the subs query = 'portal_type:(Event) AND ' \ 'review_state:(%(review_state)s) AND path_parents:(%(path)s) ' \ 'AND end:[%(now)s TO *]' % \ {'review_state': ' OR '.join(self.data.state), 'path': path, 'now': iso8601date(DateTime()), } # If a subject is selected, use that for the query if subject: query += ' AND Subject:(%s)' % ' OR '.join(subject) if INFOP: results = search_solr(query, sort='start asc', rows=limit) else: lf_search_view = self.context.restrictedTraverse( "@@language-fallback-search") results = lf_search_view.search_solr(query, sort='start asc', rows=limit, lang_query=False) items = list() for res in results[:limit]: try: items.append(res.getObject()) except AttributeError: pass if len(items) >= limit: break return items
def _data(self): portal_languages = getToolByName(self.context, 'portal_languages') preflang = portal_languages.getPreferredLanguage() # search in the navigation root of the currently selected language and in the canonical path # with Language = preferredLanguage or neutral paths = list() portal_state = getMultiAdapter((self.context, self.request), name=u'plone_portal_state') navigation_root_path = portal_state.navigation_root_path() paths.append(navigation_root_path) try: navigation_root = portal_state.portal().restrictedTraverse(navigation_root_path) canonical_path = '/'.join(navigation_root.getCanonical().getPhysicalPath()) paths.append(canonical_path) except: pass oshaview = getMultiAdapter((self.context, self.request), name=u'oshaview') mySEP = oshaview.getCurrentSingleEntryPoint() kw = '' if mySEP is not None: kw = mySEP.getProperty('keyword', '') limit = self.data.count state = self.data.state query = '(portal_type:"News Item" OR isNews:true) AND review_state:(%(review_state)s) AND path_parents:(%(path)s) AND Language:(%(Language)s) AND effective:[* TO %(effective)s]' % {'review_state': ' OR '.join(state), 'path': ' OR '.join(paths), 'Language': ' OR '.join([preflang, 'any']), 'effective': iso8601date(DateTime()), } if kw !='': query += ' AND Subject:(%s)' % ' OR '.join(kw) try: return search_solr(query, sort='Date desc', rows=limit)[:limit] except KeyError, e: log.error('KeyError: %s' % e.__str__()) return []
def mangleQuery(keywords, config, schema): """ translate / mangle query parameters to replace zope specifics with equivalent constructs for solr """ extras = {} for key, value in keywords.items(): if key.endswith('_usage'): # convert old-style parameters category, spec = value.split(':', 1) extras[key[:-6]] = {category: spec} del keywords[key] elif isinstance(value, dict): # unify dict parameters keywords[key] = value['query'] del value['query'] extras[key] = value elif hasattr(value, 'query'): # unify object parameters keywords[key] = value.query extra = dict() for arg in query_args: arg_val = getattr(value, arg, None) if arg_val is not None: extra[arg] = arg_val extras[key] = extra elif key in ignored: del keywords[key] # find EPI indexes if schema: epi_indexes = {} for name in schema.keys(): parts = name.split('_') if parts[-1] in ['string', 'depth', 'parents']: count = epi_indexes.get(parts[0], 0) epi_indexes[parts[0]] = count + 1 epi_indexes = [k for k, v in epi_indexes.items() if v == 3] else: epi_indexes = ['path'] for key, value in keywords.items(): args = extras.get(key, {}) if key == 'SearchableText': pattern = getattr(config, 'search_pattern', '') if pattern and isSimpleSearch(value): value = mangle_searchable_text_query(value, pattern) keywords[key] = set([value]) # add literal query parameter continue elif isSimpleTerm(value): # use prefix/wildcard search keywords[key] = '(%s* OR %s)' % ( prepare_wildcard(value), value) continue if key in epi_indexes: path = keywords['%s_parents' % key] = value del keywords[key] if 'depth' in args: depth = int(args['depth']) if depth >= 0: if not isinstance(value, (list, tuple)): path = [path] tmpl = '(+%s_depth:[%d TO %d] AND +%s_parents:%s)' params = keywords['%s_parents' % key] = set() for p in path: base = len(p.split('/')) params.add(tmpl % (key, base, base + depth, key, p)) del args['depth'] elif key == 'effectiveRange': if isinstance(value, DateTime): steps = getattr(config, 'effective_steps', 1) if steps > 1: value = DateTime(value.timeTime() // steps * steps) value = iso8601date(value) del keywords[key] keywords['effective'] = '[* TO %s]' % value keywords['expires'] = '[%s TO *]' % value elif key == 'show_inactive': del keywords[key] # marker for `effectiveRange` elif 'range' in args: if not isinstance(value, (list, tuple)): value = [value] payload = map(iso8601date, value) keywords[key] = ranges[args['range']] % tuple(payload) del args['range'] elif 'operator' in args: if isinstance(value, (list, tuple)) and len(value) > 1: sep = ' %s ' % args['operator'].upper() value = sep.join(map(str, map(iso8601date, value))) keywords[key] = '(%s)' % value del args['operator'] elif key == 'allowedRolesAndUsers': if getattr(config, 'exclude_user', False): token = 'user$' + getSecurityManager().getUser().getId() if token in value: value.remove(token) elif isinstance(value, DateTime): keywords[key] = iso8601date(value) elif not isinstance(value, basestring): assert not args, 'unsupported usage: %r' % args
def buildQuery(self): """ Build the query based on the request """ context = Acquisition.aq_inner(self.context) queries = [self.search_portal_types()] local_keyword = context.getProperty('keyword', '') keywords = self.request.get('keywords', local_keyword) if keywords: queries.append('Subject:(%s)' % ' OR '.join(keywords)) #query.update({'Subject':keywords}) nace = list(self.request.get('nace', '')) if '' in nace: nace.remove('') if nace: queries.append('nace:(%s)' % ' OR '.join(nace)) #query.update({'nace':nace}) multilingual_thesaurus = list(self.request.get('multilingual_thesaurus', '')) if '' in multilingual_thesaurus: multilingual_thesaurus.remove('') if multilingual_thesaurus: queries.append('multilingual_thesaurus:(%s)' % ' OR '.join(multilingual_thesaurus)) #query.update({'multilingual_thesaurus':multilingual_thesaurus}) getRemoteLanguage = [x for x in self.request.get('getRemoteLanguage', [])] if getRemoteLanguage: if not isinstance(getRemoteLanguage, list): getRemoteLanguage = [getRemoteLanguage] if '' in getRemoteLanguage: getRemoteLanguage.remove('') getRemoteLanguage.append('any') queries.append('getRemoteLanguage:(%s)' % ' OR '.join(getRemoteLanguage)) #query.update({'getRemoteLanguage':getRemoteLanguage}) country = self.request.get('country', '') if country: queries.append('country:(%s)' % ' OR '.join(country)) #query.update({'country':country}) SearchableText = self.request.get('SearchableText', '') if SearchableText != '': queries.append('SearchableText:"%s"' % SearchableText) #query.update({'SearchableText': {'query': SearchableText, 'ranking_maxhits': 10000 }}) Creator = [x for x in self.request.get('Creator', [])] if Creator: if not isinstance(Creator, list): Creator = [Creator] if '' in Creator: Creator.remove('') queries.append('Creator:(%s)' % ' OR '.join(Creator)) #query.update(dict(Creator=Creator)) subcategory = list(self.request.get('subcategory', '')) if '' in subcategory: subcategory.remove('') if subcategory: queries.append('subcategory:(%s)' % ' OR '.join(['"%s"' % s for s in subcategory])) #query.update({'subcategory':subcategory}) getRemoteUrl = self.request.get('getRemoteUrl', '') if getRemoteUrl: queries.append('getRemoteUrl:%s' % getRemoteUrl) #query.update(dict(getRemoteUrl=getRemoteUrl)) review_state = self.request.get('review_state', ['private', 'published', 'to_amend', 'pending', 'checked']) if review_state: queries.append('review_state:(%s)' % ' OR '.join(review_state)) modified_year = self.request.get('modified_year', '') modified_month = self.request.get('modified_month', '') modified_day = self.request.get('modified_day', '') modified_mode = self.request.get('modified_mode', '') mdr = self.request.get('modified_days_range', 0) if modified_year and modified_month: if not modified_day: modified_day = 1 searchdate = DateTime('%d/%d/%d' % (modified_year, modified_month, modified_day)) if modified_mode=='before': queries.append('modified:[* TO %s]' % iso8601date(searchdate)) elif modified_mode=='after': queries.append('modified:[%s TO *]' % iso8601date(searchdate)) elif modified_mode=='range': queries.append('modified:[%(from)s TO %(to)s]' % \ {'from': iso8601date(searchdate - mdr), 'to': iso8601date(searchdate + mdr)}) lang = getToolByName(self.context, 'portal_languages').getPreferredLanguage() queries.append('Language:(%s OR any)' % lang) query = ' AND '.join(queries) return query
def mangleQuery(keywords, config, schema): """ translate / mangle query parameters to replace zope specifics with equivalent constructs for solr """ extras = {} for key, value in keywords.items(): if key.endswith('_usage'): # convert old-style parameters category, spec = value.split(':', 1) extras[key[:-6]] = {category: spec} del keywords[key] elif isinstance(value, dict): # unify dict parameters keywords[key] = value['query'] del value['query'] extras[key] = value elif hasattr(value, 'query'): # unify object parameters keywords[key] = value.query extra = dict() for arg in query_args: arg_val = getattr(value, arg, None) if arg_val is not None: extra[arg] = arg_val extras[key] = extra elif key in ignored: del keywords[key] # find EPI indexes if schema: epi_indexes = {} for name in schema.keys(): parts = name.split('_') if parts[-1] in ['string', 'depth', 'parents']: count = epi_indexes.get(parts[0], 0) epi_indexes[parts[0]] = count + 1 epi_indexes = [k for k, v in epi_indexes.items() if v == 3] else: epi_indexes = ['path'] for key, value in keywords.items(): args = extras.get(key, {}) if key == 'SearchableText': pattern = getattr(config, 'search_pattern', '') if pattern and isSimpleSearch(value): value = mangle_searchable_text_query(value, pattern) keywords[key] = set([value]) # add literal query parameter continue elif isSimpleTerm(value): # use prefix/wildcard search keywords[key] = '(%s* OR %s)' % (prepare_wildcard(value), value) continue if key in epi_indexes: path = keywords['%s_parents' % key] = value del keywords[key] if 'depth' in args: depth = int(args['depth']) if depth >= 0: if not isinstance(value, (list, tuple)): path = [path] tmpl = '(+%s_depth:[%d TO %d] AND +%s_parents:%s)' params = keywords['%s_parents' % key] = set() for p in path: base = len(p.split('/')) params.add(tmpl % (key, base, base + depth, key, p)) del args['depth'] elif key == 'effectiveRange': if isinstance(value, DateTime): steps = getattr(config, 'effective_steps', 1) if steps > 1: value = DateTime(value.timeTime() // steps * steps) value = iso8601date(value) del keywords[key] keywords['effective'] = '[* TO %s]' % value keywords['expires'] = '[%s TO *]' % value elif key == 'show_inactive': del keywords[key] # marker for `effectiveRange` elif 'range' in args: if not isinstance(value, (list, tuple)): value = [value] payload = map(iso8601date, value) keywords[key] = ranges[args['range']] % tuple(payload) del args['range'] elif 'operator' in args: if isinstance(value, (list, tuple)) and len(value) > 1: sep = ' %s ' % args['operator'].upper() value = sep.join(map(str, map(iso8601date, value))) keywords[key] = '(%s)' % value del args['operator'] elif key == 'allowedRolesAndUsers': if getattr(config, 'exclude_user', False): token = 'user$' + getSecurityManager().getUser().getId() if token in value: value.remove(token) elif isinstance(value, DateTime): keywords[key] = iso8601date(value) elif not isinstance(value, basestring): assert not args, 'unsupported usage: %r' % args