Fixed #9523 -- Restart runserver after translation MO files change

Thanks to Krzysztof Kulewski for the initial patch.
This commit is contained in:
Bouke Haarsma 2013-11-02 10:28:22 +01:00
parent 090315f5df
commit c3936c0d79
7 changed files with 82 additions and 5 deletions

View File

@ -369,6 +369,7 @@ answer newbie questions, and generally made Django that much better:
knox <christobzr@gmail.com> knox <christobzr@gmail.com>
David Krauth David Krauth
Kevin Kubasik <kevin@kubasik.net> Kevin Kubasik <kevin@kubasik.net>
Krzysztof Kulewski <kulewski@gmail.com>
kurtiss@meetro.com kurtiss@meetro.com
Vladimir Kuzma <vladimirkuzma.ch@gmail.com> Vladimir Kuzma <vladimirkuzma.ch@gmail.com>
Denis Kuzmichyov <kuzmichyov@gmail.com> Denis Kuzmichyov <kuzmichyov@gmail.com>

View File

@ -28,13 +28,13 @@
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import datetime
import os import os
import signal import signal
import sys import sys
import time import time
import traceback import traceback
from django.conf import settings
from django.core.signals import request_finished from django.core.signals import request_finished
try: try:
from django.utils.six.moves import _thread as thread from django.utils.six.moves import _thread as thread
@ -86,13 +86,28 @@ _win = (sys.platform == "win32")
_error_files = [] _error_files = []
def gen_filenames(): def gen_filenames():
""" """
Yields a generator over filenames referenced in sys.modules. Yields a generator over filenames referenced in sys.modules and translation
files.
""" """
filenames = [filename.__file__ for filename in sys.modules.values() filenames = [filename.__file__ for filename in sys.modules.values()
if hasattr(filename, '__file__')] if hasattr(filename, '__file__')]
# Add the names of the .mo files that can be generated
# by compilemessages management command to the list of files watched.
basedirs = [os.path.join(os.path.dirname(os.path.dirname(__file__)),
'conf', 'locale'),
'locale']
basedirs.extend(settings.LOCALE_PATHS)
basedirs = [os.path.abspath(basedir) for basedir in basedirs
if os.path.isdir(basedir)]
for basedir in basedirs:
for dirpath, dirnames, locale_filenames in os.walk(basedir):
for filename in locale_filenames:
if filename.endswith('.mo'):
filenames.append(os.path.join(dirpath, filename))
for filename in filenames + _error_files: for filename in filenames + _error_files:
if not filename: if not filename:
continue continue

View File

@ -791,8 +791,12 @@ Django.)
The development server automatically reloads Python code for each request, as The development server automatically reloads Python code for each request, as
needed. You don't need to restart the server for code changes to take effect. needed. You don't need to restart the server for code changes to take effect.
However, some actions like adding files or compiling translation files don't However, some actions like adding files don't trigger a restart, so you'll
trigger a restart, so you'll have to restart the server in these cases. have to restart the server in these cases.
.. versionchanged:: 1.7
Compiling translation files now also restarts the development server.
If you are using Linux and install `pyinotify`_, kernel signals will be used to If you are using Linux and install `pyinotify`_, kernel signals will be used to
autoreload the server (rather than polling file modification timestamps each autoreload the server (rather than polling file modification timestamps each

View File

@ -346,6 +346,9 @@ Management Commands
* The :djadmin:`runserver` command now uses ``inotify`` Linux kernel signals * The :djadmin:`runserver` command now uses ``inotify`` Linux kernel signals
for autoreloading if ``pyinotify`` is installed. for autoreloading if ``pyinotify`` is installed.
* The :djadmin:`runserver` command is now restarted when a translation file is
changed.
Models Models
^^^^^^ ^^^^^^

Binary file not shown.

View File

@ -0,0 +1,17 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2007-09-15 19:15+0200\n"
"PO-Revision-Date: 2010-05-12 12:41-0300\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@ -0,0 +1,37 @@
import os
from django import conf
from django.test import TestCase, override_settings
from django.utils.autoreload import gen_filenames
LOCALE_PATH = os.path.join(os.path.dirname(__file__), 'locale')
class TestFilenameGenerator(TestCase):
def test_django_locales(self):
"""
Test that gen_filenames() also yields the built-in django locale files.
"""
filenames = list(gen_filenames())
locales = []
basedir = os.path.join(os.path.dirname(conf.__file__), 'locale')
for dirpath, dirnames, locale_filenames in os.walk(basedir):
for filename in locale_filenames:
if filename.endswith('.mo'):
locales.append(os.path.join(dirpath, filename))
self.assertTrue(len(locales) > 10) # assume a few available locales
for filename in locales:
self.assertIn(filename, filenames)
@override_settings(
LOCALE_PATHS=(LOCALE_PATH,)
)
def test_app_locales(self):
"""
Test that gen_filenames also yields from LOCALE_PATHS.
"""
filenames = list(gen_filenames())
self.assertIn(os.path.join(LOCALE_PATH, 'nl', 'LC_MESSAGES', 'django.mo'),
filenames)