Commit 3ef55dfa authored by Aymeric Augustin's avatar Aymeric Augustin
Browse files

Fixed #17882 (again) -- Updated the database connections' time zone when...

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
parent 4b145462
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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)
+3 −0
Original line number Diff line number Diff line
@@ -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
+16 −7
Original line number Diff line number Diff line
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)