diff --git a/django/contrib/auth/tests/test_management.py b/django/contrib/auth/tests/test_management.py index 72d61a0919..0c039bd0ec 100644 --- a/django/contrib/auth/tests/test_management.py +++ b/django/contrib/auth/tests/test_management.py @@ -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', diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index bc7bbc1a30..0b6d4cd929 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -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 diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index 70db0c0497..14422c3cc8 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -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. diff --git a/docs/ref/checks.txt b/docs/ref/checks.txt index 03e74ecd1a..b519b0afab 100644 --- a/docs/ref/checks.txt +++ b/docs/ref/checks.txt @@ -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 ~~~~~~~~~~~ diff --git a/docs/releases/1.7.2.txt b/docs/releases/1.7.2.txt index 3b614ed7ab..3df4bc7364 100644 --- a/docs/releases/1.7.2.txt +++ b/docs/releases/1.7.2.txt @@ -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`). diff --git a/tests/forms_tests/tests/test_error_messages.py b/tests/forms_tests/tests/test_error_messages.py index dce1165657..798f11ba1a 100644 --- a/tests/forms_tests/tests/test_error_messages.py +++ b/tests/forms_tests/tests/test_error_messages.py @@ -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', diff --git a/tests/forms_tests/tests/test_extra.py b/tests/forms_tests/tests/test_extra.py index ad84670daa..d172e17cd9 100644 --- a/tests/forms_tests/tests/test_extra.py +++ b/tests/forms_tests/tests/test_extra.py @@ -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, '') diff --git a/tests/inspectdb/models.py b/tests/inspectdb/models.py index 925215fdbf..9cc0a196a5 100644 --- a/tests/inspectdb/models.py +++ b/tests/inspectdb/models.py @@ -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,9 +59,7 @@ 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() + ip_address_field = models.IPAddressField() gen_ip_adress_field = models.GenericIPAddressField(protocol="ipv4") pos_int_field = models.PositiveIntegerField() pos_small_int_field = models.PositiveSmallIntegerField() diff --git a/tests/model_fields/tests.py b/tests/model_fields/tests.py index 50a381cb8e..e63cc007dd 100644 --- a/tests/model_fields/tests.py +++ b/tests/model_fields/tests.py @@ -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( diff --git a/tests/runtests.py b/tests/runtests.py index 8875a07036..6ff5421772 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -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) diff --git a/tests/serializers_regress/models.py b/tests/serializers_regress/models.py index e03101ca89..49b84501bf 100644 --- a/tests/serializers_regress/models.py +++ b/tests/serializers_regress/models.py @@ -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,9 +66,7 @@ class BigIntegerData(models.Model): class IPAddressData(models.Model): - with warnings.catch_warnings(): - warnings.simplefilter("ignore", category=RemovedInDjango19Warning) - data = models.IPAddressField(null=True) + data = models.IPAddressField(null=True) class GenericIPAddressData(models.Model): @@ -251,9 +246,7 @@ 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) + data = models.IPAddressField(primary_key=True) class GenericIPAddressPKData(models.Model):