Beispiel #1
0
    def search(self, *args, **kwargs):
        if self.objectImplements:
            dict_query =  { "objectImplements" : self.objectImplements }
            current_query = kwargs.get("query")
            if not current_query:
                kwargs["query"] = dict_query
            else:
                if isinstance(current_query, dict):
                    values = current_query.get("objectImplements", [])
                    if isinstance(values, basestring):
                        values = [ values ]
                    for value in self.objectImplements:
                        if value not in values:
                            values.append(value)
                    kwargs["query"]["objectImplements"] = values
                else:
                    # it is advanced query
                    advanced_query = [ Eq("objectImplements", value) for value in self.objectImplements ]
                    if len(advanced_query) > 1:
                        advanced_query = And(*advanced_query)
                    else:
                        advanced_query = advanced_query[0]
                    kwargs["query"] = And(current_query, advanced_query)

        if self.fields:
            current_fields = kwargs.get("fields")
            if not current_fields:
                kwargs["fields"] = self.fields
            else:
                if isinstance(current_fields, basestring):
                    current_fields = [ current_fields ]
                current_fields.extend(self.fields)
                kwargs["fields"] = current_fields

        return self.model_catalog(*args, **kwargs)
def get_uids(index_client, root="", types=()):
    start = 0
    need_results = True
    query = [Eq("tx_state", 0)]
    if root:
        root = root.rstrip('/')
        query.append(
            Or(Eq("uid", "{}".format(root)),
               MatchGlob("uid", "{}/*".format(root))))

    if not isinstance(types, (tuple, list)):
        types = (types, )

    if types:
        query.append(In("objectImplements", [dottedname(t) for t in types]))

    while need_results:
        search_results = index_client.search(
            SearchParams(query=And(*query),
                         start=start,
                         limit=MODEL_INDEX_BATCH_SIZE,
                         order_by="uid",
                         fields=["uid"]))
        start += MODEL_INDEX_BATCH_SIZE
        for result in search_results.results:
            yield result.uid
        need_results = start < search_results.total_count
 def _typecatComponentBrains(self,
                             uid=None,
                             types=(),
                             meta_type=(),
                             start=0,
                             limit=None,
                             sort='name',
                             dir='ASC',
                             name=None,
                             keys=()):
     obj = self._getObject(uid)
     spec = get_component_field_spec(meta_type)
     if spec is None:
         return None, 0
     typecat = spec.get_catalog(obj, meta_type)
     sortspec = ()
     if sort:
         if sort not in typecat._catalog.indexes:
             # Fall back to slow queries and sorting
             return None, 0
         sortspec = ((sort, dir), )
     querySet = [Generic('path', uid)]
     if name:
         querySet.append(
             Or(*(MatchGlob(field, '*%s*' % name)
                  for field in spec.fields)))
     brains = typecat.evalAdvancedQuery(And(*querySet), sortspec)
     total = len(brains)
     if limit is None:
         brains = brains[start:]
     else:
         brains = brains[start:start + limit]
     return brains, total
Beispiel #4
0
def filteredDevices(context, args, *types):
    path = '/zport/dmd'

    deviceFilter = args.get('deviceFilter', '') or ''
    deviceClass = args.get('deviceClass', '') or ''
    extraquery = args.get('extraquery', '')
    filter = []
    if deviceFilter:
        filter.append(
            MatchGlob('name', '*%s*' % deviceFilter)
            | MatchGlob('id', '*%s*' % deviceFilter))
    if deviceClass:
        organizer = (''.join([path, deviceClass]), )
    else:
        organizer = (''.join(
            [path, args.get('organizer', '/Devices') or '/Devices']), )

    if not types:
        types = 'Products.ZenModel.Device.Device'

    if extraquery:
        filter.extend(extraquery)

    query = And(*filter) if filter else None

    results = IModelCatalogTool(context).search(types,
                                                paths=organizer,
                                                query=query)

    for brain in results:
        try:
            yield brain.getObject()
        except Exception:
            log.warn("Unable to unbrain at path %s", brain.getPath())
Beispiel #5
0
    def searchForMembers(self, REQUEST=None, **kw):
        """Search for users (not groups, not groups-as-users) of a site """
        if REQUEST:
            dict = REQUEST
        else:
            dict = kw

        name = dict.get('name', '')
        # Split up search terms but leave quoted ones together
        try:
            names = shlex.split(name)
        except ValueError:
            try:
                names = shlex.split(name.replace("'", "\\'"))
            except ValueError:
                names = shlex.split(name.replace("'", "\\'") + '"')

        # Short circuit: if all that was asked for was '*', just return everyone
        if names == ['*']:
            query = And()
        else:
            queries = []
            for name in names:
                queries.extend([
                    MatchGlob('fullname', name),
                    MatchGlob('email', name),
                    Eq('getUserName', name)
                ])
            query = Or(*queries)
        zLOG.LOG('MembershipTool', zLOG.BLATHER, 'Querying: %s' % query)

        catalog = getToolByName(self, 'member_catalog')
        return catalog.evalAdvancedQuery(query, ('surname', 'firstname'))
