Added app.utils.str2id() to convert IDs on URLs to ObjectId.
Raises a BadRequest exception when the ID is malformed.
This commit is contained in:
parent
be1deb7eb6
commit
251f5ac86a
@ -4,9 +4,11 @@ import datetime
|
|||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import bson
|
import bson.objectid
|
||||||
from eve import RFC1123_DATE_FORMAT
|
from eve import RFC1123_DATE_FORMAT
|
||||||
from flask import current_app
|
from flask import current_app
|
||||||
|
from werkzeug import exceptions as wz_exceptions
|
||||||
|
|
||||||
|
|
||||||
__all__ = ('remove_private_keys', 'PillarJSONEncoder')
|
__all__ = ('remove_private_keys', 'PillarJSONEncoder')
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -80,3 +82,20 @@ def project_get_node_type(project_document, node_type_node_name):
|
|||||||
|
|
||||||
return next((node_type for node_type in project_document['node_types']
|
return next((node_type for node_type in project_document['node_types']
|
||||||
if node_type['name'] == node_type_node_name), None)
|
if node_type['name'] == node_type_node_name), None)
|
||||||
|
|
||||||
|
|
||||||
|
def str2id(document_id):
|
||||||
|
"""Returns the document ID as ObjectID, or raises a BadRequest exception.
|
||||||
|
|
||||||
|
:type document_id: str
|
||||||
|
:rtype: bson.ObjectId
|
||||||
|
:raises: wz_exceptions.BadRequest
|
||||||
|
"""
|
||||||
|
|
||||||
|
if not document_id:
|
||||||
|
raise wz_exceptions.BadRequest('Invalid object ID %r', document_id)
|
||||||
|
|
||||||
|
try:
|
||||||
|
return bson.ObjectId(document_id)
|
||||||
|
except bson.objectid.InvalidId:
|
||||||
|
raise wz_exceptions.BadRequest('Invalid object ID %r', document_id)
|
||||||
|
31
tests/test_utils.py
Normal file
31
tests/test_utils.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# -*- encoding: utf-8 -*-
|
||||||
|
|
||||||
|
from bson import ObjectId
|
||||||
|
from werkzeug.exceptions import BadRequest
|
||||||
|
|
||||||
|
from common_test_class import AbstractPillarTest
|
||||||
|
|
||||||
|
|
||||||
|
class Str2idTest(AbstractPillarTest):
|
||||||
|
def test_happy(self):
|
||||||
|
from application.utils import str2id
|
||||||
|
|
||||||
|
def happy(str_id):
|
||||||
|
self.assertEqual(ObjectId(str_id), str2id(str_id))
|
||||||
|
|
||||||
|
happy(24 * 'a')
|
||||||
|
happy(12 * 'a')
|
||||||
|
happy(u'577e23ad98377323f74c368c')
|
||||||
|
|
||||||
|
def test_unhappy(self):
|
||||||
|
from application.utils import str2id
|
||||||
|
|
||||||
|
def unhappy(str_id):
|
||||||
|
self.assertRaises(BadRequest, str2id, str_id)
|
||||||
|
|
||||||
|
unhappy(13 * 'a')
|
||||||
|
unhappy(u'577e23ad 8377323f74c368c')
|
||||||
|
unhappy(u'김치') # Kimchi
|
||||||
|
unhappy('')
|
||||||
|
unhappy(u'')
|
||||||
|
unhappy(None)
|
Loading…
x
Reference in New Issue
Block a user