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
|
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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue