93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
from flask import current_app as app
|
|
from flask import request, url_for
|
|
from .db import get_db
|
|
|
|
|
|
@app.route("/detail", methods=["GET"])
|
|
def detail():
|
|
"""
|
|
GET a detial of one record in json format
|
|
:args: ico: integer value of IČO
|
|
:return: json object representing record with ico
|
|
"""
|
|
|
|
ico = request.args.get("ico")
|
|
if ico is None:
|
|
return {}
|
|
try:
|
|
ico = int(ico)
|
|
except ValueError:
|
|
return{}
|
|
|
|
collection = get_db()
|
|
data = collection.find_one({"ico.value":ico})
|
|
data.pop("_id")
|
|
return data
|
|
|
|
|
|
@app.route("/list", methods=["GET"])
|
|
def list_data():
|
|
"""
|
|
GET a list of ORSR records.
|
|
|
|
Pagination is inspired by official MongoDB resources/tutorials
|
|
|
|
The results are paginated using the `page` parameter.
|
|
:return: json object with list of records and links to other pages
|
|
"""
|
|
|
|
page = int(request.args.get("page", 1))
|
|
per_page = 50 # A const value.
|
|
collection = get_db()
|
|
|
|
# For pagination, we sort by ICO
|
|
# then skip the number of docs that earlier pages would have displayed,
|
|
# and then to limit to the fixed page size, ``per_page``.
|
|
records = collection.find().sort("ico.value").skip(per_page * (page - 1)).limit(per_page)
|
|
|
|
records_count = collection.count_documents({})
|
|
|
|
links = {
|
|
"self": {"href": url_for(".list_data", page=page, _external=True)},
|
|
"last": {
|
|
"href": url_for(
|
|
".list_data", page=(records_count // per_page) + 1, _external=True
|
|
)
|
|
},
|
|
}
|
|
# Add a 'prev' link if it's not on the first page:
|
|
if page > 1:
|
|
links["prev"] = {
|
|
"href": url_for(".list_data", page=page - 1, _external=True)
|
|
}
|
|
# Add a 'next' link if it's not on the last page:
|
|
if page - 1 < records_count // per_page:
|
|
links["next"] = {
|
|
"href": url_for(".list_data", page=page + 1, _external=True)
|
|
}
|
|
|
|
return {
|
|
"records": [transform_for_list(record) for record in records], # get only
|
|
"_links": links,
|
|
}
|
|
|
|
|
|
def transform_for_list(record_in):
|
|
"""
|
|
retrieve ico and obchodneMeno from record
|
|
:param record_in: record with all data
|
|
:return: dictionary of ico and obchodneMeno
|
|
"""
|
|
if (obch_meno := record_in["obchodneMeno"].get("value")) is None:
|
|
obch_meno_old = record_in["obchodneMeno"].get("old_values")
|
|
if len(obch_meno_old) == 0:
|
|
obch_meno = ""
|
|
else:
|
|
obch_meno = obch_meno_old[0].get("value", "")
|
|
|
|
record = {
|
|
"ico": record_in["ico"]["value"],
|
|
"obchodneMeno": obch_meno
|
|
}
|
|
return record
|