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))
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)]
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']]
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
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
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
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