diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2015-03-07 13:20:29 -0800 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-06-02 08:49:10 -0400 |
| commit | 44f3ee77166bd5c0e8a4604f2d96015268dce100 (patch) | |
| tree | 733d47ee8d00d3934ae86d8b26275ad4fde4d371 /django/db/backends/sqlite3 | |
| parent | 076a63e672370ff1735e7942cd1ae0990bcbd263 (diff) | |
Fixed #9596 -- Added date transform for DateTimeField.
Diffstat (limited to 'django/db/backends/sqlite3')
| -rw-r--r-- | django/db/backends/sqlite3/base.py | 24 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/operations.py | 18 |
2 files changed, 28 insertions, 14 deletions
diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 5da6bbd1fb..4bd9609e9d 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -207,6 +207,7 @@ class DatabaseWrapper(BaseDatabaseWrapper): conn = Database.connect(**conn_params) 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_extract", 3, _sqlite_datetime_extract) conn.create_function("django_datetime_trunc", 3, _sqlite_datetime_trunc) conn.create_function("regexp", 2, _sqlite_regexp) @@ -354,7 +355,7 @@ def _sqlite_date_trunc(lookup_type, dt): return "%i-%02i-%02i" % (dt.year, dt.month, dt.day) -def _sqlite_datetime_extract(lookup_type, dt, tzname): +def _sqlite_datetime_parse(dt, tzname): if dt is None: return None try: @@ -363,6 +364,20 @@ def _sqlite_datetime_extract(lookup_type, dt, tzname): return None if tzname is not None: dt = timezone.localtime(dt, pytz.timezone(tzname)) + return dt + + +def _sqlite_datetime_cast_date(dt, tzname): + dt = _sqlite_datetime_parse(dt, tzname) + if dt is None: + return None + return dt.date().isoformat() + + +def _sqlite_datetime_extract(lookup_type, dt, tzname): + dt = _sqlite_datetime_parse(dt, tzname) + if dt is None: + return None if lookup_type == 'week_day': return (dt.isoweekday() % 7) + 1 else: @@ -370,12 +385,9 @@ def _sqlite_datetime_extract(lookup_type, dt, tzname): def _sqlite_datetime_trunc(lookup_type, dt, tzname): - try: - dt = backend_utils.typecast_timestamp(dt) - except (ValueError, TypeError): + dt = _sqlite_datetime_parse(dt, tzname) + if dt is None: return None - if tzname is not None: - dt = timezone.localtime(dt, pytz.timezone(tzname)) if lookup_type == 'year': return "%i-01-01 00:00:00" % dt.year elif lookup_type == 'month': diff --git a/django/db/backends/sqlite3/operations.py b/django/db/backends/sqlite3/operations.py index 02d688b63d..fe4a75fb37 100644 --- a/django/db/backends/sqlite3/operations.py +++ b/django/db/backends/sqlite3/operations.py @@ -68,21 +68,23 @@ class DatabaseOperations(BaseDatabaseOperations): # cause a collision with a field name). return "django_date_trunc('%s', %s)" % (lookup_type.lower(), field_name) + def _require_pytz(self): + if settings.USE_TZ and pytz is None: + raise ImproperlyConfigured("This query requires pytz, but it isn't installed.") + + def datetime_cast_date_sql(self, field_name, tzname): + self._require_pytz() + return "django_datetime_cast_date(%s, %%s)" % field_name, [tzname] + def datetime_extract_sql(self, lookup_type, field_name, tzname): # Same comment as in date_extract_sql. - if settings.USE_TZ: - if pytz is None: - raise ImproperlyConfigured("This query requires pytz, " - "but it isn't installed.") + self._require_pytz() return "django_datetime_extract('%s', %s, %%s)" % ( lookup_type.lower(), field_name), [tzname] def datetime_trunc_sql(self, lookup_type, field_name, tzname): # Same comment as in date_trunc_sql. - if settings.USE_TZ: - if pytz is None: - raise ImproperlyConfigured("This query requires pytz, " - "but it isn't installed.") + self._require_pytz() return "django_datetime_trunc('%s', %s, %%s)" % ( lookup_type.lower(), field_name), [tzname] |
