diff options
| author | Mads Jensen <mje@inducks.org> | 2016-11-11 14:01:40 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-11-11 08:01:40 -0500 |
| commit | 1446902be48ebf19bfe484371897a2815dd21fca (patch) | |
| tree | 25945ce54301b3b33d4e975bfed5421ea5224d91 /django | |
| parent | 2dc07da497f5ae95ad34a4714e330fae1fa8413c (diff) | |
Fixed #25240 -- Added ExtractWeek and exposed it through the __week lookup.
Thanks to Mariusz Felisiak and Tim Graham for review.
Diffstat (limited to 'django')
| -rw-r--r-- | django/db/backends/mysql/operations.py | 6 | ||||
| -rw-r--r-- | django/db/backends/oracle/operations.py | 3 | ||||
| -rw-r--r-- | django/db/backends/sqlite3/base.py | 4 | ||||
| -rw-r--r-- | django/db/models/functions/__init__.py | 7 | ||||
| -rw-r--r-- | django/db/models/functions/datetime.py | 9 |
5 files changed, 26 insertions, 3 deletions
diff --git a/django/db/backends/mysql/operations.py b/django/db/backends/mysql/operations.py index 306a0378b2..772ae1e37d 100644 --- a/django/db/backends/mysql/operations.py +++ b/django/db/backends/mysql/operations.py @@ -24,7 +24,13 @@ class DatabaseOperations(BaseDatabaseOperations): # DAYOFWEEK() returns an integer, 1-7, Sunday=1. # Note: WEEKDAY() returns 0-6, Monday=0. return "DAYOFWEEK(%s)" % field_name + elif lookup_type == 'week': + # Override the value of default_week_format for consistency with + # other database backends. + # Mode 3: Monday, 1-53, with 4 or more days this year. + return "WEEK(%s, 3)" % field_name else: + # EXTRACT returns 1-53 based on ISO-8601 for the week number. return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name) def date_trunc_sql(self, lookup_type, field_name): diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py index 8191f89dd0..82be9c5241 100644 --- a/django/db/backends/oracle/operations.py +++ b/django/db/backends/oracle/operations.py @@ -84,6 +84,9 @@ WHEN (new.%(col_name)s IS NULL) if lookup_type == 'week_day': # TO_CHAR(field, 'D') returns an integer from 1-7, where 1=Sunday. return "TO_CHAR(%s, 'D')" % field_name + elif lookup_type == 'week': + # IW = ISO week number + return "TO_CHAR(%s, 'IW')" % field_name else: # http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions050.htm return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), field_name) diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 66ad27842b..aee012c7e6 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -344,6 +344,8 @@ def _sqlite_date_extract(lookup_type, dt): return None if lookup_type == 'week_day': return (dt.isoweekday() % 7) + 1 + elif lookup_type == 'week': + return dt.isocalendar()[1] else: return getattr(dt, lookup_type) @@ -406,6 +408,8 @@ def _sqlite_datetime_extract(lookup_type, dt, tzname): return None if lookup_type == 'week_day': return (dt.isoweekday() % 7) + 1 + elif lookup_type == 'week': + return dt.isocalendar()[1] else: return getattr(dt, lookup_type) diff --git a/django/db/models/functions/__init__.py b/django/db/models/functions/__init__.py index dd45d7bb4c..eeafc1dc48 100644 --- a/django/db/models/functions/__init__.py +++ b/django/db/models/functions/__init__.py @@ -4,8 +4,9 @@ from .base import ( ) from .datetime import ( Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth, - ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay, - TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncTime, TruncYear, + ExtractSecond, ExtractWeek, ExtractWeekDay, ExtractYear, Trunc, TruncDate, + TruncDay, TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncTime, + TruncYear, ) __all__ = [ @@ -14,7 +15,7 @@ __all__ = [ 'Lower', 'Now', 'Substr', 'Upper', # datetime 'Extract', 'ExtractDay', 'ExtractHour', 'ExtractMinute', 'ExtractMonth', - 'ExtractSecond', 'ExtractWeekDay', 'ExtractYear', + 'ExtractSecond', 'ExtractWeek', 'ExtractWeekDay', 'ExtractYear', 'Trunc', 'TruncDate', 'TruncDay', 'TruncHour', 'TruncMinute', 'TruncMonth', 'TruncSecond', 'TruncTime', 'TruncYear', ] diff --git a/django/db/models/functions/datetime.py b/django/db/models/functions/datetime.py index 341c53e162..7b137eabef 100644 --- a/django/db/models/functions/datetime.py +++ b/django/db/models/functions/datetime.py @@ -87,6 +87,14 @@ class ExtractDay(Extract): lookup_name = 'day' +class ExtractWeek(Extract): + """ + Return 1-52 or 53, based on ISO-8601, i.e., Monday is the first of the + week. + """ + lookup_name = 'week' + + class ExtractWeekDay(Extract): """ Return Sunday=1 through Saturday=7. @@ -112,6 +120,7 @@ DateField.register_lookup(ExtractYear) DateField.register_lookup(ExtractMonth) DateField.register_lookup(ExtractDay) DateField.register_lookup(ExtractWeekDay) +DateField.register_lookup(ExtractWeek) TimeField.register_lookup(ExtractHour) TimeField.register_lookup(ExtractMinute) |
