aboutsummaryrefslogtreecommitdiff
path: root/app/handlers/base.py
diff options
context:
space:
mode:
authorMilo Casagrande <milo.casagrande@linaro.org>2014-11-18 17:18:45 +0100
committerMilo Casagrande <milo.casagrande@linaro.org>2014-11-18 17:18:45 +0100
commite953be3567146c12286b8df751290dd573caaad3 (patch)
tree7fc4e671b1be14de2df0ebfff3478691741a6a96 /app/handlers/base.py
parent8d45412b1135c0fbea72d4ec296daad7dd57f2c9 (diff)
base: Fix base handler for mongodb ID.
Change-Id: I0de6595af9ae2445780312980943240ae84864db
Diffstat (limited to 'app/handlers/base.py')
-rw-r--r--app/handlers/base.py89
1 files changed, 49 insertions, 40 deletions
diff --git a/app/handlers/base.py b/app/handlers/base.py
index cd0d55c..d0b0c93 100644
--- a/app/handlers/base.py
+++ b/app/handlers/base.py
@@ -18,15 +18,14 @@ try:
except ImportError:
import json
+import bson
import functools
import httplib
import tornado
import tornado.web
-from bson.json_util import default
-
-import handlers.common as handc
-import handlers.response as handr
+import handlers.common as hcommon
+import handlers.response as hresponse
import models
import utils
import utils.db
@@ -39,7 +38,7 @@ STATUS_MESSAGES = {
405: 'Operation not allowed',
415: (
'Please use "%s" as the default media type' %
- handc.ACCEPTED_CONTENT_TYPE
+ hcommon.ACCEPTED_CONTENT_TYPE
),
420: 'No JSON data found',
500: 'Internal database error',
@@ -99,7 +98,7 @@ class BaseHandler(tornado.web.RequestHandler):
@staticmethod
def _token_validation_func():
- return handc.valid_token_general
+ return hcommon.valid_token_general
def _get_status_message(self, status_code):
"""Get custom error message based on the status code.
@@ -126,12 +125,13 @@ class BaseHandler(tornado.web.RequestHandler):
headers = {}
result = {}
- if isinstance(response, handr.HandlerResponse):
+ if isinstance(response, hresponse.HandlerResponse):
status_code = response.status_code
reason = response.reason or self._get_status_message(status_code)
headers = response.headers
result = json.dumps(
- response.to_dict(), default=default, ensure_ascii=False
+ response.to_dict(),
+ default=bson.json_util.default, ensure_ascii=False
)
else:
status_code = 506
@@ -140,7 +140,7 @@ class BaseHandler(tornado.web.RequestHandler):
self.set_status(status_code=status_code, reason=reason)
self.write(result)
- self.set_header('Content-Type', handc.DEFAULT_RESPONSE_TYPE)
+ self.set_header('Content-Type', hcommon.DEFAULT_RESPONSE_TYPE)
if headers:
for key, val in headers.iteritems():
@@ -159,7 +159,7 @@ class BaseHandler(tornado.web.RequestHandler):
if 'Content-Type' in self.request.headers.keys():
if self.request.headers['Content-Type'] == \
- handc.ACCEPTED_CONTENT_TYPE:
+ hcommon.ACCEPTED_CONTENT_TYPE:
valid_content = True
else:
self.log.error(
@@ -203,7 +203,7 @@ class BaseHandler(tornado.web.RequestHandler):
kwargs['reason'] = j_reason
response = self._post(*args, **kwargs)
else:
- response = handr.HandlerResponse(400)
+ response = hresponse.HandlerResponse(400)
if j_reason:
response.reason = (
"Provided JSON is not valid: %s" % j_reason
@@ -215,16 +215,16 @@ class BaseHandler(tornado.web.RequestHandler):
self.log.exception(ex)
error = "No JSON data found in the POST request"
self.log.error(error)
- response = handr.HandlerResponse(422)
+ response = hresponse.HandlerResponse(422)
response.reason = error
response.result = None
else:
- response = handr.HandlerResponse(valid_request)
+ response = hresponse.HandlerResponse(valid_request)
response.reason = self._get_status_message(valid_request)
response.result = None
else:
- response = handr.HandlerResponse(403)
- response.reason = handc.NOT_VALID_TOKEN
+ response = hresponse.HandlerResponse(403)
+ response.reason = hcommon.NOT_VALID_TOKEN
return response
@@ -256,7 +256,7 @@ class BaseHandler(tornado.web.RequestHandler):
:return A `HandlerResponse` object.
"""
- return handr.HandlerResponse(501)
+ return hresponse.HandlerResponse(501)
@tornado.web.asynchronous
def delete(self, *args, **kwargs):
@@ -280,12 +280,12 @@ class BaseHandler(tornado.web.RequestHandler):
if kwargs and kwargs.get('id', None):
response = self._delete(kwargs['id'])
else:
- response = handr.HandlerResponse(400)
+ response = hresponse.HandlerResponse(400)
response.reason = self._get_status_message(400)
response.result = None
else:
- response = handr.HandlerResponse(403)
- response.status = handc.NOT_VALID_TOKEN
+ response = hresponse.HandlerResponse(403)
+ response.status = hcommon.NOT_VALID_TOKEN
return response
@@ -301,7 +301,7 @@ class BaseHandler(tornado.web.RequestHandler):
:param doc_id: The ID of the documento to delete.
:return A `HandlerResponse` object.
"""
- return handr.HandlerResponse(501)
+ return hresponse.HandlerResponse(501)
@tornado.web.asynchronous
def get(self, *args, **kwargs):
@@ -328,8 +328,8 @@ class BaseHandler(tornado.web.RequestHandler):
else:
response = self._get(**kwargs)
else:
- response = handr.HandlerResponse(403)
- response.reason = handc.NOT_VALID_TOKEN
+ response = hresponse.HandlerResponse(403)
+ response.reason = hcommon.NOT_VALID_TOKEN
return response
@@ -343,20 +343,29 @@ class BaseHandler(tornado.web.RequestHandler):
:return A `HandlerResponse` object.
"""
- response = handr.HandlerResponse()
- result = utils.db.find_one(
- self.collection,
- doc_id,
- fields=handc.get_query_fields(self.get_query_arguments)
- )
+ response = hresponse.HandlerResponse()
+ result = None
- if result:
- # result here is returned as a dictionary from mongodb
- response.result = result
- else:
- response.status_code = 404
- response.reason = "Resource '%s' not found" % doc_id
- response.result = None
+ try:
+ obj_id = bson.objectid.ObjectId(doc_id)
+ result = utils.db.find_one(
+ self.collection,
+ [obj_id],
+ fields=hcommon.get_query_fields(self.get_query_arguments)
+ )
+
+ if result:
+ # result here is returned as a dictionary from mongodb
+ response.result = result
+ else:
+ response.status_code = 404
+ response.reason = "Resource '%s' not found" % doc_id
+ response.result = None
+ except bson.errors.InvalidId, ex:
+ self.log.exception(ex)
+ self.log.error("Provided doc ID '%s' is not valid", doc_id)
+ response.status_code = 400
+ response.status = "Wrong ID value provided"
return response
@@ -372,7 +381,7 @@ class BaseHandler(tornado.web.RequestHandler):
:return A `HandlerResponse` object.
"""
- response = handr.HandlerResponse()
+ response = hresponse.HandlerResponse()
spec, sort, fields, skip, limit, unique = self._get_query_args()
if unique:
@@ -423,7 +432,7 @@ class BaseHandler(tornado.web.RequestHandler):
if self.request.arguments:
spec, sort, fields, skip, limit, unique = \
- handc.get_all_query_values(
+ hcommon.get_all_query_values(
self.get_query_arguments, self._valid_keys(method)
)
@@ -451,9 +460,9 @@ class BaseHandler(tornado.web.RequestHandler):
"""
valid_token = False
- req_token = self.request.headers.get(handc.API_TOKEN_HEADER, None)
+ req_token = self.request.headers.get(hcommon.API_TOKEN_HEADER, None)
remote_ip = self.request.remote_ip
- master_key = self.settings.get(handc.MASTER_KEY, None)
+ master_key = self.settings.get(hcommon.MASTER_KEY, None)
if req_token:
valid_token = self._token_validation(
@@ -473,7 +482,7 @@ class BaseHandler(tornado.web.RequestHandler):
token_obj = self._find_token(req_token, self.db)
if token_obj:
- valid_token = handc.validate_token(
+ valid_token = hcommon.validate_token(
token_obj,
method,
remote_ip,