Skip to content

Commit 480b6b9

Browse files
authored
Merge pull request #148 from Hipo/fix-range-field
Fix dict object does not have isempty attribute error
2 parents 1a00711 + 3c00ebc commit 480b6b9

File tree

3 files changed

+90
-9
lines changed

3 files changed

+90
-9
lines changed

drf_extra_fields/fields.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,23 @@ def to_representation(self, value):
221221
"""
222222
Range instances -> dicts of primitive datatypes.
223223
"""
224-
if value.isempty:
225-
return {'empty': True}
226-
lower = self.child.to_representation(value.lower) if value.lower is not None else None
227-
upper = self.child.to_representation(value.upper) if value.upper is not None else None
228-
return {'lower': lower,
229-
'upper': upper,
230-
'bounds': value._bounds}
224+
if isinstance(value, dict):
225+
if not value:
226+
return value
227+
228+
lower = value.get("lower")
229+
upper = value.get("upper")
230+
bounds = value.get("bounds")
231+
else:
232+
if value.isempty:
233+
return {'empty': True}
234+
lower = value.lower
235+
upper = value.upper
236+
bounds = value._bounds
237+
238+
return {'lower': self.child.to_representation(lower) if lower is not None else None,
239+
'upper': self.child.to_representation(upper) if upper is not None else None,
240+
'bounds': bounds}
231241

232242
def get_initial(self):
233243
initial = super().get_initial()

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
setup(
1111
name='drf-extra-fields',
12-
version='3.0.3',
12+
version='3.0.4',
1313
packages=['drf_extra_fields',
1414
'drf_extra_fields.runtests'],
1515
include_package_data=True,

tests/test_fields.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import django
55
import imghdr
66
import os
7+
from decimal import Decimal
78

89
import pytest
910
import pytz
@@ -445,6 +446,7 @@ class FieldValues:
445446
"""
446447
Base class for testing valid and invalid input values.
447448
"""
449+
448450
def test_valid_inputs(self):
449451
"""
450452
Ensure that valid values return the expected validated data.
@@ -479,7 +481,6 @@ class TestIntegerRangeField(FieldValues):
479481
Values for `ListField` with CharField as child.
480482
"""
481483
serializer_class = IntegerRangeSerializer
482-
483484
valid_inputs = [
484485
({'lower': '1', 'upper': 2, 'bounds': '[)'},
485486
NumericRange(**{'lower': 1, 'upper': 2, 'bounds': '[)'})),
@@ -504,6 +505,15 @@ class TestIntegerRangeField(FieldValues):
504505
{'lower': 1, 'upper': 2, 'bounds': '[)'}),
505506
(NumericRange(**{'empty': True}), {'empty': True}),
506507
(NumericRange(), {'bounds': '[)', 'lower': None, 'upper': None}),
508+
({'lower': '1', 'upper': 2, 'bounds': '[)'},
509+
{'lower': 1, 'upper': 2, 'bounds': '[)'}),
510+
({'lower': 1, 'upper': 2},
511+
{'lower': 1, 'upper': 2, 'bounds': None}),
512+
({'lower': 1},
513+
{'lower': 1, 'upper': None, 'bounds': None}),
514+
({'upper': 1},
515+
{'lower': None, 'upper': 1, 'bounds': None}),
516+
({}, {}),
507517
]
508518
field = IntegerRangeField()
509519

@@ -543,6 +553,15 @@ class TestDecimalRangeField(FieldValues):
543553
{'lower': '1.1', 'upper': '2', 'bounds': '[)'}),
544554
(NumericRange(**{'empty': True}), {'empty': True}),
545555
(NumericRange(), {'bounds': '[)', 'lower': None, 'upper': None}),
556+
({'lower': Decimal('1.1'), 'upper': "2.3", 'bounds': '[)'},
557+
{'lower': "1.1", 'upper': "2.3", 'bounds': '[)'}),
558+
({'lower': Decimal('1.1'), 'upper': "2.3"},
559+
{'lower': "1.1", 'upper': "2.3", 'bounds': None}),
560+
({'lower': 1},
561+
{'lower': "1", 'upper': None, 'bounds': None}),
562+
({'upper': 1},
563+
{'lower': None, 'upper': "1", 'bounds': None}),
564+
({}, {}),
546565
]
547566
field = DecimalRangeField()
548567