Beispiel #6
0
    def _buildQuery(self, types, paths, depth, query, filterPermissions):
        qs = []
        if query is not None:
            qs.append(query)

        # Build the path query
        if not paths:
            paths = ('/'.join(self.context.getPhysicalPath()), )

        q = {'query': paths}
        if depth is not None:
            q['depth'] = depth
        pathq = Generic('path', q)
        qs.append(pathq)

        # Build the type query
        if not isinstance(types, (tuple, list)):
            types = (types, )
        subqs = [Eq('objectImplements', dottedname(t)) for t in types]
        if subqs:
            # Don't unnecessarily nest in an Or if there is only one type query
            typeq = subqs[0] if len(subqs) == 1 else Or(*subqs)
            qs.append(typeq)

        # filter based on permissions
        if filterPermissions:
            qs.append(
                In('allowedRolesAndUsers',
                   allowedRolesAndGroups(self.context)))

        # Consolidate into one query
        return And(*qs)
Beispiel #7
0
    def _serviceSearch(self,
                       limit=None,
                       start=None,
                       sort='name',
                       dir='ASC',
                       params=None,
                       uid=None,
                       criteria=()):
        cat = ICatalogTool(self._getObject(uid))
        reverse = dir == 'DESC'

        qs = []
        query = None
        if params:
            if 'name' in params:
                qs.append(MatchRegexp('name', '(?i).*%s.*' % params['name']))
            if 'port' in params:
                qs.append(MatchRegexp('port', '(?i).*%s.*' % params['port']))
        if qs:
            query = And(*qs)

        return cat.search("Products.ZenModel.ServiceClass.ServiceClass",
                          start=start,
                          limit=limit,
                          orderby=sort,
                          reverse=reverse,
                          query=query)
Beispiel #8
0
    def _processSearch(self,
                       limit=None,
                       start=None,
                       sort='name',
                       dir='ASC',
                       params=None,
                       uid=None,
                       criteria=()):
        ob = self._getObject(uid) if isinstance(uid, basestring) else uid
        cat = ICatalogTool(ob)

        reverse = dir == 'DESC'
        qs = []
        query = None
        if params:
            if 'name' in params:
                qs.append(MatchRegexp('name', '(?i).*%s.*' % params['name']))
        if qs:
            query = And(*qs)

        return cat.search("Products.ZenModel.OSProcessClass.OSProcessClass",
                          start=start,
                          limit=limit,
                          orderby=sort,
                          reverse=reverse,
                          query=query)
 def getDeviceBrains(self, uid=None, start=0, limit=50, sort='name',
                     dir='ASC', params=None, hashcheck=None):
     cat = ICatalogTool(self._getObject(uid))
     reverse = dir=='DESC'
     qs = []
     query = None
     globFilters = {}
     if params is None:
         params = {}
     for key, value in params.iteritems():
         if key == 'ipAddress':
             ip = ensureIp(value)
             try:
                 checkip(ip)
             except IpAddressError:
                 pass
             else:
                 if numbip(ip):
                     minip, maxip = getSubnetBounds(ip)
                     qs.append(Between('ipAddress', str(minip), str(maxip)))
         elif key == 'deviceClass':
             qs.append(MatchRegexp('uid', '(?i).*%s.*' %
                                   value))
         elif key == 'productionState':
             qs.append(Or(*[Eq('productionState', str(state))
                          for state in value]))
         else:
             globFilters[key] = value
     if qs:
         query = And(*qs)
     brains = cat.search('Products.ZenModel.Device.Device', start=start,
                        limit=limit, orderby=sort, reverse=reverse,
                         query=query, globFilters=globFilters, hashcheck=hashcheck)
     return brains
Beispiel #10
0
 def _get_device_components(self, device, str_types, *args, **kwargs):
     types = set(["Products.ZenModel.DeviceComponent.DeviceComponent"])
     if str_types:
         types = types | set(str_types)
     query = [ Eq("objectImplements", str_type) for str_type in types ]
     query.append(Eq("deviceId", "/".join(device.getPrimaryPath())))
     kwargs["query"] = And(*query)
     return self.model_catalog.search(*args, **kwargs)
Beispiel #11
0
    def _componentSearch(self, uid=None, types=(), meta_type=(), start=0,
                         limit=None, sort='name', dir='ASC', name=None, keys=()):
        reverse = dir=='DESC'
        if isinstance(types, basestring):
            types = (types,)
        if isinstance(meta_type, basestring):
            meta_type = (meta_type,)
        querySet = []
        if meta_type:
            querySet.append(Or(*(Eq('meta_type', t) for t in meta_type)))
        querySet.append(Generic('getAllPaths', uid))
        query = And(*querySet)
        obj = self._getObject(uid)

        cat = obj.device().componentSearch
        if 'getAllPaths' not in cat.indexes():
            obj.device()._createComponentSearchPathIndex()
        brains = cat.evalAdvancedQuery(query)

        # unbrain the results
        comps=map(IInfo, map(unbrain, brains))


        # filter the components
        if name is not None:
            comps = self._filterComponents(comps, keys, name)

        total = len(comps)
        hash_ = str(total)

        def componentSortKey(parent):
            val = getattr(parent, sort)
            if val:
                if isinstance(val, list):
                    val = val[0]
                if callable(val):
                    val = val()
                if IInfo.providedBy(val):
                    val = val.name
            return val

        # sort the components
        sortedResults = list(sorted(comps, key=componentSortKey, reverse=reverse))

        # limit the search results to the specified range
        if limit is None:
            pagedResult = sortedResults[start:]
        else:
            pagedResult = sortedResults[start:start + limit]

        # fetch any rrd data necessary
        self.bulkLoadMetricData(pagedResult)

        return SearchResults(iter(pagedResult), total, hash_, False)
