Fixed #23891 -- Moved deprecation of IPAddressField to system check framework.

Thanks Markus Holtermann for review.
This commit is contained in:
Tim Graham 2014-12-30 15:45:03 -05:00
parent a7aaabfaf1
commit 40a8504357
11 changed files with 51 additions and 30 deletions

View File

@ -334,6 +334,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
command.execute(
stdin=sentinel,
stdout=six.StringIO(),
stderr=six.StringIO(),
interactive=False,
verbosity=0,
username='janet',
@ -344,6 +345,7 @@ class CreatesuperuserManagementCommandTestCase(TestCase):
command = createsuperuser.Command()
command.execute(
stdout=six.StringIO(),
stderr=six.StringIO(),
interactive=False,
verbosity=0,
username='joe',

View File

@ -20,7 +20,6 @@ from django import forms
from django.core import exceptions, validators, checks
from django.utils.datastructures import DictWrapper
from django.utils.dateparse import parse_date, parse_datetime, parse_time, parse_duration
from django.utils.deprecation import RemovedInDjango19Warning
from django.utils.duration import duration_string
from django.utils.functional import cached_property, curry, total_ordering, Promise
from django.utils.text import capfirst
@ -1836,8 +1835,6 @@ class IPAddressField(Field):
description = _("IPv4 address")
def __init__(self, *args, **kwargs):
warnings.warn("IPAddressField has been deprecated. Use GenericIPAddressField instead.",
RemovedInDjango19Warning)
kwargs['max_length'] = 15
super(IPAddressField, self).__init__(*args, **kwargs)
@ -1860,6 +1857,19 @@ class IPAddressField(Field):
defaults.update(kwargs)
return super(IPAddressField, self).formfield(**defaults)
def check(self, **kwargs):
errors = super(IPAddressField, self).check(**kwargs)
errors.append(
checks.Warning(
'IPAddressField has been deprecated. Support for it '
'(except in historical migrations) will be removed in Django 1.9.',
hint='Use GenericIPAddressField instead.',
obj=self,
id='fields.W900',
)
)
return errors
class GenericIPAddressField(Field):
empty_strings_allowed = True

View File

@ -159,7 +159,8 @@ details on these changes.
is loaded. In particular, it won't be possible to import models inside
the root package of their application.
* The model and form ``IPAddressField`` will be removed.
* The model and form ``IPAddressField`` will be removed. A stub field will
remain for compatibility with historical migrations.
* ``AppCommand.handle_app()`` will no longer be supported.

View File

@ -95,6 +95,8 @@ Fields
* **fields.E160**: The options ``auto_now``, ``auto_now_add``, and ``default``
are mutually exclusive. Only one of these options may be present.
* **fields.W161**: Fixed default value provided.
* **fields.W900**: ``IPAddressField`` has been deprecated. Support for it
(except in historical migrations) will be removed in Django 1.9.
File Fields
~~~~~~~~~~~

View File

@ -192,3 +192,8 @@ Bugfixes
* Prevented a crash on apps without migrations when running ``migrate --list``
(:ticket:`23366`).
* The deprecation of ``IPAddressField`` is now handled through the system
check framework (with error code ``fields.W900``) so that deprecation
warnings aren't displayed if the field only appears in historical migrations
(:ticket:`23891`).

View File

@ -9,7 +9,8 @@ from django.forms import (
ModelMultipleChoiceField, MultipleChoiceField, RegexField,
SplitDateTimeField, TimeField, URLField, utils, ValidationError,
)
from django.test import TestCase
from django.test import ignore_warnings, TestCase
from django.utils.deprecation import RemovedInDjango19Warning
from django.utils.safestring import mark_safe
from django.utils.encoding import python_2_unicode_compatible
@ -196,6 +197,7 @@ class FormsErrorMessagesTestCase(TestCase, AssertFormErrorsMixin):
self.assertFormErrors(['REQUIRED'], f.clean, '')
self.assertFormErrors(['INVALID DATE', 'INVALID TIME'], f.clean, ['a', 'b'])
@ignore_warnings(category=RemovedInDjango19Warning)
def test_ipaddressfield(self):
e = {
'required': 'REQUIRED',

View File

@ -11,10 +11,11 @@ from django.forms import (
)
from django.forms.extras import SelectDateWidget
from django.forms.utils import ErrorList
from django.test import TestCase, override_settings
from django.test import TestCase, ignore_warnings, override_settings
from django.utils import six
from django.utils import translation
from django.utils.dates import MONTHS_AP
from django.utils.deprecation import RemovedInDjango19Warning
from django.utils.encoding import force_text, smart_text, python_2_unicode_compatible
from .test_error_messages import AssertFormErrorsMixin
@ -482,6 +483,7 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
self.assertEqual(f.cleaned_data['field1'], 'some text,JP,2007-04-25 06:24:00')
@ignore_warnings(category=RemovedInDjango19Warning)
def test_ipaddress(self):
f = IPAddressField()
self.assertFormErrors(['This field is required.'], f.clean, '')

View File

@ -1,10 +1,7 @@
# -*- encoding: utf-8 -*-
from __future__ import unicode_literals
import warnings
from django.db import models
from django.utils.deprecation import RemovedInDjango19Warning
class People(models.Model):
@ -62,8 +59,6 @@ class ColumnTypes(models.Model):
file_path_field = models.FilePathField()
float_field = models.FloatField()
int_field = models.IntegerField()
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=RemovedInDjango19Warning)
ip_address_field = models.IPAddressField()
gen_ip_adress_field = models.GenericIPAddressField(protocol="ipv4")
pos_int_field = models.PositiveIntegerField()

View File

@ -20,7 +20,6 @@ from django.db.models.fields import (
from django.db.models.fields.files import FileField, ImageField
from django.utils import six
from django.utils.functional import lazy
from django.test.utils import override_settings
from .models import (
Foo, Bar, Whiz, BigD, BigS, BigIntegerModel, Post, NullBooleanModel,
@ -182,11 +181,11 @@ class ForeignKeyTests(test.TestCase):
fk_model_empty = FkToChar.objects.select_related('out').get(id=fk_model_empty.pk)
self.assertEqual(fk_model_empty.out, char_model_empty)
@override_settings(INSTALLED_APPS=['django.contrib.auth', 'django.contrib.contenttypes', 'model_fields'])
def test_warning_when_unique_true_on_fk(self):
class FKUniqueTrue(models.Model):
fk_field = models.ForeignKey(Foo, unique=True)
model = FKUniqueTrue()
expected_warnings = [
checks.Warning(
'Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.',
@ -195,7 +194,7 @@ class ForeignKeyTests(test.TestCase):
id='fields.W342',
)
]
warnings = checks.run_checks()
warnings = model.check()
self.assertEqual(warnings, expected_warnings)
def test_related_name_converted_to_text(self):
@ -799,7 +798,6 @@ class PromiseTest(test.TestCase):
int)
def test_IPAddressField(self):
# Deprecation silenced in runtests.py
lazy_func = lazy(lambda: '127.0.0.1', six.text_type)
self.assertIsInstance(
IPAddressField().get_prep_value(lazy_func()),
@ -809,6 +807,22 @@ class PromiseTest(test.TestCase):
IPAddressField().get_prep_value(lazy_func()),
six.text_type)
def test_IPAddressField_deprecated(self):
class IPAddressModel(models.Model):
ip = IPAddressField()
model = IPAddressModel()
self.assertEqual(
model.check(),
[checks.Warning(
'IPAddressField has been deprecated. Support for it '
'(except in historical migrations) will be removed in Django 1.9.',
hint='Use GenericIPAddressField instead.',
obj=IPAddressModel._meta.get_field('ip'),
id='fields.W900',
)],
)
def test_GenericIPAddressField(self):
lazy_func = lazy(lambda: '127.0.0.1', six.text_type)
self.assertIsInstance(

View File

@ -246,11 +246,6 @@ def django_tests(verbosity, interactive, failfast, keepdb, reverse, test_labels)
'initial_data fixtures are deprecated. Use data migrations instead.',
RemovedInDjango19Warning
)
warnings.filterwarnings(
'ignore',
'IPAddressField has been deprecated. Use GenericIPAddressField instead.',
RemovedInDjango19Warning
)
failures = test_runner.run_tests(
test_labels or get_installed(), extra_tests=extra_tests)

View File

@ -4,14 +4,11 @@ A test spanning all the capabilities of all the serializers.
This class sets up a model for each model field type
(except for image types, because of the Pillow dependency).
"""
import warnings
from django.db import models
from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation
)
from django.contrib.contenttypes.models import ContentType
from django.utils.deprecation import RemovedInDjango19Warning
# The following classes are for testing basic data
# marshalling, including NULL values, where allowed.
@ -69,8 +66,6 @@ class BigIntegerData(models.Model):
class IPAddressData(models.Model):
with warnings.catch_warnings():
warnings.simplefilter("ignore", category=RemovedInDjango19Warning)
data = models.IPAddressField(null=True)
@ -251,8 +246,6 @@ class IntegerPKData(models.Model):
class IPAddressPKData(models.Model):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
data = models.IPAddressField(primary_key=True)