Anonymous avatar Anonymous committed 3b53e27

[1.2.X] Fixed #14824 -- Corrected the handling of formats when USE_L10N is disabled. Thanks to nullie for the report and initial patch, and to idle for the separate report with helpful debug info.

Backport of r15404 from trunk.

Comments (0)

Files changed (3)

django/utils/formats.py

 _format_cache = {}
 _format_modules_cache = {}
 
+def reset_format_cache():
+    """Clear any cached formats.
+
+    This method is provided primarily for testing purposes,
+    so that the effects of cached formats can be removed.
+    """
+    global _format_cache, _format_modules_cache
+    _format_cache = {}
+    _format_modules_cache = {}
+
 def iter_format_modules(lang):
     """
     Does the heavy lifting of finding format modules.
     """
-    if check_for_language(lang) or settings.USE_L10N:
+    if check_for_language(lang):
         format_locations = ['django.conf.locale.%s']
         if settings.FORMAT_MODULE_PATH:
             format_locations.append(settings.FORMAT_MODULE_PATH + '.%s')

django/views/i18n.py

 from django.utils.translation import check_for_language, activate, to_locale, get_language
 from django.utils.text import javascript_quote
 from django.utils.encoding import smart_unicode
-from django.utils.formats import get_format_modules
+from django.utils.formats import get_format_modules, get_format
 
 def set_language(request):
     """
     result = {}
     for module in [settings] + get_format_modules(reverse=True):
         for attr in FORMAT_SETTINGS:
-            try:
-                result[attr] = getattr(module, attr)
-            except AttributeError:
-                pass
+            result[attr] = get_format(attr)
     src = []
     for k, v in result.items():
         if isinstance(v, (basestring, int)):

tests/regressiontests/admin_views/tests.py

     urlbit = 'admin'
 
     def setUp(self):
-        self.old_language_code = settings.LANGUAGE_CODE
+        self.old_USE_I18N = settings.LANGUAGE_CODE
+        self.old_USE_L10N = settings.USE_L10N
+        self.old_LANGUAGE_CODE = settings.LANGUAGE_CODE
         self.client.login(username='super', password='secret')
+        settings.USE_I18N = True
 
     def tearDown(self):
-        settings.LANGUAGE_CODE = self.old_language_code
+        settings.USE_I18N = self.old_USE_I18N
+        settings.USE_L10N = self.old_USE_L10N
+        settings.LANGUAGE_CODE = self.old_LANGUAGE_CODE
         self.client.logout()
+        formats.reset_format_cache()
 
     def testTrailingSlashRequired(self):
         """
         if the default language is non-English but the selected language
         is English. See #13388 and #3594 for more details.
         """
-        settings.LANGUAGE_CODE = 'fr'
-        activate('en-us')
-        response = self.client.get('/test_admin/admin/jsi18n/')
-        self.assertNotContains(response, 'Choisir une heure')
-        deactivate()
+        try:
+            settings.LANGUAGE_CODE = 'fr'
+            activate('en-us')
+            response = self.client.get('/test_admin/admin/jsi18n/')
+            self.assertNotContains(response, 'Choisir une heure')
+        finally:
+            deactivate()
 
     def testI18NLanguageNonEnglishFallback(self):
         """
         Makes sure that the fallback language is still working properly
         in cases where the selected language cannot be found.
         """
-        settings.LANGUAGE_CODE = 'fr'
-        activate('none')
-        response = self.client.get('/test_admin/admin/jsi18n/')
-        self.assertContains(response, 'Choisir une heure')
-        deactivate()
+        try:
+            settings.LANGUAGE_CODE = 'fr'
+            activate('none')
+            response = self.client.get('/test_admin/admin/jsi18n/')
+            self.assertContains(response, 'Choisir une heure')
+        finally:
+            deactivate()
+
+    def testL10NDeactivated(self):
+        """
+        Check if L10N is deactivated, the Javascript i18n view doesn't
+        return localized date/time formats. Refs #14824.
+        """
+        try:
+            settings.LANGUAGE_CODE = 'ru'
+            settings.USE_L10N = False
+            activate('ru')
+            response = self.client.get('/test_admin/admin/jsi18n/')
+            self.assertNotContains(response, '%d.%m.%Y %H:%M:%S')
+            self.assertContains(response, '%Y-%m-%d %H:%M:%S')
+        finally:
+            deactivate()
+
 
     def test_disallowed_filtering(self):
         self.assertRaises(SuspiciousOperation,
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.