Beispiel #12
0
 def findDeviceByIdExact(self, devicename):
     """
     Look up device in catalog and return it.  devicename
     must match device id exactly
     """
     if devicename:
         query = And( Eq("objectImplements", "Products.ZenModel.Device.Device"), Eq('id', devicename) )
         search_results = IModelCatalogTool(self.dmd.Devices).search(query=query)
         for brain in search_results.results:
             dev = brain.getObject()
             if dev.id == devicename:
                 return dev
Beispiel #13
0
    def _componentSearch(self,
                         uid=None,
                         types=(),
                         meta_type=(),
                         start=0,
                         limit=None,
                         sort='name',
                         dir='ASC',
                         name=None,
                         keys=()):
        reverse = dir == 'DESC'
        if isinstance(types, basestring):
            types = (types, )
        if isinstance(meta_type, basestring):
            meta_type = (meta_type, )
        querySet = []
        if meta_type:
            querySet.append(Or(*(Eq('meta_type', t) for t in meta_type)))
        querySet.append(Generic('getAllPaths', uid))
        query = And(*querySet)
        obj = self._getObject(uid)
        if getattr(aq_base(obj.device()), 'componentSearch', None) is None:
            obj.device()._create_componentSearch()

        cat = obj.device().componentSearch
        if 'getAllPaths' not in cat.indexes():
            obj.device()._createComponentSearchPathIndex()
        brains = cat.evalAdvancedQuery(query)

        # unbrain the results
        comps = map(IInfo, map(unbrain, brains))
        total = len(comps)
        hash_ = str(total)

        # filter the components
        if name is not None:
            wrapped = map(IInfo, map(unbrain, brains))
            comps = self._filterComponents(wrapped, keys, name)
            total = len(comps)
            hash_ = str(total)

        # sort the components
        sortedResults = list(
            sorted(comps, key=lambda x: getattr(x, sort), reverse=reverse))

        # limit the search results to the specified range
        if limit is None:
            pagedResult = sortedResults[start:]
        else:
            pagedResult = sortedResults[start:start + limit]

        return SearchResults(iter(pagedResult), total, hash_, False)
Beispiel #14
0
    def getObjectBrains(self,
                        uid=None,
                        start=0,
                        limit=50,
                        sort='name',
                        dir='ASC',
                        params=None,
                        hashcheck=None,
                        types=(),
                        fields=[]):

        cat = IModelCatalogTool(self._getObject(uid))

        reverse = bool(dir == 'DESC')
        qs = []
        query = None
        globFilters = {}
        prodStates = None
        params = params if params else {}
        for key, value in params.iteritems():
            if key == 'ipAddress':
                qs.append(MatchGlob('text_ipAddress', '{}*'.format(value)))
            elif key == 'productionState':
                qs.append(
                    Or(*[Eq('productionState', str(state))
                         for state in value]))
            # ZEN-30949 - stringify values from the 'priority' list if it's passed in for query criteria
            elif key == 'priority':
                qs.append(
                    Or(*[Eq('priority', str(priority)) for priority in value]))
            # ZEN-10057 - move filtering on indexed groups/systems/location from post-filter to query
            elif key in organizersToClass:
                organizerQuery = self.findMatchingOrganizers(
                    organizersToClass[key], organizersToPath[key], value)
                if not organizerQuery:
                    return []
                qs.append(organizerQuery)
            else:
                globFilters[key] = value
        if qs:
            query = And(*qs)

        return cat.search(types,
                          start=start,
                          limit=limit,
                          orderby=sort,
                          reverse=reverse,
                          query=query,
                          globFilters=globFilters,
                          hashcheck=hashcheck,
                          fields=fields)
Beispiel #15
0
    def _get_component_types_from_model_catalog(self, uid):
        """ """
        componentTypes = {}
        uuidMap = {}
        model_catalog = IModelCatalogTool(self.context.dmd)
        model_query = Eq('objectImplements', "Products.ZenModel.DeviceComponent.DeviceComponent")
        model_query = And(model_query, Eq("deviceId", uid))
        model_query_results = model_catalog.search(query=model_query, fields=["uuid", "meta_type"])

        for brain in model_query_results.results:
            uuidMap[brain.uuid] = brain.meta_type
            compType = componentTypes.setdefault(brain.meta_type, { 'count' : 0, 'severity' : 0 })
            compType['count'] += 1
        return (componentTypes, uuidMap)
