Fixed #17882 (again) -- Updated the database connections' time zone when time-zone-related settings are changed in tests.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17709 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Aymeric Augustin 2012-03-13 23:29:15 +00:00
parent 4b14546215
commit 3ef55dfaa0
4 changed files with 29 additions and 8 deletions

View File

@ -710,6 +710,14 @@ class BaseDatabaseOperations(object):
""" """
raise NotImplementedError raise NotImplementedError
def set_time_zone_sql(self):
"""
Returns the SQL that will set the connection's time zone.
Returns '' if the backend doesn't support time zones.
"""
return ''
def sql_flush(self, style, tables, sequences): def sql_flush(self, style, tables, sequences):
""" """
Returns a list of SQL statements required to remove all data from Returns a list of SQL statements required to remove all data from

View File

@ -190,7 +190,8 @@ class DatabaseWrapper(BaseDatabaseWrapper):
# Set the time zone in autocommit mode (see #17062) # Set the time zone in autocommit mode (see #17062)
self.connection.set_isolation_level( self.connection.set_isolation_level(
psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT) psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
self.connection.cursor().execute("SET TIME ZONE %s", [tz]) self.connection.cursor().execute(
self.ops.set_time_zone_sql(), [tz])
self.connection.set_isolation_level(self.isolation_level) self.connection.set_isolation_level(self.isolation_level)
self._get_pg_version() self._get_pg_version()
connection_created.send(sender=self.__class__, connection=self) connection_created.send(sender=self.__class__, connection=self)

View File

@ -71,6 +71,9 @@ class DatabaseOperations(BaseDatabaseOperations):
return name # Quoting once is enough. return name # Quoting once is enough.
return '"%s"' % name return '"%s"' % name
def set_time_zone_sql(self):
return "SET TIME ZONE %s"
def sql_flush(self, style, tables, sequences): def sql_flush(self, style, tables, sequences):
if tables: if tables:
# Perform a single SQL 'TRUNCATE x, y, z...;' statement. It allows # Perform a single SQL 'TRUNCATE x, y, z...;' statement. It allows

View File

@ -1,14 +1,23 @@
from django.conf import settings from django.conf import settings
from django.db import close_connection from django.db import connections
from django.dispatch import Signal from django.dispatch import Signal
template_rendered = Signal(providing_args=["template", "context"]) template_rendered = Signal(providing_args=["template", "context"])
setting_changed = Signal(providing_args=["setting", "value"]) setting_changed = Signal(providing_args=["setting", "value"])
# Close the database connection to re-establish it with the proper time zone. def update_connections_time_zone(**kwargs):
def close_connection_on_time_zone_change(**kwargs): if kwargs['setting'] == 'USE_TZ' and settings.TIME_ZONE != 'UTC':
if (kwargs['setting'] == 'USE_TZ' USE_TZ, TIME_ZONE = kwargs['value'], settings.TIME_ZONE
or (kwargs['setting'] == 'TIME_ZONE' and not settings.USE_TZ)): elif kwargs['setting'] == 'TIME_ZONE' and not settings.USE_TZ:
close_connection() USE_TZ, TIME_ZONE = settings.USE_TZ, kwargs['value']
setting_changed.connect(close_connection_on_time_zone_change) else: # no need to change the database connnections' time zones
return
tz = 'UTC' if USE_TZ else TIME_ZONE
for conn in connections.all():
tz_sql = conn.ops.set_time_zone_sql()
if tz_sql:
conn.cursor().execute(tz_sql, [tz])
setting_changed.connect(update_connections_time_zone)