2
0
Эх сурвалжийг харах

Fixed #23078 -- Regression in update_contenttypes() interactivity.

Thanks raymond at adaptiv.nl for the report.
Nick Sandford 10 жил өмнө
parent
commit
fa3cf006b2

+ 1 - 0
AUTHORS

@@ -541,6 +541,7 @@ answer newbie questions, and generally made Django that much better:
     Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
     Vinay Sajip <vinay_sajip@yahoo.co.uk>
     Bartolome Sanchez Salado <i42sasab@uco.es>
+    Nick Sandford <nick.sandford@gmail.com>
     Mark Sandstrom <mark@deliciouslynerdy.com>
     Kadesarin Sanjek
     Tim Saylor <tim.saylor@gmail.com>

+ 1 - 1
django/contrib/contenttypes/management.py

@@ -60,7 +60,7 @@ def update_contenttypes(app_config, verbosity=2, interactive=True, using=DEFAULT
 
     # Confirm that the content type is stale before deletion.
     if to_remove:
-        if kwargs.get('interactive', False):
+        if interactive:
             content_type_display = '\n'.join(
                 '    %s | %s' % (ct.app_label, ct.model)
                 for ct in to_remove

+ 38 - 0
tests/contenttypes_tests/tests.py

@@ -1,16 +1,20 @@
 # -*- coding: utf-8 -*-
 from __future__ import absolute_import, unicode_literals
 
+import sys
+
 from django.apps.registry import Apps, apps
 from django.contrib.contenttypes.fields import (
     GenericForeignKey, GenericRelation
 )
+from django.contrib.contenttypes import management
 from django.contrib.contenttypes.models import ContentType
 from django.core import checks
 from django.db import connections, models, router
 from django.test import TestCase
 from django.test.utils import override_settings
 from django.utils.encoding import force_str
+from django.utils.six import StringIO
 
 from .models import Author, Article, SchemeIncludedURL
 
@@ -358,6 +362,40 @@ class GenericRelationshipTests(IsolatedModelsTestCase):
         self.assertEqual(errors, expected)
 
 
+class UpdateContentTypesTests(TestCase):
+    def setUp(self):
+        self.before_count = ContentType.objects.count()
+        ContentType.objects.create(name='fake', app_label='contenttypes_tests', model='Fake')
+        self.app_config = apps.get_app_config('contenttypes_tests')
+
+    def test_interactive_true(self):
+        """
+        interactive mode of update_contenttypes() (the default) should delete
+        stale contenttypes.
+        """
+        self.old_stdout = sys.stdout
+        sys.stdout = StringIO()
+        management.input = lambda x: force_str("yes")
+        management.update_contenttypes(self.app_config)
+        output = sys.stdout.getvalue()
+        sys.stdout = self.old_stdout
+        self.assertIn("Deleting stale content type", output)
+        self.assertEqual(ContentType.objects.count(), self.before_count)
+
+    def test_interactive_false(self):
+        """
+        non-interactive mode of update_contenttypes() shouldn't delete stale
+        content types.
+        """
+        self.old_stdout = sys.stdout
+        sys.stdout = StringIO()
+        management.update_contenttypes(self.app_config, interactive=False)
+        output = sys.stdout.getvalue()
+        sys.stdout = self.old_stdout
+        self.assertIn("Stale content types remain.", output)
+        self.assertEqual(ContentType.objects.count(), self.before_count + 1)
+
+
 class TestRouter(object):
     def db_for_read(self, model, **hints):
         return 'other'