فهرست منبع

Fixed #19745 -- Forced resolution of verbose names in createsupersuser

Thanks Baptiste Mispelon for the report and Preston Holmes for the review.
Claude Paroz 12 سال پیش
والد
کامیت
2390fe3f4f
2فایلهای تغییر یافته به همراه20 افزوده شده و 9 حذف شده
  1. 5 4
      django/contrib/auth/management/commands/createsuperuser.py
  2. 15 5
      django/contrib/auth/tests/basic.py

+ 5 - 4
django/contrib/auth/management/commands/createsuperuser.py

@@ -11,7 +11,7 @@ from django.contrib.auth.management import get_default_username
 from django.core import exceptions
 from django.core.management.base import BaseCommand, CommandError
 from django.db import DEFAULT_DB_ALIAS
-from django.utils.encoding import force_str
+from django.utils.encoding import force_str, force_text
 from django.utils.six.moves import input
 from django.utils.text import capfirst
 
@@ -80,9 +80,10 @@ class Command(BaseCommand):
             try:
 
                 # Get a username
+                verbose_field_name = force_text(self.username_field.verbose_name)
                 while username is None:
                     if not username:
-                        input_msg = capfirst(self.username_field.verbose_name)
+                        input_msg = capfirst(verbose_field_name)
                         if default_username:
                             input_msg = "%s (leave blank to use '%s')" % (
                                 input_msg, default_username)
@@ -102,14 +103,14 @@ class Command(BaseCommand):
                         pass
                     else:
                         self.stderr.write("Error: That %s is already taken." %
-                                self.username_field.verbose_name)
+                                verbose_field_name)
                         username = None
 
                 for field_name in self.UserModel.REQUIRED_FIELDS:
                     field = self.UserModel._meta.get_field(field_name)
                     user_data[field_name] = options.get(field_name)
                     while user_data[field_name] is None:
-                        raw_value = input(force_str('%s: ' % capfirst(field.verbose_name)))
+                        raw_value = input(force_str('%s: ' % capfirst(force_text(field.verbose_name))))
                         try:
                             user_data[field_name] = field.clean(raw_value, None)
                         except exceptions.ValidationError as e:

+ 15 - 5
django/contrib/auth/tests/basic.py

@@ -12,6 +12,7 @@ from django.core.exceptions import ImproperlyConfigured
 from django.core.management import call_command
 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
 
 
@@ -30,8 +31,13 @@ def mock_inputs(inputs):
                 # prompt should be encoded in Python 2. This line will raise an
                 # Exception if prompt contains unencoded non-ascii on Python 2.
                 prompt = str(prompt)
-                if str('leave blank to use') in prompt:
-                    return inputs['username']
+                assert str('__proxy__') not in prompt
+                response = ''
+                for key, val in inputs.items():
+                    if force_str(key) in prompt.lower():
+                        response = val
+                        break
+                return response
 
             old_getpass = createsuperuser.getpass
             old_input = createsuperuser.input
@@ -178,16 +184,20 @@ class BasicTestCase(TestCase):
         u = User.objects.get(username="nolocale@somewhere.org")
         self.assertEqual(u.email, 'nolocale@somewhere.org')
 
-    @mock_inputs({'password': "nopasswd", 'username': 'foo'})
+    @mock_inputs({
+        'password': "nopasswd",
+        'uživatel': 'foo',  # username (cz)
+        'email': 'nolocale@somewhere.org'})
     def test_createsuperuser_non_ascii_verbose_name(self):
+        # Aliased so the string doesn't get extracted
+        from django.utils.translation import ugettext_lazy as ulazy
         username_field = User._meta.get_field('username')
         old_verbose_name = username_field.verbose_name
-        username_field.verbose_name = 'uživatel'
+        username_field.verbose_name = ulazy('uživatel')
         new_io = StringIO()
         try:
             call_command("createsuperuser",
                 interactive=True,
-                email="nolocale@somewhere.org",
                 stdout=new_io
             )
         finally: