Fixed #11118 -- Made management command BaseCommand restore locale after execution.

Thanks rvdrijst for the report and initial patch and Claude Paroz for enhancing it.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17077 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Ramiro Morales 2011-11-07 11:28:31 +00:00
parent 90d3697417
commit e92b3b723f
2 changed files with 12 additions and 1 deletions

View File

@ -203,9 +203,11 @@ class BaseCommand(object):
# like permissions, and those shouldn't contain any translations. # like permissions, and those shouldn't contain any translations.
# But only do this if we can assume we have a working settings file, # But only do this if we can assume we have a working settings file,
# because django.utils.translation requires settings. # because django.utils.translation requires settings.
saved_lang = None
if self.can_import_settings: if self.can_import_settings:
try: try:
from django.utils import translation from django.utils import translation
saved_lang = translation.get_language()
translation.activate('en-us') translation.activate('en-us')
except ImportError, e: except ImportError, e:
# If settings should be available, but aren't, # If settings should be available, but aren't,
@ -232,6 +234,8 @@ class BaseCommand(object):
except CommandError, e: except CommandError, e:
self.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e))) self.stderr.write(smart_str(self.style.ERROR('Error: %s\n' % e)))
sys.exit(1) sys.exit(1)
if saved_lang is not None:
translation.activate(saved_lang)
def validate(self, app=None, display_num_errors=False): def validate(self, app=None, display_num_errors=False):
""" """

View File

@ -3,6 +3,7 @@ from StringIO import StringIO
from django.core import management from django.core import management
from django.core.management.base import CommandError from django.core.management.base import CommandError
from django.test import TestCase from django.test import TestCase
from django.utils import translation
class CommandTests(TestCase): class CommandTests(TestCase):
@ -18,5 +19,11 @@ class CommandTests(TestCase):
self.assertEqual(out.getvalue(), self.assertEqual(out.getvalue(),
"I don't feel like dancing Jive.") "I don't feel like dancing Jive.")
def test_language_preserved(self):
out = StringIO()
with translation.override('fr'):
management.call_command('dance', stdout=out)
self.assertEqual(translation.get_language(), 'fr')
def test_explode(self): def test_explode(self):
self.assertRaises(CommandError, management.call_command, ('explode',)) self.assertRaises(CommandError, management.call_command, ('explode',))