Replace marshmallow with jsonschema

Created a new schema that accepts request parameters for the
get_notifications v2 route.
Using that to validate now instead of the marshmallow validation.

Also changed the way formatted error messages are returned because
the previous way was cutting off our failing `enum` messages.
This commit is contained in:
Paul Craig
2016-11-28 14:22:51 +00:00
parent 9b1375ba84
commit ab990679b3
4 changed files with 68 additions and 7 deletions

View File

@@ -2,8 +2,9 @@ from flask import jsonify, request, url_for
from app import api_user
from app.dao import notifications_dao
from app.schemas import notifications_filter_schema
from app.schema_validation import validate
from app.v2.notifications import notification_blueprint
from app.v2.notifications.notification_schemas import get_notifications_request
@notification_blueprint.route("/<uuid:id>", methods=['GET'])
@@ -17,7 +18,12 @@ def get_notification_by_id(id):
@notification_blueprint.route("", methods=['GET'])
def get_notifications():
data = notifications_filter_schema.load(request.args).data
_data = request.args.to_dict(flat=False)
if 'older_than' in _data:
# flat=False makes everything a list, but we only ever allow one value for "older_than"
_data['older_than'] = _data['older_than'][0]
data = validate(_data, get_notifications_request)
paginated_notifications = notifications_dao.get_notifications_for_service(
str(api_user.service_id),
@@ -29,11 +35,11 @@ def get_notifications():
def _build_links(notifications):
_links = {
'current': url_for(".get_notifications", _external=True, **request.args.to_dict(flat=False)),
'current': url_for(".get_notifications", _external=True, **data),
}
if len(notifications):
next_query_params = dict(request.args.to_dict(flat=False), older_than=notifications[-1].id)
next_query_params = dict(data, older_than=notifications[-1].id)
_links['next'] = url_for(".get_notifications", _external=True, **next_query_params)
return _links

View File

@@ -1,3 +1,4 @@
from app.models import NOTIFICATION_STATUS_TYPES, TEMPLATE_TYPES
from app.schema_validation.definitions import (uuid, personalisation)
# this may belong in a templates module
@@ -72,6 +73,28 @@ get_notification_response = {
]
}
get_notifications_request = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "schema for query parameters allowed when getting list of notifications",
"type": "object",
"properties": {
"status": {
"type": "array",
"items": {
"enum": NOTIFICATION_STATUS_TYPES
}
},
"template_type": {
"type": "array",
"items": {
"enum": TEMPLATE_TYPES
}
},
"older_than": uuid
},
"additionalProperties": False,
}
get_notifications_response = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "GET list of notifications response schema",