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:
Sybren A. Stüvel 2016-07-07 14:56:30 +02:00
parent be1deb7eb6
commit 251f5ac86a
2 changed files with 51 additions and 1 deletions

View File

@ -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
View 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)