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:
parent
4b14546215
commit
3ef55dfaa0
|
@ -710,6 +710,14 @@ class BaseDatabaseOperations(object):
|
|||
"""
|
||||
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):
|
||||
"""
|
||||
Returns a list of SQL statements required to remove all data from
|
||||
|
|
|
@ -190,7 +190,8 @@ class DatabaseWrapper(BaseDatabaseWrapper):
|
|||
# Set the time zone in autocommit mode (see #17062)
|
||||
self.connection.set_isolation_level(
|
||||
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._get_pg_version()
|
||||
connection_created.send(sender=self.__class__, connection=self)
|
||||
|
|
|
@ -71,6 +71,9 @@ class DatabaseOperations(BaseDatabaseOperations):
|
|||
return name # Quoting once is enough.
|
||||
return '"%s"' % name
|
||||
|
||||
def set_time_zone_sql(self):
|
||||
return "SET TIME ZONE %s"
|
||||
|
||||
def sql_flush(self, style, tables, sequences):
|
||||
if tables:
|
||||
# Perform a single SQL 'TRUNCATE x, y, z...;' statement. It allows
|
||||
|
|
|
@ -1,14 +1,23 @@
|
|||
from django.conf import settings
|
||||
from django.db import close_connection
|
||||
from django.db import connections
|
||||
from django.dispatch import Signal
|
||||
|
||||
template_rendered = Signal(providing_args=["template", "context"])
|
||||
|
||||
setting_changed = Signal(providing_args=["setting", "value"])
|
||||
|
||||
# Close the database connection to re-establish it with the proper time zone.
|
||||
def close_connection_on_time_zone_change(**kwargs):
|
||||
if (kwargs['setting'] == 'USE_TZ'
|
||||
or (kwargs['setting'] == 'TIME_ZONE' and not settings.USE_TZ)):
|
||||
close_connection()
|
||||
setting_changed.connect(close_connection_on_time_zone_change)
|
||||
def update_connections_time_zone(**kwargs):
|
||||
if kwargs['setting'] == 'USE_TZ' and settings.TIME_ZONE != 'UTC':
|
||||
USE_TZ, TIME_ZONE = kwargs['value'], settings.TIME_ZONE
|
||||
elif kwargs['setting'] == 'TIME_ZONE' and not settings.USE_TZ:
|
||||
USE_TZ, TIME_ZONE = settings.USE_TZ, kwargs['value']
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue