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

Thanks raymond at adaptiv.nl for the report.
This commit is contained in:
Nick Sandford 2014-07-23 04:01:55 +01:00 committed by Tim Graham
parent 8c30df15f1
commit fa3cf006b2
3 changed files with 40 additions and 1 deletions

View File

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

View File

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

View File

@ -1,16 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import sys
from django.apps.registry import Apps, apps from django.apps.registry import Apps, apps
from django.contrib.contenttypes.fields import ( from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation GenericForeignKey, GenericRelation
) )
from django.contrib.contenttypes import management
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core import checks from django.core import checks
from django.db import connections, models, router from django.db import connections, models, router
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.encoding import force_str from django.utils.encoding import force_str
from django.utils.six import StringIO
from .models import Author, Article, SchemeIncludedURL from .models import Author, Article, SchemeIncludedURL
@ -358,6 +362,40 @@ class GenericRelationshipTests(IsolatedModelsTestCase):
self.assertEqual(errors, expected) 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): class TestRouter(object):
def db_for_read(self, model, **hints): def db_for_read(self, model, **hints):
return 'other' return 'other'