Beispiel #16
0
 def transform_query(self, query):
     search_indexes = []
     other_indexes = []
     search_keys = ('customer', 'Subject', 'No matches by customer')
     for key in query.keys():
         if key in ('b_start', 'b_size', 'batch', 'show_inactive'):
             continue
         if key in search_keys:
             if key == 'customer' and query['customer'] == 'All':
                 for customer in self.customers_list():
                     if customer in ('All', 'No matches by customer'):
                         continue
                     search_indexes.append(Eq('customer', customer))
             elif (key == 'customer' and
                   query['customer'] == 'No matches by customer'):
                 pass
             else:
                 self.add_to_index_list(search_indexes, query, key)
         else:
             self.add_to_index_list(other_indexes, query, key)
     other_indexes = And(*other_indexes)
     search_indexes = Or(*search_indexes)
     return And(other_indexes, search_indexes)
 def _add_tx_state_query(self, search_params, tx_state):
     """
     only interested in docs indexed by committed transactions or
     in docs temporary committed by the current transaction
     """
     values = [0]  # default tx_state for committed transactions
     if tx_state:
         values.append(tx_state.tid)
     if isinstance(search_params.query, dict):
         search_params.query[TX_STATE_FIELD] = values
     else:  # We assume it is an AdvancedQuery
         or_query = [Eq(TX_STATE_FIELD, value) for value in values]
         search_params.query = And(search_params.query, Or(*or_query))
     return search_params
 def getSubComponents(self):
     cat = ICatalogTool(self)
     query = And(
         Not(
             Eq('objectImplements',
                'Products.ZenModel.ComponentGroup.ComponentGroup')),
         Not(Eq('objectImplements', 'Products.ZenModel.Device.Device')))
     brains = cat.search(query=query)
     children = []
     for brain in brains:
         try:
             children.append(brain.getObject())
         except:
             pass
     return children
Beispiel #19
0
    def _findDevice(self, devicename, useTitle=True, commit_dirty=False):
        """
        Returns all devices whose ip/id/title match devicename.
        ip/id matches are at the front of the list.

        @rtype: list of brains
        """
        ors = [ MatchGlob('id', devicename), MatchGlob('text_ipAddress', devicename) ]

        if useTitle:
            ors.append(MatchGlob('name', devicename))

        query = And( Eq("objectImplements", "Products.ZenModel.Device.Device"), Or(*ors) )
        fields = [ "name", "id", "text_ipAddress" ]
        search_results = IModelCatalogTool(self.dmd.Devices).search(query=query, fields=fields, commit_dirty=commit_dirty)
        return list(search_results.results)
def keyword_search(obj, keyword, types=(), meta_type=None):
    """Generate objects with a matching serial number."""
    keyword_query = Eq('searchKeywords', keyword)

    query = None
    if meta_type:
        query = And(Eq('meta_type', meta_type), keyword_query)
    else:
        query = keyword_query

    for brain in ICatalogTool(obj.dmd).search(types, query=query):
        try:
            yield brain.getObject()
        except Exception:
            # ignore a stale entry
            pass
Beispiel #21
0
def get_possible_faqs(self):
    log.info('get_possible_faqs')
    queries = []
    title = In('Title', ["*frequently*", "*faq*", "FAQ*", "Frequently*"])
    portal_type = In("portal_type", ["Document", "RichDocument", "Folder"])
    ids = ["faq", "faq.php", "faq.stm", "faqs"]
    for i in range(0, 10):
        ids.append('faq%d.stm' % i)
        ids.append('faq0%d.php' % i)

    id = In('getId', ids)
    body = Eq('SearchableText', "FAQ")
    fop = Eq('path', '/osha/portal/fop')
    advanced_query = And(Or(id, title, body), portal_type, Not(fop))
    ls = self.portal_catalog.evalAdvancedQuery(advanced_query,
                                               (('Date', 'desc'), ))

    # XXX: Didn't work :(
    # ls = self.portal_catalog(
    #             getId='faq.php',
    #             path='/osha/portal/en/good_practice/priority_groups/disability/')

    ls = self.portal_catalog(
        getId='faq2.stm',
        path='osha/en/good_practice/topics/dangerous_substances/faq2.stm')

    # ls = self.portal_catalog(
    #             getId='faq.php',
    #             path='osha/en/good_practice/topics/accident_prevention/')

    log.info("Processing FAQs: %s" % "\n".join([i.getURL() for i in ls]))

    odict = {}
    for l in ls:
        o = l.getObject()
        odict[o.absolute_url()] = o
        ts = o.getTranslations().values()
        for t in ts:
            odict[t[0].absolute_url()] = t[0]

    objects = odict.values()
    return objects

    k = ['/'.join(o.getPhysicalPath()) for o in objects]
    k.sort()
    display_str = '\n'.join(k) or 'none'
    return display_str
