Commit dc99a129 authored by Joel Collins's avatar Joel Collins
Browse files

Status and settings members can be accessed via URI

parent de73ae4e
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -53,6 +53,4 @@ class MoveStageAPI(MicroscopeView):
            with self.microscope.stage.lock:
                self.microscope.stage.move_rel(position)

        out = filter_dict(self.microscope.state, ["stage", "position"])

        return jsonify(out)
        return jsonify(self.microscope.status["stage"]["position"])
+42 −2
Original line number Diff line number Diff line
@@ -6,7 +6,9 @@ from openflexure_microscope.api.utilities import gen, JsonResponse
from openflexure_microscope.api.views import MicroscopeView
from openflexure_microscope.api.utilities import blueprint_for_module

from flask import Blueprint, jsonify, request
from openflexure_microscope.utilities import get_by_path, set_by_path, create_from_path

from flask import Blueprint, jsonify, request, abort
import logging


@@ -144,7 +146,38 @@ class SettingsAPI(MicroscopeView):
        self.microscope.apply_settings(payload.json)
        self.microscope.save_settings()

        return jsonify(self.microscope.read_settings(json_safe=True))
        return jsonify(self.microscope.read_settings())


class NestedSettingsAPI(MicroscopeView):
    def get(self, route):

        keys = route.split("/")

        try:
            value = get_by_path(self.microscope.read_settings(), keys)
        except KeyError:
            return abort(404)

        return jsonify(value)

    def put(self, route):
        keys = route.split("/")

        payload = JsonResponse(request)

        logging.debug("Updating settings from PUT request:")
        logging.debug(payload.json)

        dictionary = create_from_path(keys)
        set_by_path(dictionary, keys, payload.json)

        logging.debug(f"Applying settings: {dictionary}")

        self.microscope.apply_settings(dictionary)
        self.microscope.save_settings()

        return self.get(route)


def construct_blueprint(microscope_obj):
@@ -155,4 +188,11 @@ def construct_blueprint(microscope_obj):
        "/", view_func=SettingsAPI.as_view("settings", microscope=microscope_obj)
    )

    blueprint.add_url_rule(
        "/<path:route>",
        view_func=NestedSettingsAPI.as_view(
            "nested_settings", microscope=microscope_obj
        ),
    )

    return blueprint
+20 −1
Original line number Diff line number Diff line
@@ -4,8 +4,9 @@ Read-only status of the microscope, and attached hardware info

from openflexure_microscope.api.views import MicroscopeView
from openflexure_microscope.api.utilities import blueprint_for_module
from openflexure_microscope.utilities import get_by_path

from flask import Blueprint, jsonify
from flask import Blueprint, jsonify, abort


class StatusAPI(MicroscopeView):
@@ -58,6 +59,19 @@ class StatusAPI(MicroscopeView):
        return jsonify(self.microscope.status)


class NestedStatusAPI(MicroscopeView):
    def get(self, route):

        keys = route.split("/")

        try:
            value = get_by_path(self.microscope.status, keys)
        except KeyError:
            return abort(404)

        return jsonify(value)


def construct_blueprint(microscope_obj):

    blueprint = blueprint_for_module(__name__)
@@ -66,4 +80,9 @@ def construct_blueprint(microscope_obj):
        "/", view_func=StatusAPI.as_view("status", microscope=microscope_obj)
    )

    blueprint.add_url_rule(
        "/<path:route>",
        view_func=NestedStatusAPI.as_view("nested_status", microscope=microscope_obj),
    )

    return blueprint
+17 −0
Original line number Diff line number Diff line
@@ -6,6 +6,23 @@ from functools import reduce
from contextlib import contextmanager


def get_by_path(root, items):
    """Access a nested object in root by item sequence."""
    return reduce(operator.getitem, items, root)


def set_by_path(root, items, value):
    """Set a value in a nested object in root by item sequence."""
    get_by_path(root, items[:-1])[items[-1]] = value


def create_from_path(items):
    tree_dict = {}
    for key in reversed(items):
        tree_dict = {key: tree_dict}
    return tree_dict


def bottom_level_name(obj):
    return obj.__name__.split(".")[-1]