diff options
| author | Hasan Ramezani <hasan.r67@gmail.com> | 2020-03-20 22:58:55 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-03-25 21:03:41 +0100 |
| commit | 55cdf6c52db07f29128741b8734a523ed042e465 (patch) | |
| tree | 1b043f57938b2dd739e5da406710d91ab5f2bf56 /django | |
| parent | e43c34d10ded2283d3d3014ccecd214074e1c82d (diff) | |
Fixed #29724 -- Fixed timezone handling in ModelAdmin.date_hierarchy queries.
Thanks Alexander Holmbäck for the initial patch.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/admin/templatetags/admin_list.py | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 4fd9c45a57..d686764ace 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -2,7 +2,8 @@ import datetime from django.contrib.admin.templatetags.admin_urls import add_preserved_filters from django.contrib.admin.utils import ( - display_for_field, display_for_value, label_for_field, lookup_field, + display_for_field, display_for_value, get_fields_from_path, + label_for_field, lookup_field, ) from django.contrib.admin.views.main import ( ALL_VAR, ORDER_VAR, PAGE_VAR, SEARCH_VAR, @@ -13,7 +14,7 @@ from django.template import Library from django.template.loader import get_template from django.templatetags.static import static from django.urls import NoReverseMatch -from django.utils import formats +from django.utils import formats, timezone from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils.text import capfirst @@ -359,6 +360,13 @@ def date_hierarchy(cl): """ if cl.date_hierarchy: field_name = cl.date_hierarchy + field = get_fields_from_path(cl.model, field_name)[-1] + if isinstance(field, models.DateTimeField): + dates_or_datetimes = 'datetimes' + qs_kwargs = {'is_dst': True} + else: + dates_or_datetimes = 'dates' + qs_kwargs = {} year_field = '%s__year' % field_name month_field = '%s__month' % field_name day_field = '%s__day' % field_name @@ -374,6 +382,11 @@ def date_hierarchy(cl): # select appropriate start level date_range = cl.queryset.aggregate(first=models.Min(field_name), last=models.Max(field_name)) + if dates_or_datetimes == 'datetimes': + date_range = { + k: timezone.localtime(v) if timezone.is_aware(v) else v + for k, v in date_range.items() + } if date_range['first'] and date_range['last']: if date_range['first'].year == date_range['last'].year: year_lookup = date_range['first'].year @@ -391,7 +404,7 @@ def date_hierarchy(cl): 'choices': [{'title': capfirst(formats.date_format(day, 'MONTH_DAY_FORMAT'))}] } elif year_lookup and month_lookup: - days = getattr(cl.queryset, 'dates')(field_name, 'day') + days = getattr(cl.queryset, dates_or_datetimes)(field_name, 'day', **qs_kwargs) return { 'show': True, 'back': { @@ -404,7 +417,7 @@ def date_hierarchy(cl): } for day in days] } elif year_lookup: - months = getattr(cl.queryset, 'dates')(field_name, 'month') + months = getattr(cl.queryset, dates_or_datetimes)(field_name, 'month', **qs_kwargs) return { 'show': True, 'back': { @@ -417,7 +430,7 @@ def date_hierarchy(cl): } for month in months] } else: - years = getattr(cl.queryset, 'dates')(field_name, 'year') + years = getattr(cl.queryset, dates_or_datetimes)(field_name, 'year', **qs_kwargs) return { 'show': True, 'back': None, |