Beispiel #22
0
    def getDevProdStateJSON(self, prodStates=['Maintenance']):
        """
        Return a map of device to production state in a format suitable for a
        YUI data table.

        @return: A JSON representation of a dictionary describing devices
        @rtype: "{
            'columns':['Device', 'Prod State'],
            'data':[
                {'Device':'<a href=/>', 'Prod State':'Production'},
                {'Device':'<a href=/>', 'Prod State':'Maintenance'},
            ]}"
        """

        if isinstance(prodStates, basestring):
            prodStates = [prodStates]

        def getProdStateInt(prodStateString):
            for t in self.context.getProdStateConversions():
                if t[0] == prodStateString:
                    return t[1]

        numericProdStates = [getProdStateInt(p) for p in prodStates]

        catalog = IModelCatalogTool(self.context.getPhysicalRoot().zport.dmd)
        query = In('productionState', numericProdStates)

        query = And(query,
                    Eq('objectImplements', 'Products.ZenModel.Device.Device'))
        objects = list(catalog.search(query=query, orderby='id',
                                      fields="uuid"))
        devs = (x.getObject() for x in objects)

        mydict = {'columns': ['Device', 'Prod State'], 'data': []}
        for dev in devs:
            if not self.context.checkRemotePerm(ZEN_VIEW, dev): continue
            mydict['data'].append({
                'Device': dev.getPrettyLink(),
                'Prod State': dev.getProdState()
            })
            if len(mydict['data']) >= 100:
                break
        return mydict
Beispiel #23
0
    def getDeviceByIpAddress(self, deviceName, collector="localhost", ipAddress=""):
        # convert device name to an ip address
        if not ipAddress:
            if isip(deviceName):
                ipAddress = deviceName
            else:
                try:
                    ipAddress = getHostByName(deviceName)
                except socket.error:
                    # look for duplicate name
                    return self.context.Devices.findDeviceByIdExact(deviceName)

        # find a device with the same ip on the same collector
        cat = IModelCatalogTool(self.context.Devices)
        query = And(Eq('text_ipAddress', ipAddress),
                    Eq('objectImplements', 'Products.ZenModel.Device.Device'))
        search_results = cat.search(query=query)

        for brain in search_results.results:
            if brain.getObject().getPerformanceServerName() == collector:
                return brain.getObject()
Beispiel #24
0
 def getSubComponents(self, meta_type="", monitored=True):
     """
     Return generator of components, by meta_type if specified
     """
     catalog = IModelCatalogTool(self)
     COMPONENT = 'Products.ZenModel.DeviceComponent.DeviceComponent'
     monitorq, typeq = None, None
     if monitored:
         monitorq = Eq('monitored', '1')
     if meta_type:
         typeq = Eq('meta_type', meta_type)
     queries = filter(None, (monitorq, typeq))
     if queries:
         query = And(*queries) if len(queries) > 1 else queries[0]
     else:
         query = None
     for brain in catalog.search(COMPONENT, query=query):
         try:
             yield brain.getObject()
         except KeyError:
             log.warn("bad path '%s' in global catalog", brain.getPath())
Beispiel #25
0
 def getDeviceBrains(self, uid=None, start=0, limit=50, sort='name',
                     dir='ASC', params=None, hashcheck=None):
     cat = ICatalogTool(self._getObject(uid))
     reverse = bool(dir == 'DESC')
     qs = []
     query = None
     globFilters = {}
     if params is None:
         params = {}
     for key, value in params.iteritems():
         if key == 'ipAddress':
             ip = ensureIp(value)
             try:
                 checkip(ip)
             except IpAddressError:
                 pass
             else:
                 if numbip(ip):
                     minip, maxip = getSubnetBounds(ip)
                     qs.append(Between('ipAddress', str(minip), str(maxip)))
         # ZEN-10057 - move filtering on indexed groups/systems/location from post-filter to query
         elif key in organizersToClass:
             organizerQuery = self.findMatchingOrganizers(organizersToClass[key], organizersToPath[key], value)
             if not organizerQuery:
                 return []
             qs.append(organizerQuery)
         elif key == 'productionState':
             qs.append(Or(*[Eq('productionState', str(state))
                          for state in value]))
         else:
             globFilters[key] = value
     if qs:
         query = And(*qs)
     brains = cat.search(
         'Products.ZenModel.Device.Device', start=start,
         limit=limit, orderby=sort, reverse=reverse,
         query=query, globFilters=globFilters, hashcheck=hashcheck
     )
     return brains
    def _parse_user_query(self, query):
        """
        # if query is a dict, we convert it to AdvancedQuery
        # @TODO We should make the default query something other than AdvancedQuery
        """
        def _parse_basic_query(attr, value):
            if isinstance(value, str) and '*' in value:
                return MatchGlob(attr, value)
            else:
                return Eq(attr, value)

        if isinstance(query, dict):
            subqueries = []
            for attr, value in query.iteritems():
                if isinstance(value, (list, set, tuple)):
                    # If value is a list or similar, we build an OR
                    or_queries = []
                    for or_query in value:
                        or_queries.append(_parse_basic_query(attr, or_query))
                    subqueries.append(Or(*or_queries))
                else:
                    subqueries.append(_parse_basic_query(attr, value))
            query = And(*subqueries)
        return query
Beispiel #27
0
 def search_mac(self, mac_address):
     queries = []
     queries.append(Eq("objectImplements", "Products.ZenModel.IpInterface.IpInterface"))
     queries.append(Eq("macaddress", mac_address))
     return self.model_catalog.search(query=And(*queries))
Beispiel #28
0
 def get_rrd_templates(self, *args, **kwargs):
     query = Eq("objectImplements", "Products.ZenModel.RRDTemplate.RRDTemplate")
     kwargs["query"] = And(query, MatchGlob('uid', "/zport/dmd/Devices*"))
     return self.model_catalog.search(*args, **kwargs)
