diff options
| author | Marc Tamlyn <marc.tamlyn@gmail.com> | 2015-06-06 13:41:00 +0100 |
|---|---|---|
| committer | Marc Tamlyn <marc.tamlyn@gmail.com> | 2015-06-06 13:41:00 +0100 |
| commit | d58816bd6bf93a878085d35d3ed4609efeb0acfa (patch) | |
| tree | a5a42e635e677bed9645f0590f75cd72fa57f8f9 /django | |
| parent | 3fd754f12df42d173b6e9a93e7c32f8f5be55e7f (diff) | |
| parent | 8a842148b6deaab021526e2689279cf5e232945f (diff) | |
Merge pull request #4818 from dracos/24937-ranging-to-victory
Fixed #24937 -- fix serialization of Date(Time)RangeField.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/postgres/fields/array.py | 7 | ||||
| -rw-r--r-- | django/contrib/postgres/fields/ranges.py | 24 | ||||
| -rw-r--r-- | django/contrib/postgres/fields/utils.py | 3 |
3 files changed, 23 insertions, 11 deletions
diff --git a/django/contrib/postgres/fields/array.py b/django/contrib/postgres/fields/array.py index 9da7ec4cb7..f9242f086b 100644 --- a/django/contrib/postgres/fields/array.py +++ b/django/contrib/postgres/fields/array.py @@ -8,12 +8,9 @@ from django.db.models import Field, IntegerField, Transform from django.utils import six from django.utils.translation import string_concat, ugettext_lazy as _ -__all__ = ['ArrayField'] - +from .utils import AttributeSetter -class AttributeSetter(object): - def __init__(self, name, value): - setattr(self, name, value) +__all__ = ['ArrayField'] class ArrayField(Field): diff --git a/django/contrib/postgres/fields/ranges.py b/django/contrib/postgres/fields/ranges.py index 6e0f8e2284..13ba606c79 100644 --- a/django/contrib/postgres/fields/ranges.py +++ b/django/contrib/postgres/fields/ranges.py @@ -6,6 +6,8 @@ from django.contrib.postgres import forms, lookups from django.db import models from django.utils import six +from .utils import AttributeSetter + __all__ = [ 'RangeField', 'IntegerRangeField', 'BigIntegerRangeField', 'FloatRangeField', 'DateTimeRangeField', 'DateRangeField', @@ -26,22 +28,32 @@ class RangeField(models.Field): def to_python(self, value): if isinstance(value, six.string_types): - value = self.range_type(**json.loads(value)) + # Assume we're deserializing + vals = json.loads(value) + for end in ('lower', 'upper'): + if end in vals: + vals[end] = self.base_field.to_python(vals[end]) + value = self.range_type(**vals) elif isinstance(value, (list, tuple)): value = self.range_type(value[0], value[1]) return value + def set_attributes_from_name(self, name): + super(RangeField, self).set_attributes_from_name(name) + self.base_field.set_attributes_from_name(name) + def value_to_string(self, obj): value = self._get_val_from_obj(obj) if value is None: return None if value.isempty: return json.dumps({"empty": True}) - return json.dumps({ - "lower": value.lower, - "upper": value.upper, - "bounds": value._bounds, - }) + base_field = self.base_field + result = {"bounds": value._bounds} + for end in ('lower', 'upper'): + obj = AttributeSetter(base_field.attname, getattr(value, end)) + result[end] = base_field.value_to_string(obj) + return json.dumps(result) def formfield(self, **kwargs): kwargs.setdefault('form_class', self.form_field) diff --git a/django/contrib/postgres/fields/utils.py b/django/contrib/postgres/fields/utils.py new file mode 100644 index 0000000000..424a78f521 --- /dev/null +++ b/django/contrib/postgres/fields/utils.py @@ -0,0 +1,3 @@ +class AttributeSetter(object): + def __init__(self, name, value): + setattr(self, name, value) |
