93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
from functools import wraps
|
|
from flask import request
|
|
import jsonschema
|
|
from api.models.market import iter_markets
|
|
|
|
|
|
class ValidationError(Exception):
|
|
|
|
def __init__(self, message):
|
|
Exception.__init__(self)
|
|
self.message = message
|
|
|
|
|
|
def _check_parameter_exists(param):
|
|
if not param in request.args:
|
|
raise ValidationError('No {} is specified'.format(param))
|
|
|
|
|
|
def _is_number(s):
|
|
try:
|
|
float(s)
|
|
return True
|
|
except ValueError:
|
|
return False
|
|
|
|
|
|
def validate_jsonschema(schema):
|
|
def decorator(f):
|
|
@wraps(f)
|
|
def wrapper(*args, **kwargs):
|
|
if not request.json:
|
|
raise ValidationError('Payload is not valid json')
|
|
try:
|
|
j = request.json
|
|
jsonschema.validate(j, schema)
|
|
except jsonschema.ValidationError as e:
|
|
raise ValidationError(e.message)
|
|
except jsonschema.SchemaError as e:
|
|
raise ValidationError(e.message)
|
|
return f(*args, **kwargs)
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def validate_exists(*keys):
|
|
def decorator(f):
|
|
@wraps(f)
|
|
def wrapper(*args, **kwargs):
|
|
for key in keys:
|
|
_check_parameter_exists(key)
|
|
if not key in request.args:
|
|
raise ValidationError('No {} is specified'.format(key))
|
|
return f(*args, **kwargs)
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def validate_number(*keys):
|
|
def decorator(f):
|
|
@wraps(f)
|
|
def wrapper(*args, **kwargs):
|
|
for key in keys:
|
|
_check_parameter_exists(key)
|
|
value = request.args.get(key)
|
|
if not _is_number(value):
|
|
raise ValidationError('{} is not a number'.format(key))
|
|
return f(*args, **kwargs)
|
|
return wrapper
|
|
return decorator
|
|
|
|
|
|
def validate_territory(*keys):
|
|
def decorator(f):
|
|
@wraps(f)
|
|
def wrapper(*args, **kwargs):
|
|
for key in keys:
|
|
if not key in request.args:
|
|
raise ValidationError('No {} is specified'.format(key))
|
|
value = request.args.get(key)
|
|
valid = False
|
|
for market in iter_markets():
|
|
if market.territory == value:
|
|
valid = True
|
|
break
|
|
|
|
if not valid:
|
|
raise ValidationError(
|
|
'{} is not a valid territory'.format(value))
|
|
|
|
return f(*args, **kwargs)
|
|
return wrapper
|
|
return decorator
|