Package coprs :: Package rest_api :: Module util
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.util

  1  # coding: utf-8 
  2  import json 
  3   
  4  import sqlalchemy.orm.exc 
  5   
  6  from flask_restful.reqparse import Argument, RequestParser 
  7   
  8  from marshmallow.exceptions import ValidationError 
  9  from .exceptions import ObjectNotFoundError, MalformedRequest 
 10  from .schemas import AllowedMethodSchema 
 11   
 12   
13 -class AllowedMethod(object):
14 - def __init__(self, method, doc, require_auth=True, params=None):
15 self.method = method 16 self.doc = doc 17 self.require_auth = require_auth 18 self.params = params or []
19 20
21 -def render_allowed_method(method, doc, require_auth=True, params=None):
22 method = AllowedMethod(method, doc, require_auth, params) 23 return mm_serialize_one(AllowedMethodSchema, method)
24 25
26 -def get_one_safe(query, msg=None, data=None):
27 """ 28 :type query: sqlalchemy.Query 29 :param str msg: message used in error when object not found 30 :param Any data: any serializable data to include into error 31 :raises ObjectNotFoundError: when query failed to return anything 32 """ 33 try: 34 return query.one() 35 except sqlalchemy.orm.exc.NoResultFound: 36 raise ObjectNotFoundError(msg=msg, data=data)
37 38
39 -def json_loads_safe(raw, data_on_error=None):
40 try: 41 return json.loads(raw) 42 except ValueError: 43 raise MalformedRequest(data_on_error or 44 "Failed to deserialize json string")
45 46
47 -def mm_deserialize(schema, json_string):
48 try: 49 return schema.loads(json_string) 50 except (ValueError, ValidationError) as err: 51 raise MalformedRequest( 52 msg="Failed to parse request: {}".format(err), 53 data={"request_string": json_string} 54 )
55
56 -def mm_serialize_one(schema, obj):
57 try: 58 return schema().dump(obj) 59 except ValidationError as err: 60 # This isn't correct behavior, but we used to ignore ValidationError 61 # before (e.g rhbz#1758559) and there's no desire to fix APIv2 when 62 # there's APIv3. 63 return err.valid_data
64 65
66 -class MyArg(Argument):
67 - def handle_validation_error(self, error, bundle_errors):
68 # dirty monkey patching, better to switch to webargs 69 # bundle errors are ignored 70 data = {u"error": str(error)} 71 if self.help: 72 data["help"] = self.help 73 raise MalformedRequest( 74 "Failed to validate query parameter: {}".format(self.name), 75 data=data 76 )
77 78
79 -def get_request_parser():
80 return RequestParser(argument_class=MyArg)
81 82
83 -def arg_bool(value):
84 """ 85 :param str value: value to convert 86 :rtype: bool 87 :raises ValueError: 88 """ 89 true_values = ["true", "yes", "1"] 90 false_values = ["false", "no", "0"] 91 value = str(value).strip().lower() 92 93 if value in true_values: 94 return True 95 elif value in false_values: 96 return False 97 98 raise ValueError("Value `{}` doesn't belong to either true of false sets. " 99 "Allowed values: {} and {}" 100 .format(value, true_values, false_values))
101