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/<key>', 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)