Source code for meteorpi_server.query_api

from uuid import UUID
from urllib import unquote

from yaml import safe_load

import meteorpi_model as model
from flask.ext.jsonpify import jsonify
from flask import send_file


[docs]def add_routes(meteor_app, url_path=''): """ Adds search and retrieval routes to a :class:`meteorpi_server.MeteorServer` instance :param MeteorApp meteor_app: The :class:`meteorpi_server.MeteorApp` to which routes should be added :param string url_path: The base path used for the query routes, defaults to '' """ from meteorpi_server import MeteorApp db = meteor_app.db app = meteor_app.app @app.route('{0}/cameras'.format(url_path), methods=['GET']) def get_active_cameras(): cameras = db.get_cameras() return jsonify({'cameras': cameras}) @app.route('{0}/cameras/<camera_id>/status'.format(url_path), methods=['GET']) def get_current_camera_status(camera_id): status = db.get_camera_status(camera_id=camera_id) if status is None: return 'No active camera with ID {0}'.format(camera_id), 404 else: return jsonify({'status': status.as_dict()}) @app.route('{0}/cameras/<camera_id>/status/<time_string>'.format(url_path), methods=['GET']) def get_camera_status(camera_id, time_string): status = db.get_camera_status(camera_id=camera_id, time=model.milliseconds_to_utc_datetime(int(time_string))) if status is None: return 'No active camera with ID {0}'.format(camera_id), 404 else: return jsonify({'status': status.as_dict()}) @app.route('{0}/events/<search_string>'.format(url_path), methods=['GET'], strict_slashes=True) def search_events(search_string): search = model.EventSearch.from_dict(safe_load(unquote(search_string))) events = db.search_events(search) return jsonify({'events': list(x.as_dict() for x in events['events']), 'count': events['count']}) @app.route('{0}/files/<search_string>'.format(url_path), methods=['GET']) def search_files(search_string): # print search_string search = model.FileRecordSearch.from_dict(safe_load(unquote(search_string))) files = db.search_files(search) return jsonify({'files': list(x.as_dict() for x in files['files']), 'count': files['count']}) @app.route('{0}/files/content/<file_id>/<file_name>'.format(url_path), methods=['GET']) @app.route('{0}/files/content/<file_id>'.format(url_path), methods=['GET']) def get_file_content(file_id, file_name=None): record = db.get_file(file_id=UUID(hex=file_id)) if record is not None: return send_file(filename_or_fp=record.get_path(), mimetype=record.mime_type) else: return MeteorApp.not_found(entity_id=file_id)