Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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
Esempio n. 7
0
    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
Esempio n. 8
0
    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 []
Esempio n. 9
0
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
Esempio n. 10
0
    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
Esempio n. 11
0
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