Beispiel #29
0
    def folderitems(self, full_objects = False):
        """
        >>> portal = layer['portal']
        >>> portal_url = portal.absolute_url()
        >>> from plone.app.testing import SITE_OWNER_NAME
        >>> from plone.app.testing import SITE_OWNER_PASSWORD

        Test page batching https://github.com/bikalabs/Bika-LIMS/issues/1276
        When visiting the second page, the Water sampletype should be displayed:

        >>> browser = layer['getBrowser'](portal, loggedIn=True, username=SITE_OWNER_NAME, password=SITE_OWNER_PASSWORD)
        >>> browser.open(portal_url+"/bika_setup/bika_sampletypes/folder_view?",
        ... "list_pagesize=10&list_review_state=default&list_pagenumber=2")
        >>> browser.contents
        '...Water...'
        """

        #self.contentsMethod = self.context.getFolderContents
        if not hasattr(self, 'contentsMethod'):
            self.contentsMethod = getToolByName(self.context, self.catalog)

        context = aq_inner(self.context)
        plone_layout = getMultiAdapter((context, self.request), name = u'plone_layout')
        plone_utils = getToolByName(context, 'plone_utils')
        plone_view = getMultiAdapter((context, self.request), name = u'plone')
        portal_properties = getToolByName(context, 'portal_properties')
        portal_types = getToolByName(context, 'portal_types')
        workflow = getToolByName(context, 'portal_workflow')
        site_properties = portal_properties.site_properties
        norm = getUtility(IIDNormalizer).normalize
        if self.request.get('show_all', '').lower() == 'true' \
                or self.show_all == True \
                or self.pagesize == 0:
            show_all = True
        else:
            show_all = False

        pagenumber = int(self.request.get('pagenumber', 1) or 1)
        pagesize = self.pagesize
        start = (pagenumber - 1) * pagesize
        end = start + pagesize - 1

        if (hasattr(self, 'And') and self.And) \
           or (hasattr(self, 'Or') and self.Or):
            # if contentsMethod is capable, we do an AdvancedQuery.
            if hasattr(self.contentsMethod, 'makeAdvancedQuery'):
                aq = self.contentsMethod.makeAdvancedQuery(self.contentFilter)
                if hasattr(self, 'And') and self.And:
                    tmpAnd = And()
                    for q in self.And:
                        tmpAnd.addSubquery(q)
                    aq &= tmpAnd
                if hasattr(self, 'Or') and self.Or:
                    tmpOr = Or()
                    for q in self.Or:
                        tmpOr.addSubquery(q)
                    aq &= tmpOr
                brains = self.contentsMethod.evalAdvancedQuery(aq)
            else:
                # otherwise, self.contentsMethod must handle contentFilter
                brains = self.contentsMethod(self.contentFilter)
        else:
            brains = self.contentsMethod(self.contentFilter)

        results = []
        self.page_start_index = 0
        current_index = -1
        for i, obj in enumerate(brains):
            # we don't know yet if it's a brain or an object
            path = hasattr(obj, 'getPath') and obj.getPath() or \
                 "/".join(obj.getPhysicalPath())

            if hasattr(obj, 'getObject'):
                obj = obj.getObject()

            # check if the item must be rendered or not (prevents from
            # doing it later in folderitems) and dealing with paging
            if not self.isItemAllowed(obj):
                continue

            # avoid creating unnecessary info for items outside the current
            # batch;  only the path is needed for the "select all" case...
            # we only take allowed items into account
            current_index += 1
            if not show_all and not (start <= current_index <= end):
                results.append(dict(path = path, uid = obj.UID()))
                continue

            uid = obj.UID()
            title = obj.Title()
            description = obj.Description()
            icon = plone_layout.getIcon(obj)
            url = obj.absolute_url()
            relative_url = obj.absolute_url(relative = True)

            fti = portal_types.get(obj.portal_type)
            if fti is not None:
                type_title_msgid = fti.Title()
            else:
                type_title_msgid = obj.portal_type

            url_href_title = '%s at %s: %s' % (
                t(type_title_msgid),
                path,
                to_utf8(description))

            modified = self.ulocalized_time(obj.modified()),

            # element css classes
            type_class = 'contenttype-' + \
                plone_utils.normalizeString(obj.portal_type)

            state_class = ''
            states = {}
            for w in workflow.getWorkflowsFor(obj):
                state = w._getWorkflowStateOf(obj).id
                states[w.state_var] = state
                state_class += "state-%s " % state

            results_dict = dict(
                obj = obj,
                id = obj.getId(),
                title = title,
                uid = uid,
                path = path,
                url = url,
                fti = fti,
                item_data = json.dumps([]),
                url_href_title = url_href_title,
                obj_type = obj.Type,
                size = obj.getObjSize,
                modified = modified,
                icon = icon.html_tag(),
                type_class = type_class,
                # a list of lookups for single-value-select fields
                choices = {},
                state_class = state_class,
                relative_url = relative_url,
                view_url = url,
                table_row_class = "",
                category = 'None',

                # a list of names of fields that may be edited on this item
                allow_edit = [],

                # a list of names of fields that are compulsory (if editable)
                required = [],

                # "before", "after" and replace: dictionary (key is column ID)
                # A snippet of HTML which will be rendered
                # before/after/instead of the table cell content.
                before = {}, # { before : "<a href=..>" }
                after = {},
                replace = {},
            )
            try:
                self.review_state = workflow.getInfoFor(obj, 'review_state')
                state_title = workflow.getTitleForStateOnType(
                    self.review_state, obj.portal_type)
                state_title = t(PMF(state_title))
            except:
                self.review_state = 'active'
                state_title = None
            if self.review_state:
                results_dict['review_state'] = self.review_state
            for state_var, state in states.items():
                if not state_title:
                    state_title = workflow.getTitleForStateOnType(
                        state, obj.portal_type)
                results_dict[state_var] = state
            results_dict['state_title'] = state_title

            # extra classes for individual fields on this item { field_id : "css classes" }
            results_dict['class'] = {}
            for name, adapter in getAdapters((obj, ), IFieldIcons):
                auid = obj.UID() if hasattr(obj, 'UID') and callable(obj.UID) else None
                if not auid:
                    continue
                alerts = adapter()
                # logger.info(str(alerts))
                if alerts and auid in alerts:
                    if auid in self.field_icons:
                        self.field_icons[auid].extend(alerts[auid])
                    else:
                        self.field_icons[auid] = alerts[auid]

            # Search for values for all columns in obj
            for key in self.columns.keys():
                if hasattr(obj, key):
                    # if the key is already in the results dict
                    # then we don't replace it's value
                    if results_dict.has_key(key):
                        continue
                    value = getattr(obj, key)
                    if callable(value):
                        value = value()
                    results_dict[key] = value
            results.append(results_dict)

        return results
