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