Files
notifications-api/app/schema_validation/__init__.py
T

46 lines
1.5 KiB
Python
Raw Normal View History

import json
2016-11-09 14:56:54 +00:00
from jsonschema import (Draft4Validator, ValidationError, FormatChecker)
from notifications_utils.recipients import (validate_phone_number, validate_email_address, InvalidPhoneError,
InvalidEmailError)
def validate(json_to_validate, schema):
format_checker = FormatChecker()
@format_checker.checks('phone_number', raises=InvalidPhoneError)
def validate_schema_phone_number(instance):
2016-11-21 15:42:17 +00:00
if instance is not None:
validate_phone_number(instance)
return True
@format_checker.checks('email_address', raises=InvalidEmailError)
def validate_schema_email_address(instance):
2016-11-21 15:42:17 +00:00
if instance is not None:
validate_email_address(instance)
return True
validator = Draft4Validator(schema, format_checker=format_checker)
errors = list(validator.iter_errors(json_to_validate))
if errors.__len__() > 0:
raise ValidationError(build_error_message(errors))
return json_to_validate
def build_error_message(errors):
fields = []
for e in errors:
field = "{} {}".format(e.path[0], e.schema.get('validationMessage')) if e.schema.get(
'validationMessage') else __format_message(e)
fields.append({"error": "ValidationError", "message": field})
message = {
2016-11-02 14:58:39 +00:00
"status_code": 400,
2016-11-09 14:56:54 +00:00
"errors": fields
}
return json.dumps(message)
def __format_message(e):
2016-11-28 14:22:51 +00:00
return e.message.replace("'", "") if not e.cause else "{} {}".format(e.path[0], e.cause.message)