commit 4380244484bd22a4daf002026b25bb886d01b71f Author: Philipp Rauch Date: Tue Nov 12 12:49:43 2013 +0100 initial commit diff --git a/scr/favicon.ico b/scr/favicon.ico new file mode 100644 index 0000000..a998053 Binary files /dev/null and b/scr/favicon.ico differ diff --git a/scr/rest-api.py b/scr/rest-api.py new file mode 100644 index 0000000..67f194c --- /dev/null +++ b/scr/rest-api.py @@ -0,0 +1,224 @@ +#!flask/bin/python +# -*- coding: utf-8 -*- + +''' +Created on 24.10.2013 + +@author: Philipp Rauch +''' +from flask import Flask, jsonify, abort, make_response, request +from time import time +import socket + +app = Flask(__name__) +app_host = '0.0.0.0' #api_host='0.0.0.0' for public access +app_port = '5000' +api_host = socket.gethostname() if app_host == '0.0.0.0' else app_host +api_url = 'http://%s:%s' % (api_host, app_port) + +#### BUFFER #### +device = { + 'battery' : { + 'id': 1, + 'voltage' : 400.11, + 'current' : 20.264, + 'power' : 53.465, + 'capacity' : 80.34, + 'isCharging' : False, + 'isMaster' : True, + 'dyn' : None + }, + 'ac_grid' : { + 'id': 2, + 'voltage' : 400.23, + 'current' : 10.423, + 'power' : 23.35, + 'isOn' : True, + 'isFeed' : True, + 'isMaster' : False, + 'dyn' : None + }, + } +error = { + 'db_error' : { + 'id' : 1, + 'content' : None + }, + } +dc_labor = { + 'device' : device, + 'error' : error + } + +dc_grid = { + 'device' : 'device', + 'error' : 'error' + } + +ac_grid = { + 'device' : 'device', + 'error' : 'error' + } + +system = { + 'dc_labor' : dc_labor, + 'dc_grid' : dc_grid, + 'ac_grid' : ac_grid + } + +#### END BUFFER #### + +def gen_start_url(list): + ''' + generate a URL form a list + @param list: list of aspacts of the URL + @return: URL + ''' + url = api_url + for i in list: + url = '%s/%s' % (url, i) + return url + +def get_level(list): + ''' + iterating over a dictionary on a given path + @param list: items witch tell the path to the value + @return: dictionary with the key and value of the last item in the list + ''' + level = list.pop(0) + for i in list: + if isinstance(level, dict) and i in level: + level = level.get(i) + else: + abort(404) + set_href(level, gen_start_url(list)) #set all links above + return {list[-1] : level} + +def generate_links(dic, url, postfix): + ''' + generats a link to dic if dic is a dictionary + @param dic: variable that is being tested on a dictionary + @param url: previous url + @param postfix: appendix to the given url + ''' + if isinstance(dic, dict): + url = '%s/%s' % (url, postfix) + set_href(dic, url) + else: + return + +def set_href(dic, url): + ''' + set the ref link if dic is a dictionary + @param dic: variable that is being tested on a dictionary + @param url: url to the first dictionary + ''' + if isinstance(dic, dict): + for i in dic.keys(): + generate_links(dic.get(i), url, i) + dic.update({'_href': url}) + dic.update({'_timestamp' : time()}) + +def foo(list, args): + ''' + @param lsit: list + @param args: arguments from the reqest + @return: Dictionary + ''' + del list[-1] + dic = get_level(list).get(list[-1]) + if isinstance(dic, dict) and 'dyn' in dic: + str = 'generating view for %s' % (list[-1]) + else: + abort(404) + return { list[-1] : str, 'args' : args.to_dict(flat=False)} + +def update_buffer(): + #ToDo + None + +def init_buffer(): + #ToDo + None + +########## ERROR Handler ########## +@app.errorhandler(405) +def not_found(error): + return make_response(jsonify( { 'error': '405 Method Not Allowed' } ), 405) + +@app.errorhandler(404) +def not_found(error): + return make_response(jsonify( { 'error': '404 Not Found' } ), 404) + +@app.errorhandler(400) +def bad_reqest(error): + return make_response(jsonify( { 'error': '400 Bad Reqest' } ), 400) + +########## GET Handler ########## +@app.route('/', methods = ['GET']) +def get_root(): + set_href(system, api_url) + return jsonify( { 'system' : system } ) + +@app.route('/', methods = ['GET']) +def get_catch_all(path): + list = path.split('/') + list.insert(0, system) + if '' == list[-1]: # if last element of list is empty + del list[-1] # remove it + out = get_level(list) + elif 'dyn' == list[-1]: + args = request.args # returns a dictionary with a list of values for each key + # each value and each key is represented as a string + # to convert it to a dictionary use to_dict(flat=False) + # to_dict(flat=True) returns the key and the first item of the value list. + out = foo(list, args) + else: + out = get_level(list) + return jsonify( out ) + +######### POST Handler ########## +#@app.route('/db', methods = ['POST']) +#def create_item(): +# if not request.json or not 'title' in request.json: +# abort(400) +# item = { +# 'id': db[-1]['id'] + 1, +# 'title': request.json['title'], +# 'description': request.json.get('description', ""), +# 'done': False +# } +# db.append(item) +# return jsonify( { 'item': item } ), 201 + +########## PUT Handler ########## +#@app.route('/db/', methods = ['PUT']) +#def update_item(item_id): +# item = filter(lambda t: t['id'] == item_id, db) +# if len(item) == 0: +# abort(404) +# if not request.json: +# abort(400) +# if 'title' in request.json and type(request.json['title']) != unicode: +# abort(400) +# if 'description' in request.json and type(request.json['description']) is not unicode: +# abort(400) +# if 'done' in request.json and type(request.json['done']) is not bool: +# abort(400) +# item[0]['title'] = request.json.get('title', item[0]['title']) +# item[0]['description'] = request.json.get('description', item[0]['description']) +# item[0]['done'] = request.json.get('done', item[0]['done']) +# return jsonify( { 'item': item[0] } ), 201 + +########## DELET Handler ########## +#@app.route('/db/', methods = ['DELETE']) +#def delete_item(item_id): +# item = filter(lambda t: t['id'] == item_id, db) +# if len(item) == 0: +# abort(404) +# db.remove(item[0]) +# return jsonify( { 'result': True } ) + +########## RUN ########## +if __name__ == '__main__': + app.run(host = app_host, port = int(app_port), debug = True)