From b6bd766d88aedfb924180091bebbe990b7b64564 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Fri, 26 Feb 2010 15:38:50 +0000 Subject: [PATCH] [1.1.X] Fixed #1480 -- Added the ability to use the system timezone. Thanks to Ramiro Morales for the patch. Backport of r12602 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12603 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/conf/__init__.py | 2 +- django/conf/project_template/settings.py | 2 + django/db/backends/postgresql/base.py | 2 +- .../db/backends/postgresql_psycopg2/base.py | 2 +- docs/ref/settings.txt | 50 ++++++++++++------- tests/regressiontests/app_loading/tests.py | 2 +- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/django/conf/__init__.py b/django/conf/__init__.py index 7bc7ae9508..e0874cc0ac 100644 --- a/django/conf/__init__.py +++ b/django/conf/__init__.py @@ -102,7 +102,7 @@ class Settings(object): new_installed_apps.append(app) self.INSTALLED_APPS = new_installed_apps - if hasattr(time, 'tzset'): + if hasattr(time, 'tzset') and getattr(self, 'TIME_ZONE'): # Move the time zone info into os.environ. See ticket #2315 for why # we don't do this unconditionally (breaks Windows). os.environ['TZ'] = self.TIME_ZONE diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py index d3013a541f..df99e51c3c 100644 --- a/django/conf/project_template/settings.py +++ b/django/conf/project_template/settings.py @@ -19,6 +19,8 @@ DATABASE_PORT = '' # Set to empty string for default. Not used with # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. # If running in a Windows environment this must be set to the same as your # system time zone. TIME_ZONE = 'America/Chicago' diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index 19d5ea74d8..f3c03c24ea 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -100,7 +100,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): set_tz = False settings_dict = self.settings_dict if self.connection is None: - set_tz = True + set_tz = settings_dict.get('TIME_ZONE') if settings_dict['DATABASE_NAME'] == '': from django.core.exceptions import ImproperlyConfigured raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py index d4ad3da646..d381cf60b7 100644 --- a/django/db/backends/postgresql_psycopg2/base.py +++ b/django/db/backends/postgresql_psycopg2/base.py @@ -77,7 +77,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): set_tz = False settings_dict = self.settings_dict if self.connection is None: - set_tz = True + set_tz = settings_dict.get('TIME_ZONE') if settings_dict['DATABASE_NAME'] == '': from django.core.exceptions import ImproperlyConfigured raise ImproperlyConfigured("You need to specify DATABASE_NAME in your Django settings file.") diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 5c96960b85..8d8be2eaa1 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -1145,28 +1145,42 @@ TIME_ZONE Default: ``'America/Chicago'`` -A string representing the time zone for this installation. `See available choices`_. -(Note that list of available choices lists more than one on the same line; -you'll want to use just one of the choices for a given time zone. For instance, -one line says ``'Europe/London GB GB-Eire'``, but you should use the first bit -of that -- ``'Europe/London'`` -- as your ``TIME_ZONE`` setting.) +.. versionchanged:: 1.2 + ``None`` was added as an allowed value. -Note that this is the time zone to which Django will convert all dates/times -- -not necessarily the timezone of the server. For example, one server may serve -multiple Django-powered sites, each with a separate time-zone setting. +A string representing the time zone for this installation, or +``None``. `See available choices`_. (Note that list of available +choices lists more than one on the same line; you'll want to use just +one of the choices for a given time zone. For instance, one line says +``'Europe/London GB GB-Eire'``, but you should use the first bit of +that -- ``'Europe/London'`` -- as your ``TIME_ZONE`` setting.) -Normally, Django sets the ``os.environ['TZ']`` variable to the time zone you -specify in the ``TIME_ZONE`` setting. Thus, all your views and models will -automatically operate in the correct time zone. However, if you're manually -:ref:`manually configuring settings -`, Django will *not* touch the ``TZ`` -environment variable, and it'll be up to you to ensure your processes are -running in the correct environment. +Note that this is the time zone to which Django will convert all +dates/times -- not necessarily the timezone of the server. For +example, one server may serve multiple Django-powered sites, each with +a separate time-zone setting. + +Normally, Django sets the ``os.environ['TZ']`` variable to the time +zone you specify in the ``TIME_ZONE`` setting. Thus, all your views +and models will automatically operate in the correct time zone. +However, Django won't set the ``TZ`` environment variable under the +following conditions: + + * If you're using the manual configuration option as described in + :ref:`manually configuring settings + `, or + + * If you specify ``TIME_ZONE = None``. This will cause Django to fall + back to using the system timezone. + +If Django doesn't set the ``TZ`` environment variable, it's up to you +to ensure your processes are running in the correct environment. .. note:: - Django cannot reliably use alternate time zones in a Windows environment. - If you're running Django on Windows, this variable must be set to match the - system timezone. + Django cannot reliably use alternate time zones in a Windows + environment. If you're running Django on Windows, this variable + must be set to match the system timezone. + .. _See available choices: http://www.postgresql.org/docs/8.1/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE diff --git a/tests/regressiontests/app_loading/tests.py b/tests/regressiontests/app_loading/tests.py index 683c6079ad..a1273dfeb0 100644 --- a/tests/regressiontests/app_loading/tests.py +++ b/tests/regressiontests/app_loading/tests.py @@ -19,7 +19,7 @@ Test the globbing of INSTALLED_APPS. >>> sys.path = old_sys_path # Undo a side-effect of installing a new settings object. ->>> if hasattr(time, "tzset"): +>>> if hasattr(time, "tzset") and old_tz: ... os.environ["TZ"] = old_tz ... time.tzset()