소스 검색

Fixed #24841 -- Made BaseRangeField.prepare_value() call base_field's prepare_value()

Villiers Strauss 9 년 전
부모
커밋
614bec41b5
3개의 변경된 파일20개의 추가작업 그리고 4개의 파일을 삭제
  1. 9 2
      django/contrib/postgres/forms/ranges.py
  2. 2 1
      docs/releases/1.8.3.txt
  3. 9 1
      tests/postgres_tests/test_ranges.py

+ 9 - 2
django/contrib/postgres/forms/ranges.py

@@ -22,10 +22,17 @@ class BaseRangeField(forms.MultiValueField):
         super(BaseRangeField, self).__init__(**kwargs)
 
     def prepare_value(self, value):
+        lower_base, upper_base = self.fields
         if isinstance(value, self.range_type):
-            return [value.lower, value.upper]
+            return [
+                lower_base.prepare_value(value.lower),
+                upper_base.prepare_value(value.upper),
+            ]
         if value is None:
-            return [None, None]
+            return [
+                lower_base.prepare_value(None),
+                upper_base.prepare_value(None),
+            ]
         return value
 
     def compress(self, values):

+ 2 - 1
docs/releases/1.8.3.txt

@@ -9,4 +9,5 @@ Django 1.8.3 fixes several bugs in 1.8.2.
 Bugfixes
 ========
 
-* ...
+* Fixed ``BaseRangeField.prepare_value()`` to use each ``base_field``’s
+  ``prepare_value()`` method (:ticket:`24841`).

+ 9 - 1
tests/postgres_tests/test_ranges.py

@@ -5,7 +5,7 @@ import unittest
 from django import forms
 from django.core import exceptions, serializers
 from django.db import connection
-from django.test import TestCase
+from django.test import TestCase, override_settings
 from django.utils import timezone
 
 from . import PostgresSQLTestCase
@@ -474,6 +474,14 @@ class TestFormField(PostgresSQLTestCase):
         value = field.clean(['2013-04-09 11:45', ''])
         self.assertEqual(value, DateTimeTZRange(datetime.datetime(2013, 4, 9, 11, 45), None))
 
+    @override_settings(USE_TZ=True, TIME_ZONE='Africa/Johannesburg')
+    def test_datetime_prepare_value(self):
+        field = pg_forms.DateTimeRangeField()
+        value = field.prepare_value(
+            DateTimeTZRange(datetime.datetime(2015, 5, 22, 16, 6, 33, tzinfo=timezone.utc), None)
+        )
+        self.assertEqual(value, [datetime.datetime(2015, 5, 22, 18, 6, 33), None])
+
     def test_model_field_formfield_integer(self):
         model_field = pg_fields.IntegerRangeField()
         form_field = model_field.formfield()