Validating model has range field
This commit is contained in:
parent
e125aab2e1
commit
4931704070
@ -2,6 +2,7 @@ import decimal
|
|||||||
import functools
|
import functools
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from django.db.models import FieldDoesNotExist
|
||||||
from django.forms.models import model_to_dict
|
from django.forms.models import model_to_dict
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.http import HttpResponseBadRequest
|
from django.http import HttpResponseBadRequest
|
||||||
@ -51,7 +52,7 @@ def api_call(func):
|
|||||||
|
|
||||||
@api_call
|
@api_call
|
||||||
def list_usage_launches(request):
|
def list_usage_launches(request):
|
||||||
filter_args = _get_filter_args(request)
|
filter_args = _get_filter_args(models.InstanceUsage, request)
|
||||||
|
|
||||||
if len(filter_args) > 0:
|
if len(filter_args) > 0:
|
||||||
objects = models.InstanceUsage.objects.filter(**filter_args)
|
objects = models.InstanceUsage.objects.filter(**filter_args)
|
||||||
@ -69,7 +70,7 @@ def get_usage_launch(request, launch_id):
|
|||||||
|
|
||||||
@api_call
|
@api_call
|
||||||
def list_usage_deletes(request):
|
def list_usage_deletes(request):
|
||||||
filter_args = _get_filter_args(request)
|
filter_args = _get_filter_args(models.InstanceDeletes, request)
|
||||||
|
|
||||||
if len(filter_args) > 0:
|
if len(filter_args) > 0:
|
||||||
objects = models.InstanceDeletes.objects.filter(**filter_args)
|
objects = models.InstanceDeletes.objects.filter(**filter_args)
|
||||||
@ -87,7 +88,7 @@ def get_usage_delete(request, delete_id):
|
|||||||
|
|
||||||
@api_call
|
@api_call
|
||||||
def list_usage_exists(request):
|
def list_usage_exists(request):
|
||||||
filter_args = _get_filter_args(request)
|
filter_args = _get_filter_args(models.InstanceExists, request)
|
||||||
|
|
||||||
if len(filter_args) > 0:
|
if len(filter_args) > 0:
|
||||||
objects = models.InstanceExists.objects.filter(**filter_args)
|
objects = models.InstanceExists.objects.filter(**filter_args)
|
||||||
@ -109,7 +110,15 @@ def _get_model_by_id(klass, model_id):
|
|||||||
return model_dict
|
return model_dict
|
||||||
|
|
||||||
|
|
||||||
def _get_filter_args(request):
|
def _check_has_field(klass, field_name):
|
||||||
|
try:
|
||||||
|
klass._meta.get_field_by_name(field_name)
|
||||||
|
except FieldDoesNotExist:
|
||||||
|
msg = "No such field '%s'." % field_name
|
||||||
|
raise BadRequestException(msg)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_filter_args(klass, request):
|
||||||
filter_args = {}
|
filter_args = {}
|
||||||
if 'instance' in request.GET:
|
if 'instance' in request.GET:
|
||||||
filter_args['instance'] = request.GET['instance']
|
filter_args['instance'] = request.GET['instance']
|
||||||
@ -118,6 +127,7 @@ def _get_filter_args(request):
|
|||||||
|
|
||||||
if key.endswith('_min'):
|
if key.endswith('_min'):
|
||||||
k = key[0:-4]
|
k = key[0:-4]
|
||||||
|
_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:
|
||||||
@ -125,6 +135,7 @@ def _get_filter_args(request):
|
|||||||
raise BadRequestException(message=msg)
|
raise BadRequestException(message=msg)
|
||||||
elif key.endswith('_max'):
|
elif key.endswith('_max'):
|
||||||
k = key[0:-4]
|
k = key[0:-4]
|
||||||
|
_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:
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
from django.db.models import FieldDoesNotExist
|
||||||
import mox
|
import mox
|
||||||
|
|
||||||
from stacktach import dbapi
|
from stacktach import dbapi
|
||||||
@ -15,18 +16,27 @@ class StacktachRawParsingTestCase(unittest.TestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.mox.UnsetStubs()
|
self.mox.UnsetStubs()
|
||||||
|
|
||||||
|
def make_fake_model(self):
|
||||||
|
fake_model = self.mox.CreateMockAnything()
|
||||||
|
fake_meta = self.mox.CreateMockAnything()
|
||||||
|
fake_model._meta = fake_meta
|
||||||
|
return fake_model
|
||||||
|
|
||||||
def test_get_filter_args(self):
|
def test_get_filter_args(self):
|
||||||
start_time = datetime.datetime.utcnow()
|
start_time = datetime.datetime.utcnow()
|
||||||
start_decimal = utils.decimal_utc(start_time)
|
start_decimal = utils.decimal_utc(start_time)
|
||||||
end_time = start_time + datetime.timedelta(days=1)
|
end_time = start_time + datetime.timedelta(days=1)
|
||||||
end_decimal = utils.decimal_utc(end_time)
|
end_decimal = utils.decimal_utc(end_time)
|
||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_model = self.make_fake_model()
|
||||||
|
fake_model._meta.get_field_by_name('launched_at')
|
||||||
|
fake_model._meta.get_field_by_name('launched_at')
|
||||||
fake_request.GET = {'instance': INSTANCE_ID_1,
|
fake_request.GET = {'instance': INSTANCE_ID_1,
|
||||||
'launched_at_min': str(start_time),
|
'launched_at_min': str(start_time),
|
||||||
'launched_at_max': str(end_time)}
|
'launched_at_max': str(end_time)}
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
filter_args = dbapi._get_filter_args(fake_request)
|
filter_args = dbapi._get_filter_args(fake_model, fake_request)
|
||||||
|
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
self.assertEquals(filter_args['instance'], INSTANCE_ID_1)
|
self.assertEquals(filter_args['instance'], INSTANCE_ID_1)
|
||||||
@ -38,19 +48,37 @@ class StacktachRawParsingTestCase(unittest.TestCase):
|
|||||||
def test_get_filter_args_bad_min_value(self):
|
def test_get_filter_args_bad_min_value(self):
|
||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'launched_at_min': 'obviouslybaddatetime'}
|
fake_request.GET = {'launched_at_min': 'obviouslybaddatetime'}
|
||||||
|
fake_model = self.make_fake_model()
|
||||||
|
fake_model._meta.get_field_by_name('launched_at')
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(dbapi.BadRequestException, dbapi._get_filter_args,
|
self.assertRaises(dbapi.BadRequestException, dbapi._get_filter_args,
|
||||||
fake_request)
|
fake_model, fake_request)
|
||||||
|
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
def test_get_filter_args_bad_max_value(self):
|
def test_get_filter_args_bad_max_value(self):
|
||||||
fake_request = self.mox.CreateMockAnything()
|
fake_request = self.mox.CreateMockAnything()
|
||||||
fake_request.GET = {'launched_at_max': 'obviouslybaddatetime'}
|
fake_request.GET = {'launched_at_max': 'obviouslybaddatetime'}
|
||||||
|
fake_model = self.make_fake_model()
|
||||||
|
fake_model._meta.get_field_by_name('launched_at')
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
self.assertRaises(dbapi.BadRequestException, dbapi._get_filter_args,
|
self.assertRaises(dbapi.BadRequestException, dbapi._get_filter_args,
|
||||||
fake_request)
|
fake_model, fake_request)
|
||||||
|
|
||||||
|
self.mox.VerifyAll()
|
||||||
|
|
||||||
|
def test_get_filter_args_bad_range_key(self):
|
||||||
|
start_time = datetime.datetime.utcnow()
|
||||||
|
fake_request = self.mox.CreateMockAnything()
|
||||||
|
fake_request.GET = {'somebadfield_max': str(start_time)}
|
||||||
|
fake_model = self.make_fake_model()
|
||||||
|
fake_model._meta.get_field_by_name('somebadfield')\
|
||||||
|
.AndRaise(FieldDoesNotExist())
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
|
||||||
|
self.assertRaises(dbapi.BadRequestException, dbapi._get_filter_args,
|
||||||
|
fake_model, fake_request)
|
||||||
|
|
||||||
self.mox.VerifyAll()
|
self.mox.VerifyAll()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user