# Copyright (c) 2019. Tobias Kurze """ This module provides functions related to object states through the API. """ from datetime import datetime from pprint import pprint from flask_jwt_extended import jwt_required from flask_restx import fields, Resource, inputs from backend import db, app from backend.api import api_state from backend.api.models import recorder_model, recorder_model_model, recorder_command_model, state_model from backend.cron import async_cron_recorder_checker from backend.cron.cron_state_checker import StateChecker from backend.models.recorder_model import Recorder, RecorderModel, RecorderCommand from backend.models.room_model import Room import backend.recorder_adapters as r_a # == from backend.tools.recorder_state_checker import get_recorder_adapter, check_capture_agent_state, check_stream_sanity @api_state.route('/recorder/') @api_state.response(404, 'Recorder not found') @api_state.param('id', 'The recorder identifier') class RecorderStateResource(Resource): @jwt_required @api_state.doc('get_recorder_state') @api_state.marshal_with(state_model, skip_none=False) def get(self, id): """Fetch a recorder given its identifier""" recorder: Recorder = Recorder.query.get(id) if recorder is None: api_state.abort(404) current_states_by_checker = async_cron_recorder_checker.get_current_state() state = async_cron_recorder_checker.get_current_state_for_recorder_id(recorder.id) if state is None: state_checker = StateChecker([check_capture_agent_state], Recorder) state_checker.add_object_to_state_check(recorder) state_checker.check_object_state() state = state_checker.get_current_state_for_recorder_id(recorder.id) if not state.get('state_ok', False): # if state is not OK, return state -> no more checks! return state # do additional checks, such as: check for single color, sound check, etc. stream_state = check_stream_sanity(recorder) print(stream_state) return stream_state @api_state.route('/recorder') class RecorderStateList(Resource): @jwt_required @api_state.doc('get_recorders_states') @api_state.marshal_list_with(state_model, skip_none=False) def get(self): """ Get state of all recorders :return: state """ return Recorder.get_all()