|
@@ -1,11 +1,13 @@
|
|
|
import datetime
|
|
|
import json
|
|
|
+from decimal import Decimal
|
|
|
|
|
|
from django import forms
|
|
|
from django.core import exceptions, serializers
|
|
|
from django.db.models import DateField, DateTimeField, F, Func, Value
|
|
|
-from django.test import override_settings
|
|
|
+from django.test import ignore_warnings, override_settings
|
|
|
from django.utils import timezone
|
|
|
+from django.utils.deprecation import RemovedInDjango31Warning
|
|
|
|
|
|
from . import PostgreSQLTestCase
|
|
|
from .models import RangeLookupsModel, RangesModel
|
|
@@ -27,7 +29,7 @@ class TestSaveLoad(PostgreSQLTestCase):
|
|
|
instance = RangesModel(
|
|
|
ints=NumericRange(0, 10),
|
|
|
bigints=NumericRange(10, 20),
|
|
|
- floats=NumericRange(20, 30),
|
|
|
+ decimals=NumericRange(20, 30),
|
|
|
timestamps=DateTimeTZRange(now - datetime.timedelta(hours=1), now),
|
|
|
dates=DateRange(now.date() - datetime.timedelta(days=1), now.date()),
|
|
|
)
|
|
@@ -35,7 +37,7 @@ class TestSaveLoad(PostgreSQLTestCase):
|
|
|
loaded = RangesModel.objects.get()
|
|
|
self.assertEqual(instance.ints, loaded.ints)
|
|
|
self.assertEqual(instance.bigints, loaded.bigints)
|
|
|
- self.assertEqual(instance.floats, loaded.floats)
|
|
|
+ self.assertEqual(instance.decimals, loaded.decimals)
|
|
|
self.assertEqual(instance.timestamps, loaded.timestamps)
|
|
|
self.assertEqual(instance.dates, loaded.dates)
|
|
|
|
|
@@ -54,18 +56,18 @@ class TestSaveLoad(PostgreSQLTestCase):
|
|
|
|
|
|
def test_range_object_boundaries(self):
|
|
|
r = NumericRange(0, 10, '[]')
|
|
|
- instance = RangesModel(floats=r)
|
|
|
+ instance = RangesModel(decimals=r)
|
|
|
instance.save()
|
|
|
loaded = RangesModel.objects.get()
|
|
|
- self.assertEqual(r, loaded.floats)
|
|
|
- self.assertIn(10, loaded.floats)
|
|
|
+ self.assertEqual(r, loaded.decimals)
|
|
|
+ self.assertIn(10, loaded.decimals)
|
|
|
|
|
|
def test_unbounded(self):
|
|
|
r = NumericRange(None, None, '()')
|
|
|
- instance = RangesModel(floats=r)
|
|
|
+ instance = RangesModel(decimals=r)
|
|
|
instance.save()
|
|
|
loaded = RangesModel.objects.get()
|
|
|
- self.assertEqual(r, loaded.floats)
|
|
|
+ self.assertEqual(r, loaded.decimals)
|
|
|
|
|
|
def test_empty(self):
|
|
|
r = NumericRange(empty=True)
|
|
@@ -331,13 +333,13 @@ class TestQueryingWithRanges(PostgreSQLTestCase):
|
|
|
)
|
|
|
|
|
|
def test_f_ranges(self):
|
|
|
- parent = RangesModel.objects.create(floats=NumericRange(0, 10))
|
|
|
+ parent = RangesModel.objects.create(decimals=NumericRange(0, 10))
|
|
|
objs = [
|
|
|
RangeLookupsModel.objects.create(float=5, parent=parent),
|
|
|
RangeLookupsModel.objects.create(float=99, parent=parent),
|
|
|
]
|
|
|
self.assertSequenceEqual(
|
|
|
- RangeLookupsModel.objects.filter(float__contained_by=F('parent__floats')),
|
|
|
+ RangeLookupsModel.objects.filter(float__contained_by=F('parent__decimals')),
|
|
|
[objs[0]]
|
|
|
)
|
|
|
|
|
@@ -356,7 +358,7 @@ class TestQueryingWithRanges(PostgreSQLTestCase):
|
|
|
class TestSerialization(PostgreSQLTestCase):
|
|
|
test_data = (
|
|
|
'[{"fields": {"ints": "{\\"upper\\": \\"10\\", \\"lower\\": \\"0\\", '
|
|
|
- '\\"bounds\\": \\"[)\\"}", "floats": "{\\"empty\\": true}", '
|
|
|
+ '\\"bounds\\": \\"[)\\"}", "decimals": "{\\"empty\\": true}", '
|
|
|
'"bigints": null, "timestamps": "{\\"upper\\": \\"2014-02-02T12:12:12+00:00\\", '
|
|
|
'\\"lower\\": \\"2014-01-01T00:00:00+00:00\\", \\"bounds\\": \\"[)\\"}", '
|
|
|
'"dates": "{\\"upper\\": \\"2014-02-02\\", \\"lower\\": \\"2014-01-01\\", \\"bounds\\": \\"[)\\"}" }, '
|
|
@@ -370,7 +372,7 @@ class TestSerialization(PostgreSQLTestCase):
|
|
|
|
|
|
def test_dumping(self):
|
|
|
instance = RangesModel(
|
|
|
- ints=NumericRange(0, 10), floats=NumericRange(empty=True),
|
|
|
+ ints=NumericRange(0, 10), decimals=NumericRange(empty=True),
|
|
|
timestamps=DateTimeTZRange(self.lower_dt, self.upper_dt),
|
|
|
dates=DateRange(self.lower_date, self.upper_date),
|
|
|
)
|
|
@@ -386,7 +388,7 @@ class TestSerialization(PostgreSQLTestCase):
|
|
|
def test_loading(self):
|
|
|
instance = list(serializers.deserialize('json', self.test_data))[0].object
|
|
|
self.assertEqual(instance.ints, NumericRange(0, 10))
|
|
|
- self.assertEqual(instance.floats, NumericRange(empty=True))
|
|
|
+ self.assertEqual(instance.decimals, NumericRange(empty=True))
|
|
|
self.assertIsNone(instance.bigints)
|
|
|
self.assertEqual(instance.dates, DateRange(self.lower_date, self.upper_date))
|
|
|
self.assertEqual(instance.timestamps, DateTimeTZRange(self.lower_dt, self.upper_dt))
|
|
@@ -435,11 +437,22 @@ class TestFormField(PostgreSQLTestCase):
|
|
|
value = field.clean(['1', '2'])
|
|
|
self.assertEqual(value, NumericRange(1, 2))
|
|
|
|
|
|
+ @ignore_warnings(category=RemovedInDjango31Warning)
|
|
|
def test_valid_floats(self):
|
|
|
field = pg_forms.FloatRangeField()
|
|
|
value = field.clean(['1.12345', '2.001'])
|
|
|
self.assertEqual(value, NumericRange(1.12345, 2.001))
|
|
|
|
|
|
+ def test_valid_decimal(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
+ value = field.clean(['1.12345', '2.001'])
|
|
|
+ self.assertEqual(value, NumericRange(Decimal('1.12345'), Decimal('2.001')))
|
|
|
+
|
|
|
+ def test_float_range_field_deprecation(self):
|
|
|
+ msg = 'FloatRangeField is deprecated in favor of DecimalRangeField.'
|
|
|
+ with self.assertRaisesMessage(RemovedInDjango31Warning, msg):
|
|
|
+ pg_forms.FloatRangeField()
|
|
|
+
|
|
|
def test_valid_timestamps(self):
|
|
|
field = pg_forms.DateTimeRangeField()
|
|
|
value = field.clean(['01/01/2014 00:00:00', '02/02/2014 12:12:12'])
|
|
@@ -544,44 +557,44 @@ class TestFormField(PostgreSQLTestCase):
|
|
|
value = field.clean([1, ''])
|
|
|
self.assertEqual(value, NumericRange(1, None))
|
|
|
|
|
|
- def test_float_lower_bound_higher(self):
|
|
|
- field = pg_forms.FloatRangeField()
|
|
|
+ def test_decimal_lower_bound_higher(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
with self.assertRaises(exceptions.ValidationError) as cm:
|
|
|
field.clean(['1.8', '1.6'])
|
|
|
self.assertEqual(cm.exception.messages[0], 'The start of the range must not exceed the end of the range.')
|
|
|
self.assertEqual(cm.exception.code, 'bound_ordering')
|
|
|
|
|
|
- def test_float_open(self):
|
|
|
- field = pg_forms.FloatRangeField()
|
|
|
+ def test_decimal_open(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
value = field.clean(['', '3.1415926'])
|
|
|
- self.assertEqual(value, NumericRange(None, 3.1415926))
|
|
|
+ self.assertEqual(value, NumericRange(None, Decimal('3.1415926')))
|
|
|
|
|
|
- def test_float_incorrect_data_type(self):
|
|
|
- field = pg_forms.FloatRangeField()
|
|
|
+ def test_decimal_incorrect_data_type(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
with self.assertRaises(exceptions.ValidationError) as cm:
|
|
|
field.clean('1.6')
|
|
|
self.assertEqual(cm.exception.messages[0], 'Enter two numbers.')
|
|
|
self.assertEqual(cm.exception.code, 'invalid')
|
|
|
|
|
|
- def test_float_invalid_lower(self):
|
|
|
- field = pg_forms.FloatRangeField()
|
|
|
+ def test_decimal_invalid_lower(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
with self.assertRaises(exceptions.ValidationError) as cm:
|
|
|
field.clean(['a', '3.1415926'])
|
|
|
self.assertEqual(cm.exception.messages[0], 'Enter a number.')
|
|
|
|
|
|
- def test_float_invalid_upper(self):
|
|
|
- field = pg_forms.FloatRangeField()
|
|
|
+ def test_decimal_invalid_upper(self):
|
|
|
+ field = pg_forms.DecimalRangeField()
|
|
|
with self.assertRaises(exceptions.ValidationError) as cm:
|
|
|
field.clean(['1.61803399', 'b'])
|
|
|
self.assertEqual(cm.exception.messages[0], 'Enter a number.')
|
|
|
|
|
|
- def test_float_required(self):
|
|
|
- field = pg_forms.FloatRangeField(required=True)
|
|
|
+ def test_decimal_required(self):
|
|
|
+ field = pg_forms.DecimalRangeField(required=True)
|
|
|
with self.assertRaises(exceptions.ValidationError) as cm:
|
|
|
field.clean(['', ''])
|
|
|
self.assertEqual(cm.exception.messages[0], 'This field is required.')
|
|
|
value = field.clean(['1.61803399', ''])
|
|
|
- self.assertEqual(value, NumericRange(1.61803399, None))
|
|
|
+ self.assertEqual(value, NumericRange(Decimal('1.61803399'), None))
|
|
|
|
|
|
def test_date_lower_bound_higher(self):
|
|
|
field = pg_forms.DateRangeField()
|
|
@@ -680,9 +693,9 @@ class TestFormField(PostgreSQLTestCase):
|
|
|
self.assertIsInstance(form_field, pg_forms.IntegerRangeField)
|
|
|
|
|
|
def test_model_field_formfield_float(self):
|
|
|
- model_field = pg_fields.FloatRangeField()
|
|
|
+ model_field = pg_fields.DecimalRangeField()
|
|
|
form_field = model_field.formfield()
|
|
|
- self.assertIsInstance(form_field, pg_forms.FloatRangeField)
|
|
|
+ self.assertIsInstance(form_field, pg_forms.DecimalRangeField)
|
|
|
|
|
|
def test_model_field_formfield_date(self):
|
|
|
model_field = pg_fields.DateRangeField()
|