Beispiel #30
0
    def search(self, request):
        """
        """
        # get serchterms
        searchable = request.form.get("SearchableText", None)
        fulltext = request.form.get("SearchableText", "")
        authors = request.form.get("authors", "")
        #author_id  = request.form.get("author_id", "")
        abstract = request.form.get("abstract", "")
        title = request.form.get("title", "")
        jel = request.form.get("jel", "")
        papers = request.form.get("papers", [])
        #year       = request.form.get("year", "all")
        #period     = request.form.get("period", "all")

        query = ""

        #import pdb; pdb.set_trace()
        if "discussion" in papers:

            query = Or(
                Eq('portal_type', 'File'),
                And(Eq('portal_type', "DiscussionPaper"),
                    In('review_state', ("rejected", "discussible"))))

        if "journal" in papers:
            query_jp = Or(Eq("portal_type", "JournalPaper"),
                          Eq('portal_type', 'eJFile'))

            if query == "":
                query = query_jp
            else:
                query = Or(query, query_jp)

        #if "comment" in papers:
        #    query = And(Eq('portal_type', "Comment"))

        if query == "":
            return []

        if searchable is not None:
            if searchable == "":
                return []

            query = And(query, Eq("SearchableText", searchable))

    # if year != "all":
    #     year_start, year_end = _createYearRange(year)
    #     query = And(query,
    #                 Between("created", year_start, year_end))

    # elif period != "all":
    #     period_start, period_end = _createPeriod(period)
    #     query = And(query,
    #                 Between("created", period_start, period_end))

        if fulltext != "":
            #query_fulltext = In("eJFulltext", fulltext)

            query_fulltext = In("SearchableText", fulltext)
            query = And(query, query_fulltext)

#### XXX getAuthorsForTitle nicht mehr existent. refactoren!
        if authors != "":
            query_author = In("getAuthorsForTitle", authors)
            query = And(query, query_author)

        if abstract != "":
            query_abstract = Eq("getAbstract", abstract)
            query = And(query, query_abstract)

        if title != "":
            query_title = In("Title", title)
            query = And(query, query_title)

        if jel != "":
            query_jel = Eq("getJelAsString", jel)
            query = And(query, query_jel)

        # search

        brains = self.context.portal_catalog.evalAdvancedQuery(query)

        return brains
