From 0e78218ea60b8570dc9fc8ed1280e622326baa0a Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Mon, 9 Dec 2019 17:41:39 +0100 Subject: [PATCH] utils: try to guess type of params (#38328) And fix a bug where they did not appear in documentation. --- passerelle/utils/api.py | 31 +++++++++++++++++++++++++++-- passerelle/views.py | 44 ++++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/passerelle/utils/api.py b/passerelle/utils/api.py index 021edffb..94348b10 100644 --- a/passerelle/utils/api.py +++ b/passerelle/utils/api.py @@ -147,6 +147,15 @@ class endpoint(object): return {} def get_params(self): + + def type_to_str(value): + if isinstance(value, bool): + return 'boolean' + elif isinstance(value, int): + return 'integer' + elif isinstance(value, float): + return 'float' + params = [] defaults = dict(zip( reversed(inspect.getargspec(self.func).args), @@ -155,10 +164,28 @@ class endpoint(object): if param == 'post_data': continue param_info = {'name': param} - if self.parameters and param in self.parameters and self.parameters[param].get('description'): - param_info['description'] = self.parameters[param].get('description') + if self.parameters and param in self.parameters: + info = self.parameters[param] + if info.get('description'): + param_info['description'] = info['description'] + if 'type' in info: + typ = info['type'] + if typ == 'int': + param_info['type'] = 'integer' + elif typ == 'bool': + param_info['type'] = 'boolean' + else: + param_info['type'] = typ + elif 'example_value' in info: + typ = type_to_str(info['example_value']) + if typ: + param_info['type'] = typ if param in defaults: param_info['optional'] = True param_info['default_value'] = defaults[param] + if 'type' not in param_info: + typ = type_to_str(defaults[param]) + if typ: + param_info['type'] = typ params.append(param_info) return params diff --git a/passerelle/views.py b/passerelle/views.py index a82f219e..4be2cf6a 100644 --- a/passerelle/views.py +++ b/passerelle/views.py @@ -318,29 +318,29 @@ class GenericEndpointView(GenericConnectorMixin, SingleObjectMixin, View): continue if not d.get(key): d[key] = other_params[key] - if self.endpoint.endpoint_info.parameters: + for parameter_info in self.endpoint.endpoint_info.get_params(): # check and convert parameter values - for parameter, parameter_info in self.endpoint.endpoint_info.parameters.items(): - if parameter not in d: - continue - if parameter_info.get('type') == 'bool': - if d[parameter].lower() in ('true', 'on'): - d[parameter] = True - elif d[parameter].lower() in ('false', 'off'): - d[parameter] = False - else: - raise InvalidParameterValue(parameter) - elif parameter_info.get('type') == 'int': - try: - d[parameter] = int(d[parameter]) - except ValueError: - raise InvalidParameterValue(parameter) - elif parameter_info.get('type') == 'float': - d[parameter] = d[parameter].replace(',', '.') - try: - d[parameter] = float(d[parameter]) - except ValueError: - raise InvalidParameterValue(parameter) + parameter = parameter_info['name'] + if parameter not in d: + continue + if parameter_info.get('type') in ('bool', 'boolean'): + if d[parameter].lower() in ('true', 'on'): + d[parameter] = True + elif d[parameter].lower() in ('false', 'off'): + d[parameter] = False + else: + raise InvalidParameterValue(parameter) + elif parameter_info.get('type') in ('int', 'integer'): + try: + d[parameter] = int(d[parameter]) + except ValueError: + raise InvalidParameterValue(parameter) + elif parameter_info.get('type') == 'float': + d[parameter] = d[parameter].replace(',', '.') + try: + d[parameter] = float(d[parameter]) + except ValueError: + raise InvalidParameterValue(parameter) if request.method == 'POST' and self.endpoint.endpoint_info.post: request_body = self.endpoint.endpoint_info.post.get('request_body', {}) -- 2.20.1