Files @ 436de322df81
Branch filter:

Location: C3L-NOC/spaceapi/spaceapi/sensors.py

Dennis Fink
Add the possibility to specify more users
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)