2018-06-25 17:12:17 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# coding: utf-8
|
|
|
|
"""
|
|
|
|
Routes definitions
|
|
|
|
"""
|
|
|
|
import json
|
|
|
|
|
|
|
|
import bottle
|
|
|
|
|
|
|
|
from server.models import Report
|
|
|
|
from server import jsonapi
|
|
|
|
|
|
|
|
|
|
|
|
@bottle.route('/api/v1/reports', ["GET", "OPTIONS"])
|
|
|
|
def get_reports():
|
|
|
|
"""
|
|
|
|
API v1 GET reports route.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
GET /api/v1/reports
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
Filtering can be done through the ``filter`` GET param, according
|
|
|
|
to JSON API spec (http://jsonapi.org/recommendations/#filtering).
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
By default no pagination is done. Pagination can be forced using
|
|
|
|
``page[size]`` to specify a number of items per page and
|
|
|
|
``page[number]`` to specify which page to return. Pages are numbered
|
|
|
|
starting from 0.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
Sorting can be handled through the ``sort`` GET param, according to
|
|
|
|
JSON API spec (http://jsonapi.org/format/#fetching-sorting).
|
|
|
|
|
|
|
|
:return: The available reports objects in a JSON ``data`` dict.
|
|
|
|
"""
|
|
|
|
# Handle CORS
|
|
|
|
if bottle.request.method == 'OPTIONS':
|
|
|
|
return {}
|
|
|
|
|
|
|
|
# Handle filtering, pagination and sorting
|
|
|
|
try:
|
|
|
|
filters, page_number, page_size, sorting = jsonapi.JsonApiParseQuery(
|
|
|
|
bottle.request.query,
|
|
|
|
Report,
|
|
|
|
default_sorting='id'
|
|
|
|
)
|
|
|
|
except ValueError as exc:
|
|
|
|
return jsonapi.JsonApiError(400, "Invalid parameters: " + str(exc))
|
|
|
|
|
|
|
|
# Query
|
|
|
|
query = Report.select()
|
|
|
|
if filters:
|
|
|
|
query = query.where(*filters)
|
|
|
|
query = query.order_by(*sorting)
|
|
|
|
if page_number and page_size:
|
|
|
|
query = query.paginate(page_number, page_size)
|
|
|
|
|
|
|
|
return {
|
|
|
|
"data": [
|
|
|
|
r.to_json()
|
|
|
|
for r in query
|
|
|
|
]
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@bottle.route('/api/v1/reports', ["POST", "OPTIONS"])
|
|
|
|
def post_report():
|
|
|
|
"""
|
|
|
|
API v1 POST reports route.
|
|
|
|
|
|
|
|
Example::
|
|
|
|
|
|
|
|
POST /api/v1/reports
|
|
|
|
{
|
|
|
|
"type": "toto",
|
|
|
|
"lat": 32,
|
|
|
|
"lng": 27
|
|
|
|
}
|
|
|
|
"""
|
|
|
|
# Handle CORS
|
|
|
|
if bottle.request.method == 'OPTIONS':
|
|
|
|
return {}
|
|
|
|
|
|
|
|
try:
|
|
|
|
payload = json.load(bottle.request.body)
|
|
|
|
except ValueError as exc:
|
|
|
|
return jsonapi.JsonApiError(400, "Invalid JSON payload: " + str(exc))
|
|
|
|
|
|
|
|
try:
|
2018-06-26 11:39:43 +02:00
|
|
|
r = Report.create(
|
2018-06-25 17:12:17 +02:00
|
|
|
type=payload['type'],
|
|
|
|
lat=payload['lat'],
|
|
|
|
lng=payload['lng']
|
|
|
|
)
|
|
|
|
except KeyError as exc:
|
|
|
|
return jsonapi.JsonApiError(400, "Invalid report payload: " + str(exc))
|
|
|
|
|
|
|
|
return {
|
2018-06-26 11:39:43 +02:00
|
|
|
"data": r.to_json()
|
2018-06-25 17:12:17 +02:00
|
|
|
}
|