@@ -585,6 +604,15 @@ class TestDecimalRangeFieldWithChildAttribute(FieldValues):
585604
{'lower': '1.10', 'upper': '2.00', 'bounds': '[)'}),
586605
(NumericRange(**{'empty': True}), {'empty': True}),
587606
(NumericRange(), {'bounds': '[)', 'lower': None, 'upper': None}),
607+
({'lower': Decimal('1.1'), 'upper': "2.3", 'bounds': '[)'},
608+
{'lower': "1.10", 'upper': "2.30", 'bounds': '[)'}),
609+
({'lower': Decimal('1.1'), 'upper': "2.3"},
610+
{'lower': "1.10", 'upper': "2.30", 'bounds': None}),
611+
({'lower': 1},
612+
{'lower': "1.00", 'upper': None, 'bounds': None}),
613+
({'upper': 1},
614+
{'lower': None, 'upper': "1.00", 'bounds': None}),
615+
({}, {}),
588616
]
589617

590618

@@ -619,6 +647,15 @@ class TestFloatRangeField(FieldValues):
619647
{'lower': 1.1, 'upper': 2, 'bounds': '[)'}),
620648
(NumericRange(**{'empty': True}), {'empty': True}),
621649
(NumericRange(), {'bounds': '[)', 'lower': None, 'upper': None}),
650+
({'lower': '1', 'upper': 2., 'bounds': '[)'},
651+
{'lower': 1., 'upper': 2., 'bounds': '[)'}),
652+
({'lower': 1., 'upper': 2.},
653+
{'lower': 1, 'upper': 2, 'bounds': None}),
654+
({'lower': 1},
655+
{'lower': 1, 'upper': None, 'bounds': None}),
656+
({'upper': 1},
657+
{'lower': None, 'upper': 1, 'bounds': None}),
658+
({}, {}),
622659
]
623660
field = FloatRangeField()
624661

@@ -681,6 +718,23 @@ class TestDateTimeRangeField(TestCase, FieldValues):
681718
{'empty': True}),
682719
(DateTimeTZRange(),
683720
{'bounds': '[)', 'lower': None, 'upper': None}),
721+
({'lower': '2001-01-01T13:00:00Z',
722+
'upper': '2001-02-02T13:00:00Z',
723+
'bounds': '[)'},
724+
{'lower': '2001-01-01T13:00:00Z',
725+
'upper': '2001-02-02T13:00:00Z',
726+
'bounds': '[)'}),
727+
({'lower': datetime.datetime(2001, 1, 1, 13, 00, tzinfo=pytz.utc),
728+
'upper': datetime.datetime(2001, 2, 2, 13, 00, tzinfo=pytz.utc),
729+
'bounds': '[)'},
730+
{'lower': '2001-01-01T13:00:00Z',
731+
'upper': '2001-02-02T13:00:00Z',
732+
'bounds': '[)'}),
733+
({'upper': '2001-02-02T13:00:00Z', 'bounds': '[)'},
734+
{'lower': None, 'upper': '2001-02-02T13:00:00Z', 'bounds': '[)'}),
735+
({'lower': '2001-01-01T13:00:00Z', 'bounds': '[)'},
736+
{'lower': '2001-01-01T13:00:00Z', 'upper': None, 'bounds': '[)'}),
737+
({}, {}),
684738
]
685739
field = DateTimeRangeField()
686740

@@ -741,6 +795,23 @@ class TestDateRangeField(FieldValues):
741795
(DateRange(**{'empty': True}),
742796
{'empty': True}),
743797
(DateRange(), {'bounds': '[)', 'lower': None, 'upper': None}),
798+
({'lower': '2001-01-01',
799+
'upper': '2001-02-02',
800+
'bounds': '[)'},
801+
{'lower': '2001-01-01',
802+
'upper': '2001-02-02',
803+
'bounds': '[)'}),
804+
({'lower': datetime.date(2001, 1, 1),
805+
'upper': datetime.date(2001, 2, 2),
806+
'bounds': '[)'},
807+
{'lower': '2001-01-01',
808+
'upper': '2001-02-02',
809+
'bounds': '[)'}),
810+
({'upper': '2001-02-02', 'bounds': '[)'},
811+
{'lower': None, 'upper': '2001-02-02', 'bounds': '[)'}),
812+
({'lower': '2001-01-01', 'bounds': '[)'},
813+
{'lower': '2001-01-01', 'upper': None, 'bounds': '[)'}),
814+
({}, {}),
744815
]
745816
field = DateRangeField()
746817

0 commit comments

Comments
 (0)