Commit 8a4f017f authored by Simon Charette's avatar Simon Charette
Browse files

Fixed #26348 -- Added TruncTime and exposed it through the __time lookup.

Thanks Tim for the review.
parent 082c52db
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -96,6 +96,12 @@ class BaseDatabaseOperations(object):
        """
        raise NotImplementedError('subclasses of BaseDatabaseOperations may require a datetime_cast_date() method')

    def datetime_cast_time_sql(self, field_name, tzname):
        """
        Returns the SQL necessary to cast a datetime value to time value.
        """
        raise NotImplementedError('subclasses of BaseDatabaseOperations may require a datetime_cast_time_sql() method')

    def datetime_extract_sql(self, lookup_type, field_name, tzname):
        """
        Given a lookup_type of 'year', 'month', 'day', 'hour', 'minute' or
+5 −0
Original line number Diff line number Diff line
@@ -51,6 +51,11 @@ class DatabaseOperations(BaseDatabaseOperations):
        sql = "DATE(%s)" % field_name
        return sql, params

    def datetime_cast_time_sql(self, field_name, tzname):
        field_name, params = self._convert_field_to_tz(field_name, tzname)
        sql = "TIME(%s)" % field_name
        return sql, params

    def datetime_extract_sql(self, lookup_type, field_name, tzname):
        field_name, params = self._convert_field_to_tz(field_name, tzname)
        sql = self.date_extract_sql(lookup_type, field_name)
+6 −0
Original line number Diff line number Diff line
@@ -128,6 +128,12 @@ WHEN (new.%(col_name)s IS NULL)
        sql = 'TRUNC(%s)' % field_name
        return sql, []

    def datetime_cast_time_sql(self, field_name, tzname):
        # Since `TimeField` values are stored as TIMESTAMP where only the date
        # part is ignored, convert the field to the specified timezone.
        field_name = self._convert_field_to_tz(field_name, tzname)
        return field_name, []

    def datetime_extract_sql(self, lookup_type, field_name, tzname):
        field_name = self._convert_field_to_tz(field_name, tzname)
        sql = self.date_extract_sql(lookup_type, field_name)
+5 −0
Original line number Diff line number Diff line
@@ -45,6 +45,11 @@ class DatabaseOperations(BaseDatabaseOperations):
        sql = '(%s)::date' % field_name
        return sql, params

    def datetime_cast_time_sql(self, field_name, tzname):
        field_name, params = self._convert_field_to_tz(field_name, tzname)
        sql = '(%s)::time' % field_name
        return sql, params

    def datetime_extract_sql(self, lookup_type, field_name, tzname):
        field_name, params = self._convert_field_to_tz(field_name, tzname)
        sql = self.date_extract_sql(lookup_type, field_name)
+8 −0
Original line number Diff line number Diff line
@@ -210,6 +210,7 @@ class DatabaseWrapper(BaseDatabaseWrapper):
        conn.create_function("django_date_extract", 2, _sqlite_date_extract)
        conn.create_function("django_date_trunc", 2, _sqlite_date_trunc)
        conn.create_function("django_datetime_cast_date", 2, _sqlite_datetime_cast_date)
        conn.create_function("django_datetime_cast_time", 2, _sqlite_datetime_cast_time)
        conn.create_function("django_datetime_extract", 3, _sqlite_datetime_extract)
        conn.create_function("django_datetime_trunc", 3, _sqlite_datetime_trunc)
        conn.create_function("django_time_extract", 2, _sqlite_time_extract)
@@ -403,6 +404,13 @@ def _sqlite_datetime_cast_date(dt, tzname):
    return dt.date().isoformat()


def _sqlite_datetime_cast_time(dt, tzname):
    dt = _sqlite_datetime_parse(dt, tzname)
    if dt is None:
        return None
    return dt.time().isoformat()


def _sqlite_datetime_extract(lookup_type, dt, tzname):
    dt = _sqlite_datetime_parse(dt, tzname)
    if dt is None:
Loading