summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMads Jensen <mje@inducks.org>2016-11-11 14:01:40 +0100
committerTim Graham <timograham@gmail.com>2016-11-11 08:01:40 -0500
commit1446902be48ebf19bfe484371897a2815dd21fca (patch)
tree25945ce54301b3b33d4e975bfed5421ea5224d91 /django
parent2dc07da497f5ae95ad34a4714e330fae1fa8413c (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.py6
-rw-r--r--django/db/backends/oracle/operations.py3
-rw-r--r--django/db/backends/sqlite3/base.py4
-rw-r--r--django/db/models/functions/__init__.py7
-rw-r--r--django/db/models/functions/datetime.py9
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)