Beispiel #31
0
    def folderitems(self, full_objects = False):
        """
        """
        #self.contentsMethod = self.context.getFolderContents
        if not hasattr(self, 'contentsMethod'):
            self.contentsMethod = getToolByName(self.context, self.catalog)

        context = aq_inner(self.context)
        plone_layout = getMultiAdapter((context, self.request), name = u'plone_layout')
        plone_utils = getToolByName(context, 'plone_utils')
        plone_view = getMultiAdapter((context, self.request), name = u'plone')
        portal_properties = getToolByName(context, 'portal_properties')
        portal_types = getToolByName(context, 'portal_types')
        workflow = getToolByName(context, 'portal_workflow')
        site_properties = portal_properties.site_properties
        norm = getUtility(IIDNormalizer).normalize
        show_all = self.request.get('show_all', '').lower() == 'true'
        pagenumber = int(self.request.get('pagenumber', 1) or 1)
        pagesize = self.pagesize
        start = (pagenumber - 1) * pagesize
        end = start + pagesize

        if (hasattr(self, 'And') and self.And) \
           or (hasattr(self, 'Or') and self.Or):
            # if contentsMethod is capable, we do an AdvancedQuery.
            if hasattr(self.contentsMethod, 'makeAdvancedQuery'):
                aq = self.contentsMethod.makeAdvancedQuery(self.contentFilter)
                if hasattr(self, 'And') and self.And:
                    tmpAnd = And()
                    for q in self.And:
                        tmpAnd.addSubquery(q)
                    aq &= tmpAnd
                if hasattr(self, 'Or') and self.Or:
                    tmpOr = Or()
                    for q in self.Or:
                        tmpOr.addSubquery(q)
                    aq &= tmpOr
                brains = self.contentsMethod.evalAdvancedQuery(aq)
            else:
                # otherwise, self.contentsMethod must handle contentFilter
                brains = self.contentsMethod(self.contentFilter)
        else:
            brains = self.contentsMethod(self.contentFilter)

        results = []
        self.page_start_index = ""
        for i, obj in enumerate(brains):
            # we don't know yet if it's a brain or an object
            path = hasattr(obj, 'getPath') and obj.getPath() or \
                 "/".join(obj.getPhysicalPath())

            # avoid creating unnecessary info for items outside the current
            # batch;  only the path is needed for the "select all" case...
            if not show_all and not start <= i < end:
                if hasattr(obj, 'getObject'):
                    uid = obj.UID
                else:
                    uid = obj.UID()
                results.append(dict(path = path, uid = uid))
                continue
            if self.page_start_index == "":
                self.page_start_index = i

            if hasattr(obj, 'getObject'):
                obj = obj.getObject()

            uid = obj.UID()
            title = obj.Title()
            description = obj.Description()
            icon = plone_layout.getIcon(obj)
            url = obj.absolute_url()
            relative_url = obj.absolute_url(relative = True)

            fti = portal_types.get(obj.portal_type)
            if fti is not None:
                type_title_msgid = fti.Title()
            else:
                type_title_msgid = obj.portal_type

            url_href_title = u'%s at %s: %s' % \
                (self.context.translate(type_title_msgid,
                                        context = self.request),
                 path,
                 safe_unicode(description))

            modified = self.ulocalized_time(obj.modified()),

            # element css classes
            type_class = 'contenttype-' + \
                plone_utils.normalizeString(obj.portal_type)

            state_class = ''
            states = {}
            for w in workflow.getWorkflowsFor(obj):
                state = w._getWorkflowStateOf(obj).id
                states[w.state_var] = state
                state_class += "state-%s " % state

            results_dict = dict(
                obj = obj,
                id = obj.getId,
                title = title,
                uid = uid,
                path = path,
                url = url,
                fti = fti,
                item_data = json.dumps([]),
                url_href_title = url_href_title,
                obj_type = obj.Type,
                size = obj.getObjSize,
                modified = modified,
                icon = icon.html_tag(),
                type_class = type_class,
                # a list of lookups for single-value-select fields
                choices = {},
                state_class = state_class,
                relative_url = relative_url,
                view_url = url,
                table_row_class = "",

                # a list of names of fields that may be edited on this item
                allow_edit = [],

                # a list of names of fields that are compulsory (if editable)
                required = [],

                # "before", "after" and replace: dictionary (key is column ID)
                # A snippet of HTML which will be rendered
                # before/after/instead of the table cell content.
                before = {}, # { before : "<a href=..>" }
                after = {},
                replace = {},
            )
            try:
                review_state = workflow.getInfoFor(obj, 'review_state')
                state_title = self.context.translate(
                    PMF(workflow.getTitleForStateOnType(review_state,
                                                    obj.portal_type)))
            except:
                review_state = 'active'
                state_title = None
            if review_state:
                results_dict['review_state'] = review_state
            for state_var, state in states.items():
                if not state_title:
                    state_title = workflow.getTitleForStateOnType(
                        state, obj.portal_type)
                results_dict[state_var] = state
            results_dict['state_title'] = state_title

# XXX add some kind of out-of-date indicator to bika listing
##            if App.config.getConfiguration().debug_mode:
##                from Products.CMFEditions.utilities import dereference
##                pr = getToolByName(self.context, 'portal_repository')
##                o = hasattr(obj, 'getObject') and obj.getObject() or obj
##                if pr.isVersionable(o):
##                    pa = getToolByName(self.context, 'portal_archivist')
##                    history_id = str(dereference(o)[1])
##                    version_id = hasattr(o, 'version_id') \
##                               and str(o.version_id) or None
##                    if not 'version_id' in self.columns.keys():
##                        self.columns['version_id'] = {'title':'version'}
##                        for x in range(len(self.review_states)):
##                            self.review_states[x]['columns'].append('version_id')
##                    results_dict['version_id'] = '%s/%s' % (version_id, history_id)

            # extra classes for individual fields on this item { field_id : "css classes" }
            results_dict['class'] = {}

            # Search for values for all columns in obj
            for key in self.columns.keys():
                if hasattr(obj, key):
                    # if the key is already in the results dict
                    # then we don't replace it's value
                    if results_dict.has_key(key):
                        continue
                    value = getattr(obj, key)
                    if callable(value):
                        value = value()
                    results_dict[key] = value
            results.append(results_dict)

        return results