Default and Hard Limits on dbapi

This commit is contained in:
Andrew Melton 2013-04-08 16:53:59 -04:00
parent b563adb521
commit 265512bcd6
2 changed files with 38 additions and 10 deletions

View File

@ -36,6 +36,10 @@ from stacktach import models
from stacktach import utils
DEFAULT_LIMIT = 50
HARD_LIMIT = 1000
class APIException(Exception):
def __init__(self, message="Internal Server Error"):
self.status = 500
@ -269,16 +273,15 @@ def get_db_objects(klass, request, default_order_by, direction='asc',
order_by = '-%s' % order_by
offset = request.GET.get('offset')
limit = request.GET.get('limit')
limit = request.GET.get('limit', DEFAULT_LIMIT)
if limit > HARD_LIMIT:
limit = HARD_LIMIT
if offset:
start = int(offset)
else:
start = None
offset = 0
if limit:
end = int(offset) + int(limit)
else:
end = None
end = int(offset) + int(limit)
return objects.order_by(order_by)[start:end]

View File

@ -140,7 +140,8 @@ class DBAPITestCase(unittest.TestCase):
result = self.mox.CreateMockAnything()
fake_model.objects.all().AndReturn(result)
result.order_by('id').AndReturn(result)
result.__getitem__(slice(None, None, None)).AndReturn(result)
s = slice(None, dbapi.DEFAULT_LIMIT, None)
result.__getitem__(s).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id')
@ -160,7 +161,8 @@ class DBAPITestCase(unittest.TestCase):
result = self.mox.CreateMockAnything()
fake_model.objects.all().AndReturn(result)
result.order_by('-id').AndReturn(result)
result.__getitem__(slice(None, None, None)).AndReturn(result)
s = slice(None, dbapi.DEFAULT_LIMIT, None)
result.__getitem__(s).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id')
@ -188,6 +190,27 @@ class DBAPITestCase(unittest.TestCase):
self.mox.VerifyAll()
def test_get_db_objects_hard_limit(self):
fake_model = self.make_fake_model()
fake_request = self.mox.CreateMockAnything()
fake_request.GET = {'limit': dbapi.HARD_LIMIT + 1}
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
dbapi._get_filter_args(fake_model, fake_request,
custom_filters=None).AndReturn({})
self.mox.StubOutWithMock(dbapi, '_check_has_field')
dbapi._check_has_field(fake_model, 'id')
result = self.mox.CreateMockAnything()
fake_model.objects.all().AndReturn(result)
result.order_by('id').AndReturn(result)
s = slice(None, dbapi.HARD_LIMIT, None)
result.__getitem__(s).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id')
self.assertEquals(query_result, result)
self.mox.VerifyAll()
def test_get_db_objects_offset(self):
fake_model = self.make_fake_model()
fake_request = self.mox.CreateMockAnything()
@ -200,7 +223,7 @@ class DBAPITestCase(unittest.TestCase):
result = self.mox.CreateMockAnything()
fake_model.objects.all().AndReturn(result)
result.order_by('id').AndReturn(result)
result.__getitem__(slice(1, None, None)).AndReturn(result)
result.__getslice__(1, dbapi.DEFAULT_LIMIT + 1).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id')
@ -241,7 +264,8 @@ class DBAPITestCase(unittest.TestCase):
result = self.mox.CreateMockAnything()
fake_model.objects.filter(**filters).AndReturn(result)
result.order_by('id').AndReturn(result)
result.__getitem__(slice(None, None, None)).AndReturn(result)
s = slice(None, dbapi.DEFAULT_LIMIT, None)
result.__getitem__(s).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id')
@ -266,7 +290,8 @@ class DBAPITestCase(unittest.TestCase):
all_filters.update(custom_filters['raw'])
fake_model.objects.filter(**all_filters).AndReturn(result)
result.order_by('id').AndReturn(result)
result.__getitem__(slice(None, None, None)).AndReturn(result)
s = slice(None, dbapi.DEFAULT_LIMIT, None)
result.__getitem__(s).AndReturn(result)
self.mox.ReplayAll()
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id',