Projet

Général

Profil

0001-utils-try-to-guess-type-of-params-38328.patch

Valentin Deniaud, 10 décembre 2019 12:02

Télécharger (5,24 ko)

Voir les différences:

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(-)
passerelle/utils/api.py
147 147
        return {}
148 148

  
149 149
    def get_params(self):
150

  
151
        def type_to_str(value):
152
            if isinstance(value, bool):
153
                return 'boolean'
154
            elif isinstance(value, int):
155
                return 'integer'
156
            elif isinstance(value, float):
157
                return 'float'
158

  
150 159
        params = []
151 160
        defaults = dict(zip(
152 161
            reversed(inspect.getargspec(self.func).args),
......
155 164
            if param == 'post_data':
156 165
                continue
157 166
            param_info = {'name': param}
158
            if self.parameters and param in self.parameters and self.parameters[param].get('description'):
159
                param_info['description'] = self.parameters[param].get('description')
167
            if self.parameters and param in self.parameters:
168
                info = self.parameters[param]
169
                if info.get('description'):
170
                    param_info['description'] = info['description']
171
                if 'type' in info:
172
                    typ = info['type']
173
                    if typ == 'int':
174
                        param_info['type'] = 'integer'
175
                    elif typ == 'bool':
176
                        param_info['type'] = 'boolean'
177
                    else:
178
                        param_info['type'] = typ
179
                elif 'example_value' in info:
180
                    typ = type_to_str(info['example_value'])
181
                    if typ:
182
                        param_info['type'] = typ
160 183
            if param in defaults:
161 184
                param_info['optional'] = True
162 185
                param_info['default_value'] = defaults[param]
186
                if 'type' not in param_info:
187
                    typ = type_to_str(defaults[param])
188
                    if typ:
189
                        param_info['type'] = typ
163 190
            params.append(param_info)
164 191
        return params
passerelle/views.py
318 318
                continue
319 319
            if not d.get(key):
320 320
                d[key] = other_params[key]
321
        if self.endpoint.endpoint_info.parameters:
321
        for parameter_info in self.endpoint.endpoint_info.get_params():
322 322
            # check and convert parameter values
323
            for parameter, parameter_info in self.endpoint.endpoint_info.parameters.items():
324
                if parameter not in d:
325
                    continue
326
                if parameter_info.get('type') == 'bool':
327
                    if d[parameter].lower() in ('true', 'on'):
328
                        d[parameter] = True
329
                    elif d[parameter].lower() in ('false', 'off'):
330
                        d[parameter] = False
331
                    else:
332
                        raise InvalidParameterValue(parameter)
333
                elif parameter_info.get('type') == 'int':
334
                    try:
335
                        d[parameter] = int(d[parameter])
336
                    except ValueError:
337
                        raise InvalidParameterValue(parameter)
338
                elif parameter_info.get('type') == 'float':
339
                    d[parameter] = d[parameter].replace(',', '.')
340
                    try:
341
                        d[parameter] = float(d[parameter])
342
                    except ValueError:
343
                        raise InvalidParameterValue(parameter)
323
            parameter = parameter_info['name']
324
            if parameter not in d:
325
                continue
326
            if parameter_info.get('type') in ('bool', 'boolean'):
327
                if d[parameter].lower() in ('true', 'on'):
328
                    d[parameter] = True
329
                elif d[parameter].lower() in ('false', 'off'):
330
                    d[parameter] = False
331
                else:
332
                    raise InvalidParameterValue(parameter)
333
            elif parameter_info.get('type') in ('int', 'integer'):
334
                try:
335
                    d[parameter] = int(d[parameter])
336
                except ValueError:
337
                    raise InvalidParameterValue(parameter)
338
            elif parameter_info.get('type') == 'float':
339
                d[parameter] = d[parameter].replace(',', '.')
340
                try:
341
                    d[parameter] = float(d[parameter])
342
                except ValueError:
343
                    raise InvalidParameterValue(parameter)
344 344

  
345 345
        if request.method == 'POST' and self.endpoint.endpoint_info.post:
346 346
            request_body = self.endpoint.endpoint_info.post.get('request_body', {})
347
-