Merge pull request #51 from ramielrowe/exists_recieved_filter
Adding received filter on exists api call
This commit is contained in:
commit
3b0766b378
@ -74,21 +74,44 @@ def get_usage_delete(request, delete_id):
|
|||||||
return {'delete': _get_model_by_id(models.InstanceDeletes, delete_id)}
|
return {'delete': _get_model_by_id(models.InstanceDeletes, delete_id)}
|
||||||
|
|
||||||
|
|
||||||
|
def _exists_extra_values(exist):
|
||||||
|
values = {'received': str(dt.dt_from_decimal(exist.raw.when))}
|
||||||
|
return values
|
||||||
|
|
||||||
|
|
||||||
@api_call
|
@api_call
|
||||||
def list_usage_exists(request):
|
def list_usage_exists(request):
|
||||||
objects = get_db_objects(models.InstanceExists, request, 'id')
|
try:
|
||||||
dicts = _convert_model_list(objects)
|
custom_filters = {}
|
||||||
|
if 'received_min' in request.GET:
|
||||||
|
received_min = request.GET['received_min']
|
||||||
|
custom_filters['received_min'] = {}
|
||||||
|
custom_filters['received_min']['raw__when__gte'] = \
|
||||||
|
utils.str_time_to_unix(received_min)
|
||||||
|
if 'received_max' in request.GET:
|
||||||
|
received_max = request.GET['received_max']
|
||||||
|
custom_filters['received_max'] = {}
|
||||||
|
custom_filters['received_max']['raw__when__lte'] = \
|
||||||
|
utils.str_time_to_unix(received_max)
|
||||||
|
except AttributeError:
|
||||||
|
msg = "Range filters must be dates."
|
||||||
|
raise BadRequestException(message=msg)
|
||||||
|
|
||||||
|
objects = get_db_objects(models.InstanceExists, request, 'id',
|
||||||
|
custom_filters=custom_filters)
|
||||||
|
dicts = _convert_model_list(objects, _exists_extra_values)
|
||||||
return {'exists': dicts}
|
return {'exists': dicts}
|
||||||
|
|
||||||
|
|
||||||
@api_call
|
@api_call
|
||||||
def get_usage_exist(request, exist_id):
|
def get_usage_exist(request, exist_id):
|
||||||
return {'exist': _get_model_by_id(models.InstanceExists, exist_id)}
|
return {'exist': _get_model_by_id(models.InstanceExists, exist_id,
|
||||||
|
_exists_extra_values)}
|
||||||
|
|
||||||
|
|
||||||
def _get_model_by_id(klass, model_id):
|
def _get_model_by_id(klass, model_id, extra_values_func=None):
|
||||||
model = get_object_or_404(klass, id=model_id)
|
model = get_object_or_404(klass, id=model_id)
|
||||||
model_dict = _convert_model(model)
|
model_dict = _convert_model(model, extra_values_func)
|
||||||
return model_dict
|
return model_dict
|
||||||
|
|
||||||
|
|
||||||
@ -100,7 +123,7 @@ def _check_has_field(klass, field_name):
|
|||||||
raise BadRequestException(msg)
|
raise BadRequestException(msg)
|
||||||
|
|
||||||
|
|
||||||
def _get_filter_args(klass, request):
|
def _get_filter_args(klass, request, custom_filters=None):
|
||||||
filter_args = {}
|
filter_args = {}
|
||||||
if 'instance' in request.GET:
|
if 'instance' in request.GET:
|
||||||
uuid = request.GET['instance']
|
uuid = request.GET['instance']
|
||||||
@ -110,12 +133,13 @@ def _get_filter_args(klass, request):
|
|||||||
raise BadRequestException(msg)
|
raise BadRequestException(msg)
|
||||||
|
|
||||||
for (key, value) in request.GET.items():
|
for (key, value) in request.GET.items():
|
||||||
|
if not custom_filters or key not in custom_filters:
|
||||||
if key.endswith('_min'):
|
if key.endswith('_min'):
|
||||||
k = key[0:-4]
|
k = key[0:-4]
|
||||||
_check_has_field(klass, k)
|
_check_has_field(klass, k)
|
||||||
try:
|
try:
|
||||||
filter_args['%s__gte' % k] = utils.str_time_to_unix(value)
|
filter_args['%s__gte' % k] = \
|
||||||
|
utils.str_time_to_unix(value)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
msg = "Range filters must be dates."
|
msg = "Range filters must be dates."
|
||||||
raise BadRequestException(message=msg)
|
raise BadRequestException(message=msg)
|
||||||
@ -123,7 +147,8 @@ def _get_filter_args(klass, request):
|
|||||||
k = key[0:-4]
|
k = key[0:-4]
|
||||||
_check_has_field(klass, k)
|
_check_has_field(klass, k)
|
||||||
try:
|
try:
|
||||||
filter_args['%s__lte' % k] = utils.str_time_to_unix(value)
|
filter_args['%s__lte' % k] = \
|
||||||
|
utils.str_time_to_unix(value)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
msg = "Range filters must be dates."
|
msg = "Range filters must be dates."
|
||||||
raise BadRequestException(message=msg)
|
raise BadRequestException(message=msg)
|
||||||
@ -131,8 +156,13 @@ def _get_filter_args(klass, request):
|
|||||||
return filter_args
|
return filter_args
|
||||||
|
|
||||||
|
|
||||||
def get_db_objects(klass, request, default_order_by, direction='asc'):
|
def get_db_objects(klass, request, default_order_by, direction='asc',
|
||||||
filter_args = _get_filter_args(klass, request)
|
custom_filters=None):
|
||||||
|
filter_args = _get_filter_args(klass, request,
|
||||||
|
custom_filters=custom_filters)
|
||||||
|
if custom_filters:
|
||||||
|
for key in custom_filters:
|
||||||
|
filter_args.update(custom_filters[key])
|
||||||
|
|
||||||
if len(filter_args) > 0:
|
if len(filter_args) > 0:
|
||||||
objects = klass.objects.filter(**filter_args)
|
objects = klass.objects.filter(**filter_args)
|
||||||
@ -160,17 +190,19 @@ def get_db_objects(klass, request, default_order_by, direction='asc'):
|
|||||||
return objects.order_by(order_by)[start:end]
|
return objects.order_by(order_by)[start:end]
|
||||||
|
|
||||||
|
|
||||||
def _convert_model(model):
|
def _convert_model(model, extra_values_func=None):
|
||||||
model_dict = model_to_dict(model)
|
model_dict = model_to_dict(model)
|
||||||
for key in model_dict:
|
for key in model_dict:
|
||||||
if isinstance(model_dict[key], decimal.Decimal):
|
if isinstance(model_dict[key], decimal.Decimal):
|
||||||
model_dict[key] = str(dt.dt_from_decimal(model_dict[key]))
|
model_dict[key] = str(dt.dt_from_decimal(model_dict[key]))
|
||||||
|
if extra_values_func:
|
||||||
|
model_dict.update(extra_values_func(model))
|
||||||
return model_dict
|
return model_dict
|
||||||
|
|
||||||
|
|
||||||
def _convert_model_list(model_list):
|
def _convert_model_list(model_list, extra_values_func=None):
|
||||||
converted = []
|
converted = []
|
||||||
for item in model_list:
|
for item in model_list:
|
||||||
converted.append(_convert_model(item))
|
converted.append(_convert_model(item, extra_values_func))
|
||||||
|
|
||||||
return converted
|
return converted
|
||||||
|
@ -5,6 +5,8 @@ from django.db.models import FieldDoesNotExist
|
|||||||
import mox
|
import mox
|
||||||
|
|
||||||
from stacktach import dbapi
|
from stacktach import dbapi
|
||||||
|
from stacktach import models
|
||||||
|
from stacktach import utils as stacktach_utils
|
||||||
import utils
|
import utils
|
||||||
from utils import INSTANCE_ID_1
|
from utils import INSTANCE_ID_1
|
||||||
|
|
||||||
@ -101,7 +103,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {}
|
fake_request.GET = {}
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn({})
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn({})
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -120,7 +123,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'direction': 'desc'}
|
fake_request.GET = {'direction': 'desc'}
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn({})
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn({})
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -139,7 +143,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'limit': 1}
|
fake_request.GET = {'limit': 1}
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn({})
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn({})
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -158,7 +163,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'offset': 1}
|
fake_request.GET = {'offset': 1}
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn({})
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn({})
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -177,7 +183,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'offset': 2, 'limit': 2}
|
fake_request.GET = {'offset': 2, 'limit': 2}
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn({})
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn({})
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -197,7 +204,8 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
filters = {'instance': INSTANCE_ID_1}
|
filters = {'instance': INSTANCE_ID_1}
|
||||||
fake_request.GET = filters
|
fake_request.GET = filters
|
||||||
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
dbapi._get_filter_args(fake_model, fake_request).AndReturn(filters)
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=None).AndReturn(filters)
|
||||||
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
dbapi._check_has_field(fake_model, 'id')
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
result = self.mox.CreateMockAnything()
|
result = self.mox.CreateMockAnything()
|
||||||
@ -210,3 +218,93 @@ class DBAPITestCase(unittest.TestCase):
|
|||||||
self.assertEquals(query_result, result)
|
self.assertEquals(query_result, result)
|
||||||
|
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_db_objects_with_custom_filter(self):
|
||||||
|
fake_model = self.make_fake_model()
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
filters = {'instance': INSTANCE_ID_1}
|
||||||
|
custom_filters = {'raw': {'raw__id': 1}}
|
||||||
|
fake_request.GET = filters
|
||||||
|
self.mox.StubOutWithMock(dbapi, '_get_filter_args')
|
||||||
|
dbapi._get_filter_args(fake_model, fake_request,
|
||||||
|
custom_filters=custom_filters).AndReturn(filters)
|
||||||
|
self.mox.StubOutWithMock(dbapi, '_check_has_field')
|
||||||
|
dbapi._check_has_field(fake_model, 'id')
|
||||||
|
result = self.mox.CreateMockAnything()
|
||||||
|
all_filters = {}
|
||||||
|
all_filters.update(filters)
|
||||||
|
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)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
query_result = dbapi.get_db_objects(fake_model, fake_request, 'id',
|
||||||
|
custom_filters=custom_filters)
|
||||||
|
self.assertEquals(query_result, result)
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_list_usage_exists_no_custom_filters(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.GET = {}
|
||||||
|
self.mox.StubOutWithMock(dbapi, 'get_db_objects')
|
||||||
|
objects = self.mox.CreateMockAnything()
|
||||||
|
dbapi.get_db_objects(models.InstanceExists, fake_request, 'id',
|
||||||
|
custom_filters={}).AndReturn(objects)
|
||||||
|
self.mox.StubOutWithMock(dbapi, '_convert_model_list')
|
||||||
|
dbapi._convert_model_list(objects, dbapi._exists_extra_values)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
resp = dbapi.list_usage_exists(fake_request)
|
||||||
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_list_usage_exists_with_received_min(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
date = str(datetime.datetime.utcnow())
|
||||||
|
fake_request.GET = {'received_min': date}
|
||||||
|
self.mox.StubOutWithMock(dbapi, 'get_db_objects')
|
||||||
|
unix_date = stacktach_utils.str_time_to_unix(date)
|
||||||
|
custom_filters = {'received_min': {'raw__when__gte': unix_date}}
|
||||||
|
objects = self.mox.CreateMockAnything()
|
||||||
|
dbapi.get_db_objects(models.InstanceExists, fake_request, 'id',
|
||||||
|
custom_filters=custom_filters).AndReturn(objects)
|
||||||
|
self.mox.StubOutWithMock(dbapi, '_convert_model_list')
|
||||||
|
dbapi._convert_model_list(objects, dbapi._exists_extra_values)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
resp = dbapi.list_usage_exists(fake_request)
|
||||||
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_list_usage_exists_with_received_max(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
date = str(datetime.datetime.utcnow())
|
||||||
|
fake_request.GET = {'received_max': date}
|
||||||
|
self.mox.StubOutWithMock(dbapi, 'get_db_objects')
|
||||||
|
unix_date = stacktach_utils.str_time_to_unix(date)
|
||||||
|
custom_filters = {'received_max': {'raw__when__lte': unix_date}}
|
||||||
|
objects = self.mox.CreateMockAnything()
|
||||||
|
dbapi.get_db_objects(models.InstanceExists, fake_request, 'id',
|
||||||
|
custom_filters=custom_filters).AndReturn(objects)
|
||||||
|
self.mox.StubOutWithMock(dbapi, '_convert_model_list')
|
||||||
|
dbapi._convert_model_list(objects, dbapi._exists_extra_values)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
resp = dbapi.list_usage_exists(fake_request)
|
||||||
|
self.assertEqual(resp.status_code, 200)
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_list_usage_exists_with_bad_received_min(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.GET = {'received_min': 'obviouslybaddate'}
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
resp = dbapi.list_usage_exists(fake_request)
|
||||||
|
self.assertEqual(resp.status_code, 400)
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_list_usage_exists_with_bad_received_max(self):
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.GET = {'received_max': 'obviouslybaddate'}
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
resp = dbapi.list_usage_exists(fake_request)
|
||||||
|
self.assertEqual(resp.status_code, 400)
|
||||||
|
self.mox.VerifyAll()
|
Loading…
x
Reference in New Issue
Block a user