Ejemplo n.º 1
0
    def mongoSearch(self, params):
        self.requireParams(('type', 'q'), params)
        allowed = {
            'collection': ['_id', 'name', 'description'],
            'folder': ['_id', 'name', 'description'],
            'item': ['_id', 'name', 'description', 'folderId'],
            'user': ['_id', 'firstName', 'lastName', 'login']
        }
        limit, offset, sort = self.getPagingParameters(params, 'name')
        coll = params['type']

        events.trigger('mongo_search.allowed_collections', info=allowed)

        if coll not in allowed:
            raise RestException('Invalid resource type: %s' % coll)

        try:
            query = bson.json_util.loads(params['q'])
        except ValueError:
            raise RestException('The query parameter must be a JSON object.')

        model = ModelImporter().model(coll)
        if hasattr(model, 'filterResultsByPermission'):
            cursor = model.find(
                query, fields=allowed[coll] + ['public', 'access'])
            return list(model.filterResultsByPermission(
                cursor, user=self.getCurrentUser(), level=AccessType.READ,
                limit=limit, offset=offset, removeKeys=('public', 'access')))
        else:
            return list(model.find(query, fields=allowed[coll], limit=limit,
                                   offset=offset))
Ejemplo n.º 2
0
    def mongoSearch(self, params):
        self.requireParams(('type', 'q'), params)
        allowed = {
            'collection': ['_id', 'name', 'description'],
            'folder': ['_id', 'name', 'description'],
            'item': ['_id', 'name', 'description', 'folderId'],
            'user': ['_id', 'firstName', 'lastName', 'login']
        }
        limit, offset, sort = self.getPagingParameters(params, 'name')
        coll = params['type']

        events.trigger('mongo_search.allowed_collections', info=allowed)

        if coll not in allowed:
            raise RestException('Invalid resource type: {}'.format(coll))

        try:
            query = bson.json_util.loads(params['q'])
        except ValueError:
            raise RestException('The query parameter must be a JSON object.')

        model = ModelImporter().model(coll)
        if hasattr(model, 'filterResultsByPermission'):
            cursor = model.find(
                query, fields=allowed[coll] + ['public', 'access'], limit=0)
            return [r for r in model.filterResultsByPermission(
                cursor, user=self.getCurrentUser(), level=AccessType.READ,
                limit=limit, offset=offset, removeKeys=('public', 'access'))]
        else:
            return [r for r in model.find(query, fields=allowed[coll],
                                          limit=limit, offset=offset)]
Ejemplo n.º 3
0
def userSaved(event):
    if '_id' in event.info:  # Only add to group at new user creation time.
        return

    groupModel = ModelImporter().model('group')
    cursor = groupModel.find({'name': _groupName}, limit=1, fields=('_id',))

    if cursor.count(True) > 0:
        group = cursor.next()
        event.info['groups'] = [group['_id']]
Ejemplo n.º 4
0
    def points(self, params):
        self.requireParams(('q',), params)
        limit, offset, sort = self.getPagingParameters(params, 'name')
        latitude = params.get('latitude', 'meta.latitude')
        longitude = params.get('longitude', 'meta.longitude')

        spec = {
            'type': 'point',
            'latitude': latitude,
            'longitude': longitude,
            'keys': ['meta', 'name', 'description', '_id'],
            'flatten': ['meta']
        }

        try:
            query = bson.json_util.loads(params['q'])
        except ValueError:  # pragma: no cover
            raise RestException('The query parameter must be a JSON object.')

        events.trigger('geojson.points', info={
            'spec': spec,
            'query': query
        })

        # make sure the lat/lon are whitelisted keys to prevent private
        # data leaking
        if spec['latitude'].split('.')[0] not in spec['keys'] or \
                spec['longitude'].split('.')[0] not in spec['keys']:
            raise RestException('Invalid latitude/longitude key.', code=402)

        coll = features.FeatureCollection(points=spec)

        item = ModelImporter().model('item')
        cursor = item.find(
            query,
            limit=0
        )

        cursor = item.filterResultsByPermission(
            cursor,
            user=self.getCurrentUser(),
            level=AccessType.READ,
            limit=limit,
            offset=offset
        )

        try:
            obj = coll(points=cursor)
        except features.GeoJSONException:
            raise RestException(
                'Could not assemble a geoJSON object from spec.',
                code=401
            )

        return obj
Ejemplo n.º 5
0
    def makeInfo(self, params):
        """
        Dynamically generate a cinema info file from girder data marked as
        cinema-viewable.
        """

        folderModel = ModelImporter().model('folder')
        folders = folderModel.find({'meta.pvcinema': 1})
        ret = [{'title': f['name'],
                'description': f['description'],
                'path': f['meta']['webpath']} for f in folders]
        return ret
Ejemplo n.º 6
0
    def makeInfo(self, params):
        """
        Dynamically generate a cinema info file from girder data marked as
        cinema-viewable.
        """

        folderModel = ModelImporter().model('folder')
        folders = folderModel.find({'meta.pvcinema': 1})
        ret = [{
            'title': f['name'],
            'description': f['description'],
            'path': f['meta']['webpath']
        } for f in folders]
        return ret
Ejemplo n.º 7
0
    def gritsSearch(self, params):

        folder = self.gritsFolder()

        self.checkAccess()

        limit, offset, sort = self.getPagingParameters(params, 'meta.date')
        sDate = dateParse(params.get('start', '1990-01-01'))
        eDate = dateParse(params.get('end', str(datetime.now())))
        useRegex = 'regex' in params

        query = {
            'folderId': folder['_id'],
            'meta.date': {'$gte': sDate, '$lt': eDate}
        }

        self.addToQuery(query, params, 'country', useRegex)
        self.addToQuery(query, params, 'disease', useRegex)
        self.addToQuery(query, params, 'species', useRegex)
        self.addToQuery(query, params, 'feed', useRegex)
        self.addToQuery(query, params, 'description', useRegex)
        self.addToQuery(
            query,
            params,
            'diagnosis',
            useRegex,
            'meta.diagnosis.diseases',
            'name'
        )
        self.addToQuery(query, params, 'id', useRegex, 'name')

        model = ModelImporter().model('item')
        cursor = model.find(
            query=query,
            fields=None,
            offset=offset,
            limit=limit,
            sort=sort
        )
        result = list(cursor)
        if not self.checkAccess(priv=True, fail=False):
            result = [model.filter(i) for i in result]

        if 'randomSymptoms' in params:
            try:
                filterBySymptom = set(json.loads(params['filterSymptoms']))
            except Exception:
                filterBySymptom = False
            filtered = []
            for r in result:
                r['meta']['symptoms'] = self.getSymptomFromId(r['_id'])
                if filterBySymptom:
                    s2 = set(r['meta']['symptoms'])
                    if not filterBySymptom.isdisjoint(s2):
                        filtered.append(r)
                else:
                    filtered.append(r)
            result = filtered

        if 'geoJSON' in params:
            result = self.togeoJSON(result)
        return result