Source code for bibliopixel.control.rest.decorator

import flask, functools, traceback, urllib
from .. import editor

NO_PROJECT_ERROR = 'No Project is currently loaded'
BAD_ADDRESS_ERROR = 'Bad address {address}'
BAD_GETTER_ERROR = 'Couldn\'t get address {address}'
BAD_SETTER_ERROR = 'Couldn\'t set value {value} at address {address}'


[docs]def single(method): """Decorator for RestServer methods that take a single address""" @functools.wraps(method) def single(self, address, value=None): address = urllib.parse.unquote_plus(address) try: error = NO_PROJECT_ERROR if not self.project: raise ValueError error = BAD_ADDRESS_ERROR ed = editor.Editor(address, self.project) if value is None: error = BAD_GETTER_ERROR result = method(self, ed) else: error = BAD_SETTER_ERROR result = method(self, ed, value) result = {'value': result} except Exception as e: traceback.print_exc() msg = '%s\n%s' % (error.format(**locals()), e) result = {'error': msg} return flask.jsonify(result) return single
[docs]def multi(method): """Decorator for RestServer methods that take multiple addresses""" @functools.wraps(method) def multi(self, address=''): values = flask.request.values address = urllib.parse.unquote_plus(address) if address and values and not address.endswith('.'): address += '.' result = {} for a in values or '': try: if not self.project: raise ValueError('No Project is currently loaded') ed = editor.Editor(address + a, self.project) result[address + a] = {'value': method(self, ed, a)} except: if self.project: traceback.print_exc() result[address + a] = {'error': 'Could not multi addr %s' % a} return flask.jsonify(result) return multi