import json from pkg_resources import resource_filename import jsonschema from flask import Blueprint, jsonify, request, abort, current_app from .auth import httpauth from .active import active_json, save_last_state from .utils import first, fuzzy_list_find sensors_views = Blueprint('sensors', __name__) ALLOWED_SENSORS_KEYS = json.load( open(resource_filename('spaceapi', 'schema/sensors.json'), encoding='utf-8') ) RADIATON_SUBKEYS = ('alpha', 'beta', 'gamma', 'beta_gamma') IDENTIFICATION_KEYS = ('name', 'location') def get_identification_key(data): return first(data, IDENTIFICATION_KEYS) def set_value(data, key): try: subkey = get_identification_key(data) except ValueError: return abort(400) try: index = fuzzy_list_find(active_json['sensors'][key], subkey, data[subkey]) active_json['sensors'][key][index].update(data) except ValueError: active_json['sensors'][key].append(data) save_last_state() return jsonify(active_json) def set_radiation_value(data): radiation_keys = [k for k in RADIATON_SUBKEYS if k in data] if not radiation_keys: return abort(400) for first_subkey in radiation_keys: try: second_subkey = get_identification_key(data[first_subkey]) except ValueError: return abort(400) try: index = fuzzy_list_find( active_json['sensors']['radiation'][first_subkey], second_subkey, data[first_subkey][second_subkey]) active_json['sensors']['radiation'][first_subkey][index].update( data) except ValueError: active_json['sensors']['radiaton'][first_subkey].append(data) save_last_state() return jsonify(active_json) @sensors_views.route('/set/', methods=['POST']) @httpauth.login_required def set_sensors(key): if key in ALLOWED_SENSORS_KEYS and key in active_json['sensors']: data = request.data try: data = json.loads(data.decode('utf-8')) try: jsonschema.validate(data, ALLOWED_SENSORS_KEYS[key]) except jsonschema.ValidationError: current_app.logger.info('Validation Error') return abort(400) if key != 'radiation': return set_value(data, key) else: return set_radiation_value(data) except ValueError: return abort(400) else: return abort(400)