def html_datasets(provider=None): query_providers = {"enable": True} projection_provider = {"_id": False, "name": True, "slug": True} query_datasets = {"enable": True} projection_datasets = {"_id": False, "name": True, "slug": True, "dataset_code": True, "provider_name": True} if provider: provider_doc = queries.col_providers().find_one({"slug": provider}) query_datasets["provider_name"] = provider_doc["name"] query_providers["name"] = provider_doc["name"] providers = dict([(doc["name"], doc) for doc in queries.col_providers().find(query_providers, projection_provider)]) query_datasets["provider_name"] = {"$in": list(providers.keys())} datasets = queries.col_datasets().find(query_datasets, projection_datasets) docs = {} for dataset in datasets: provider_name = dataset["provider_name"] if not provider_name in docs: docs[provider_name] = {"provider": providers[provider_name], "datasets": []} docs[provider_name]["datasets"].append(dataset) return render_template("datasets.html", docs=docs)
def datasets_codelists(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "codelists": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_tools.json_response(doc["codelists"])
def series_values_view(slug): query = {'slug': slug} projection = { "_id": False, "key": True, "slug": True, "values.value": True, "values.period": True, "provider_name": True, 'dataset_code': True } doc = queries.col_series().find_one(query, projection) if not doc: abort(404) query = { 'enable': True, "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"] } projection = {"_id": False, "enable": True} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) return json_response(json_util.dumps(doc, default=json_util.default))
def dataset_unit(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "enable": False, "lock": False, "tags": False} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_tools.json_response(doc)
def datasets_series_list(dataset): """Return all series for one dataset """ query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = {'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"]} projection = {"_id": False, "values": False} query = queries.complex_queries_series(query) limit = request.args.get('limit', default=1000, type=int) docs = queries.col_series().find(query, projection) if limit: docs= docs.limit(limit) _docs = [doc for doc in docs] return json_tools.json_response(_docs)
def dataflow_2_1(agencyID=None, resourceID=None, version="latest"): """ TODO: option references avec limit sur 1 dataset """ references = request.args.get('references') query_ds = {'enable': True} if agencyID: query_ds["provider_name"] = agencyID.upper() if resourceID: query_ds["dataset_code"] = resourceID projection_ds = {"_id": False, "provider_name": True, "dataset_code": True, "name": True} docs = queries.col_datasets().find(query_ds, projection_ds) now = "%sZ" % str(datetime.utcnow().isoformat()) context = { "datasets": docs, "message_id": str(uuid.uuid4()), "prepared_date": now, "version": "1.0" } tmpl = render_template('sdmx/2.1/dataflow.xml', **context) response = make_response(tmpl) response.headers["Content-Type"] = "application/xml" return response
def dataset_dimensions_key_view(slug): query = {'enable': True, 'slug': slug} projection = {"_id": False, "dimension_keys": True } doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_response(json_util.dumps(doc["dimension_keys"], default=json_util.default))
def datasets_series_list(dataset): """Return all series for one dataset """ query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = { 'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"] } projection = {"_id": False, "values": False} query = queries.complex_queries_series(query) docs = queries.col_series().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=20, type=int) if per_page > 100: per_page = 100 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] return json_tools.json_response(_docs, meta=meta)
def dataset_series_list_values_by_dataset_code(provider=None, dataset_code=None, frequency=None): query = {"provider_name": provider, "dataset_code": dataset_code} projection = { "_id": False, "provider_name": True, "dataset_code": True, "metadata.frequencies": True, "enable": True } dataset = queries.col_datasets().find_one(query, projection) if not dataset: abort(404, "dataset %s/%s not found or disable." % (provider, dataset_code)) if not frequency: frequency = request.args.get('frequency') if not frequency: abort(400, "frequency field is required.") frequencies = dataset.get("metadata", {}).get("frequencies", []) if frequencies and not frequency in frequencies: abort(404, "Frequencies available: %s" % frequencies) return _dataset_values(provider, dataset_code, frequency=frequency)
def datasets_attributes_keys(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "attribute_keys": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_tools.json_response(doc.get("attribute_keys"))
def datasets_series_list(dataset): """Return all series for one dataset """ query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = { 'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"] } projection = {"_id": False, "values": False} query = queries.complex_queries_series(query) limit = request.args.get('limit', default=1000, type=int) docs = queries.col_series().find(query, projection) if limit: docs = docs.limit(limit) _docs = [doc for doc in docs] return json_tools.json_response(_docs)
def datasets_series_list(dataset): """Return all series for one dataset """ query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = {'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"]} projection = {"_id": False, "values": False} query = queries.complex_queries_series(query) docs = queries.col_series().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=20, type=int) if per_page > 100: per_page = 100 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] return json_tools.json_response(_docs, meta=meta)
def dataset_series_list_values(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "provider_name": True, "dataset_code": True } doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) query = {"provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"]} projection = { "_id": False, "key": True, "slug": True, "name": True, "frequency": True, "start_date": True, "end_date": True, "dimensions": True, "attributes": True, "values.value": True, "values.period": True, } query = queries.complex_queries_series(query) docs = queries.col_series().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=50, type=int) if per_page > 1000: per_page = 1000 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] return json_tools.json_response_async(_docs, meta=meta)
def providers_datasets_list(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = { "_id": False, "tags": False, "enable": False, "lock": False, "concepts": False, "codelists": False } #docs = [doc for doc in queries.col_datasets().find(query, projection)] docs = queries.col_datasets().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=10, type=int) if per_page > 50: per_page = 50 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] #return json_tools.json_response(_docs, meta=meta) return json_tools.json_response_async(_docs, meta=meta)
def dataset_dimensions_key_view(slug): query = {'enable': True, 'slug': slug} projection = {"_id": False, "dimension_keys": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_response( json_util.dumps(doc["dimension_keys"], default=json_util.default))
def providers_datasets_list(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = {"_id": False, "tags": False, "enable": False, "lock": False, "concepts": False, "codelists": False} #docs = [doc for doc in queries.col_datasets().find(query, projection)] docs = [doc for doc in queries.col_datasets().find(query, projection)] return json_tools.json_response(docs)
def dataset_view(slug): query = {'enable': True, 'slug': slug} projection = {"_id": False, "enable": False, "lock": False, "tags": False, "dimension_list": False, "attribute_list": False} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_response(json_util.dumps(doc, default=json_util.default))
def datasets_view(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = {"_id": False, "tags": False, "enable": False, "lock": False, "dimension_list": False, "attribute_list": False, "concepts": False, "codelists": False} docs = queries.col_datasets().find(query, projection) return json_response(json_util.dumps(docs, default=json_util.default))
def datasets_attributes_list(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "attribute_keys": True, "codelists": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) attributes = OrderedDict() for key in doc.get("attribute_keys"): attributes[key] = doc["codelists"].get(key, {}) return json_tools.json_response(attributes)
def series_list_view(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False, "tags": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = {'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"]} projection = {"_id": False, "tags": False, "values": False} docs = queries.col_series().find(query, projection) return json_response(json_util.dumps(docs, default=json_util.default))
def dataset_values_view(slug): query = {'enable': True, 'slug': slug} projection = {"_id": False, "provider_name": True, "dataset_code": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) #TODO: rendre obligatoire frequency query = { "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"] } projection = { "_id": False, "key": True, "slug": True, "frequency": True, "values.value": True, "values.period": True, } #TODO: multiple value in dimension limit = request.args.get('limit', default=0, type=int) for r in request.args.lists(): if r[0] == 'limit': pass elif r[0] == 'frequency': query['frequency'] = r[1][0] else: #TODO: case regex query['dimensions.' + r[0]] = {'$regex': r[1][0]} #/api/v1/dataset/bis-pp-ls/values?Reference%20area=FR&Reference%20area=AU #query : {'provider_name': 'BIS', 'dataset_code': 'PP-LS', 'dimensions.Reference area': {'$regex': 'FR'}} docs = queries.col_series().find(query, projection).limit(limit) #TODO: Period + Value count = docs.count() - 1 print("dataset-values - query[%s] - result[%s]" % (query, count)) def generate(): yield "[" for i, row in enumerate(docs): yield json_util.dumps(row, default=json_util.default) if i < count: yield "," yield "]" return app.response_class(generate(), mimetype='application/json')
def dataset_unit_frequencies(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "enable": False, "lock": False, "tags": False} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) query = {"provider_name": doc["provider_name"], "dataset_code": doc["dataset_code"]} docs = queries.col_series().distinct("frequency", filter=query) return json_tools.json_response(docs)
def dataset_unit_frequencies(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "enable": False, "lock": False, "tags": False} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) query = { "provider_name": doc["provider_name"], "dataset_code": doc["dataset_code"] } docs = queries.col_series().distinct("frequency", filter=query) return json_tools.json_response(docs)
def dataset_view(slug): query = {'enable': True, 'slug': slug} projection = { "_id": False, "enable": False, "lock": False, "tags": False, "dimension_list": False, "attribute_list": False } doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) return json_response(json_util.dumps(doc, default=json_util.default))
def series_list_view(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "values": False, "tags": False} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) query = { 'provider_name': dataset_doc['provider_name'], 'dataset_code': dataset_doc["dataset_code"] } projection = {"_id": False, "tags": False, "values": False} docs = queries.col_series().find(query, projection) return json_response(json_util.dumps(docs, default=json_util.default))
def providers_datasets_list(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = { "_id": False, "tags": False, "enable": False, "lock": False, "concepts": False, "codelists": False } #docs = [doc for doc in queries.col_datasets().find(query, projection)] docs = [doc for doc in queries.col_datasets().find(query, projection)] return json_tools.json_response(docs)
def datasets_view(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = { "_id": False, "tags": False, "enable": False, "lock": False, "dimension_list": False, "attribute_list": False, "concepts": False, "codelists": False } docs = queries.col_datasets().find(query, projection) return json_response(json_util.dumps(docs, default=json_util.default))
def dataset_values_view(slug): query = {'enable': True, 'slug': slug} projection = {"_id": False, "provider_name": True, "dataset_code": True } doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) #TODO: rendre obligatoire frequency query = {"provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"]} projection = { "_id": False, "key": True, "slug": True, "frequency": True, "values.value": True, "values.period": True, } #TODO: multiple value in dimension limit = request.args.get('limit', default=0, type=int) for r in request.args.lists(): if r[0] == 'limit': pass elif r[0] == 'frequency': query['frequency'] = r[1][0] else: #TODO: case regex query['dimensions.'+r[0]] = {'$regex': r[1][0]} #/api/v1/dataset/bis-pp-ls/values?Reference%20area=FR&Reference%20area=AU #query : {'provider_name': 'BIS', 'dataset_code': 'PP-LS', 'dimensions.Reference area': {'$regex': 'FR'}} docs = queries.col_series().find(query, projection).limit(limit) #TODO: Period + Value count = docs.count() -1 print("dataset-values - query[%s] - result[%s]" % (query, count)) def generate(): yield "[" for i, row in enumerate(docs): yield json_util.dumps(row, default=json_util.default) if i < count: yield "," yield "]" return app.response_class(generate(), mimetype='application/json')
def series_view(slug): query = {'slug': slug} projection = {"_id": False, "tags": False} doc = queries.col_series().find_one(query, projection) if not doc: abort(404) query = {'enable': True, "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"]} projection = {"_id": False, "enable": True} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) return json_response(json_util.dumps(doc, default=json_util.default))
def series_unit(series): query = {'slug': series} projection = {"_id": False} doc = queries.col_series().find_one(query, projection) if not doc: abort(404) query = {'enable': True, "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"]} projection = {"_id": False, "enable": True} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) return json_tools.json_response(doc)
def EVIEWS_values_by_dataset_slug(slug=None): """ http://widukind-api-dev.cepremap.org/api/v1/eviews/values/insee-ipch-2005-fr-coicop http://widukind-api-dev.cepremap.org/api/v1/eviews/values/insee-ipch-2005-fr-coicop?frequency=M http://widukind-api-dev.cepremap.org/api/v1/eviews/values/insee-ipch-2005-fr-coicop?frequency=M&limit=100 http://widukind-api-dev.cepremap.org/api/v1/eviews/values/insee-ipch-2005-fr-coicop?frequency=M&PRODUIT=T00 """ query = {"slug": slug} projection = {"_id": False, "provider_name": True, "dataset_code": True} dataset_code = queries.col_datasets().find_one(query, projection) return _EVIEWS_dataset_values(dataset_code["provider_name"], dataset_code["dataset_code"])
def series_unit(series): query = {'slug': series} projection = {"_id": False} doc = queries.col_series().find_one(query, projection) if not doc: abort(404) query = { 'enable': True, "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"] } projection = {"_id": False, "enable": True} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) return json_tools.json_response(doc)
def dsd_2_1(agencyID, resourceID, version="latest"): """ http://127.0.0.1:8081/api/v1/sdmx/datastructure/INSEE/IPCH-2015-FR-COICOP http://127.0.0.1:8081/api/v1/sdmx/datastructure/all/IPC-2015-COICOP/latest/?references=children http://127.0.0.1:8081/api/v1/sdmx/datastructure/all/IPCH-2015-FR-COICOP/latest/?references=children > attendu: "2016-01-23T09:09:42.771Z" "2013-07-10T11:00:00.000Z","%Y-%m-%dT%H:%M:%S.%fZ") "2013-07-12T07:00:00Z","%Y-%m-%dT%H:%M:%SZ" datetime.datetime.utcnow().isoformat() + "Z" > iso: YYYY-MM-DDTHH:MM:SS.mmmmmm """ references = request.args.get('references') query_ds = {'enable': True, 'provider_name': agencyID, 'dataset_code': resourceID} projection_ds = {"tags": False, "_id": False} doc = queries.col_datasets().find_one(query_ds, projection_ds) if not doc: abort(404) now = "%sZ" % str(datetime.utcnow().isoformat()) context = { "dataset": doc, "datasets": [doc], "time_period_concept": "TIME_PERIOD" in doc.get("concepts"), "obs_value_concept": "OBS_VALUE" in doc.get("concepts"), "load_all": references in ["children", "descendants", "all"], "message_id": str(uuid.uuid4()), "prepared_date": now, "version": "1.0" } tmpl = render_template('sdmx/2.1/datastructure.xml', **context) response = make_response(tmpl) response.headers["Content-Type"] = "application/xml" return response
def dataset_series_list_values(dataset): query = {'enable': True, 'slug': dataset} projection = {"_id": False, "provider_name": True, "dataset_code": True} doc = queries.col_datasets().find_one(query, projection) if not doc: abort(404) query = { "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"] } projection = { "_id": False, "key": True, "slug": True, "name": True, "frequency": True, "start_date": True, "end_date": True, "dimensions": True, "attributes": True, "values.value": True, "values.period": True, } query = queries.complex_queries_series(query) docs = queries.col_series().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=50, type=int) if per_page > 1000: per_page = 1000 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] return json_tools.json_response_async(_docs, meta=meta)
def dataset_series_list_values_by_dataset_code(provider=None, dataset_code=None, frequency=None): query = {"provider_name": provider, "dataset_code": dataset_code} projection = {"_id": False, "provider_name": True, "dataset_code": True, "metadata.frequencies": True, "enable": True} dataset = queries.col_datasets().find_one(query, projection) if not dataset: abort(404, "dataset %s/%s not found or disable." % (provider, dataset_code)) if not frequency: frequency = request.args.get('frequency') if not frequency: abort(400, "frequency field is required.") frequencies = dataset.get("metadata", {}).get("frequencies", []) if frequencies and not frequency in frequencies: abort(404, "Frequencies available: %s" % frequencies) return _dataset_values(provider, dataset_code, frequency=frequency)
def codelist_2_1(agencyID, resourceID, version="latest", itemID=None): references = request.args.get('references') query_ds = {'enable': True, 'provider_name': agencyID, 'dataset_code': resourceID} projection_ds = {"_id": False, "tags": False} #is_concepts = references and references in ["children", "descendants", "all"] #if not is_concepts: # projection_ds["concepts"] = False is_concepts = True #TODO: itemID et repercussion sur codelists ! #if itemID: # projection_ds["concepts.%s" % itemID] = True #print("query_ds : ", query_ds) doc = queries.col_datasets().find_one(query_ds, projection_ds) if not doc: abort(404) now = "%sZ" % str(datetime.utcnow().isoformat()) context = { "dataset": doc, "load_all": references in ["children", "descendants", "all"], "message_id": str(uuid.uuid4()), "prepared_date": now, "version": "1.0" } if is_concepts: context["time_period_concept"] = "time_period" in doc.get("concepts") context["obs_value_concept"] = "obs_value" in doc.get("concepts") tmpl = render_template('sdmx/2.1/codelist.xml', **context) response = make_response(tmpl) response.headers["Content-Type"] = "application/xml" return response
def series_view(slug): query = {'slug': slug} projection = {"_id": False, "tags": False} doc = queries.col_series().find_one(query, projection) if not doc: abort(404) query = { 'enable': True, "provider_name": doc["provider_name"], 'dataset_code': doc["dataset_code"] } projection = {"_id": False, "enable": True} dataset_doc = queries.col_datasets().find_one(query, projection) if not dataset_doc: abort(404) values = [v["value"] for v in doc["values"]] doc["values"] = values return json_response(json_util.dumps([doc], default=json_util.default))
def providers_datasets_list(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} projection = {"_id": False, "tags": False, "enable": False, "lock": False, "concepts": False, "codelists": False} #docs = [doc for doc in queries.col_datasets().find(query, projection)] docs = queries.col_datasets().find(query, projection) page = request.args.get('page', default=1, type=int) per_page = request.args.get('per_page', default=10, type=int) if per_page > 50: per_page = 50 pagination = queries.Pagination(docs, page, per_page) meta = { "page": pagination.page, "pages": pagination.pages, "per_page": pagination.per_page, "total": pagination.total, } _docs = [doc for doc in pagination.items] #return json_tools.json_response(_docs, meta=meta) return json_tools.json_response_async(_docs, meta=meta)
def html_datasets(provider=None): query_providers = {"enable": True} projection_provider = {"_id": False, "name": True, "slug": True} query_datasets = {"enable": True} projection_datasets = { "_id": False, "name": True, "slug": True, "dataset_code": True, "provider_name": True } if provider: provider_doc = queries.col_providers().find_one({"slug": provider}) query_datasets["provider_name"] = provider_doc["name"] query_providers["name"] = provider_doc["name"] providers = dict([(doc["name"], doc) for doc in queries.col_providers().find( query_providers, projection_provider)]) query_datasets["provider_name"] = {"$in": list(providers.keys())} datasets = queries.col_datasets().find(query_datasets, projection_datasets) docs = {} for dataset in datasets: provider_name = dataset["provider_name"] if not provider_name in docs: docs[provider_name] = { "provider": providers[provider_name], "datasets": [] } docs[provider_name]["datasets"].append(dataset) return render_template("datasets.html", docs=docs)
def datasets_list_keys(provider): provider_doc = queries.get_provider(provider) query = {'provider_name': provider_doc["name"]} docs = queries.col_datasets().distinct("slug", filter=query) return json_tools.json_response(docs)