import config-manager controller
This commit is contained in:
@ -47,7 +47,7 @@ class RegisterDispatcher:
|
||||
def get_function_args():
|
||||
function_args = self.get_function_args(function)
|
||||
# risotto_context is a special argument, remove it
|
||||
if function_args[0] == 'risotto_context':
|
||||
if function_args and function_args[0] == 'risotto_context':
|
||||
function_args = function_args[1:]
|
||||
return set(function_args)
|
||||
|
||||
@ -122,7 +122,7 @@ class RegisterDispatcher:
|
||||
if not Config(self.option).option(uri).option.type() == 'message':
|
||||
raise RegistrationError(_(f'{uri} is not a valid message'))
|
||||
except AttributeError:
|
||||
raise RegistrationError(_(f'{uri} is not a valid message'))
|
||||
raise RegistrationError(_(f'the message {uri} not exists'))
|
||||
|
||||
# create an uris' version if needed
|
||||
if version not in self.uris:
|
||||
@ -139,7 +139,7 @@ class RegisterDispatcher:
|
||||
|
||||
# True if first argument is the risotto_context
|
||||
function_args = self.get_function_args(function)
|
||||
if function_args[0] == 'risotto_context':
|
||||
if function_args and function_args[0] == 'risotto_context':
|
||||
inject_risotto_context = True
|
||||
function_args.pop(0)
|
||||
else:
|
||||
@ -162,17 +162,18 @@ class RegisterDispatcher:
|
||||
self.uris[version][uri] = dico
|
||||
else:
|
||||
# if event
|
||||
if notification and notification is not undefined:
|
||||
raise RegistrationError(_(f'notification not supported yet'))
|
||||
# valid function's arguments
|
||||
self._valid_event_params(version, uri, function, module_name)
|
||||
# register this function
|
||||
if uri not in self.uris[version]:
|
||||
self.uris[version][uri] = []
|
||||
self.uris[version][uri].append({'module': module_name,
|
||||
'function': function,
|
||||
'arguments': function_args,
|
||||
'risotto_context': inject_risotto_context})
|
||||
dico = {'module': module_name,
|
||||
'function': function,
|
||||
'arguments': function_args,
|
||||
'risotto_context': inject_risotto_context}
|
||||
if notification and notification is not undefined:
|
||||
dico['notification'] = notification
|
||||
self.uris[version][uri].append(dico)
|
||||
|
||||
def set_module(self, module_name, module):
|
||||
""" register and instanciate a new module
|
||||
@ -269,42 +270,45 @@ class Dispatcher(RegisterDispatcher):
|
||||
uri:str,
|
||||
context: Context,
|
||||
kwargs: Dict):
|
||||
if not isinstance(returns, dict):
|
||||
if isinstance(returns, dict):
|
||||
returns = [returns]
|
||||
if not isinstance(returns, list):
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} has to return a dict')
|
||||
err = _(f'function {module_name}.{function_name} has to return a dict or a list')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
response = self.messages[uri]['response']
|
||||
if response is None:
|
||||
raise Exception('hu?')
|
||||
else:
|
||||
config = Config(response, display_name=lambda self, dyn_name: self.impl_getname())
|
||||
config.property.read_write()
|
||||
try:
|
||||
for key, value in returns.items():
|
||||
config.option(key).value.set(value)
|
||||
except AttributeError:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}"')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
except ValueError:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return the parameter "{key}" with an unvalid value "{value}"')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
config.property.read_only()
|
||||
try:
|
||||
config.value.dict()
|
||||
except Exception as err:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return an invalid response {err}')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
for ret in returns:
|
||||
config = Config(response, display_name=lambda self, dyn_name: self.impl_getname())
|
||||
config.property.read_write()
|
||||
try:
|
||||
for key, value in ret.items():
|
||||
config.option(key).value.set(value)
|
||||
except AttributeError:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return the unknown parameter "{key}"')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
except ValueError:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return the parameter "{key}" with an unvalid value "{value}"')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
config.property.read_only()
|
||||
try:
|
||||
config.value.dict()
|
||||
except Exception as err:
|
||||
module_name = function.__module__.split('.')[-2]
|
||||
function_name = function.__name__
|
||||
err = _(f'function {module_name}.{function_name} return an invalid response {err}')
|
||||
log.error_msg(version, uri, context, kwargs, 'call', err)
|
||||
raise CallError(str(err))
|
||||
|
||||
|
||||
async def call(self, version, uri, risotto_context, public_only=False, **kwargs):
|
||||
@ -351,10 +355,15 @@ class Dispatcher(RegisterDispatcher):
|
||||
# notification
|
||||
if obj.get('notification'):
|
||||
notif_version, notif_message = obj['notification'].split('.', 1)
|
||||
await self.publish(notif_version,
|
||||
notif_message,
|
||||
new_context,
|
||||
**returns)
|
||||
if not isinstance(returns, list):
|
||||
send_returns = [returns]
|
||||
else:
|
||||
send_returns = returns
|
||||
for ret in send_returns:
|
||||
await self.publish(notif_version,
|
||||
notif_message,
|
||||
new_context,
|
||||
**ret)
|
||||
return returns
|
||||
|
||||
async def publish(self, version, uri, risotto_context, public_only=False, **kwargs):
|
||||
@ -404,6 +413,14 @@ class Dispatcher(RegisterDispatcher):
|
||||
function_name = function.__name__
|
||||
log.info_msg(version, uri, new_context, kwargs,'publish', info_msg)
|
||||
|
||||
# notification
|
||||
if obj.get('notification'):
|
||||
notif_version, notif_message = obj['notification'].split('.', 1)
|
||||
await self.publish(notif_version,
|
||||
notif_message,
|
||||
new_context,
|
||||
**returns)
|
||||
|
||||
|
||||
dispatcher = Dispatcher()
|
||||
|
||||
|
Reference in New Issue
Block a user