Opened 14 years ago
Closed 14 years ago
#17937 closed Bug (fixed)
timeuntil doesn't work with datetime.date objects
| Reported by: | Owned by: | Aymeric Augustin | |
|---|---|---|---|
| Component: | Template system | Version: | 1.4-beta-1 |
| Severity: | Release blocker | Keywords: | timezone |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
It seems a bug exists in several django.utils.timezone methods, is_aware() and is_native(). This leads to error "AttributeError: 'datetime.date' object has no attribute 'tzinfo'" when timesince filter is applied to date object in Django template. Proof code
import time
from datetime import date
today = date.today()
from django.template import Context, Template
c = Context({"today": today})
t = Template("{{ today|timeuntil }}")
print t.render(c)
Error trace:
Traceback (most recent call last):
File "test.py", line 9, in <module>
print t.render(c)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 140, in render
return self._render(context)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 134, in _render
return self.nodelist.render(context)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 823, in render
bit = self.render_node(node, context)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 837, in render_node
return node.render(context)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 874, in render
output = self.filter_expression.resolve(context)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/base.py", line 599, in resolve
new_obj = func(obj, *arg_vals)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/template/defaultfilters.py", line 755, in timeuntil_filter
return timeuntil(value, arg)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/utils/timesince.py", line 61, in timeuntil
now = datetime.datetime.now(utc if is_aware(d) else None)
File "/cygdrive/c/Users/dmitryg/.virtualenvs/feedback/lib/python2.6/site-packages/django/utils/timezone.py", line 243, in is_aware
return value.tzinfo is not None and value.tzinfo.utcoffset(value) is not None
AttributeError: 'datetime.date' object has no attribute 'tzinfo'
Attachments (2)
Change History (11)
comment:1 by , 14 years ago
| Summary: | django.utils.timezone methods don't work with datetime.date objects → django.utils.timezone methods doesn't work with datetime.date objects |
|---|
comment:2 by , 14 years ago
| Component: | Uncategorized → Template system |
|---|---|
| Has patch: | unset |
| Severity: | Normal → Release blocker |
| Triage Stage: | Unreviewed → Accepted |
by , 14 years ago
| Attachment: | timezone.diff added |
|---|
Objects of date class should be always naive according to python docs
comment:3 by , 14 years ago
| Has patch: | set |
|---|
follow-ups: 5 6 comment:4 by , 14 years ago
| Needs tests: | set |
|---|---|
| Owner: | changed from to |
| Patch needs improvement: | set |
Thanks for the patch. Unfortunately, I think it puts the check in the wrong layer -- is_aware and is_naive are only intended to receive datetime objects (or subclasses, or API-compatible classes).
The check should be in timesince instead.
The same bug probably exists in timeuntil and possibly in other filters.
comment:5 by , 14 years ago
Replying to aaugustin:
Thanks for the patch. Unfortunately, I think it puts the check in the wrong layer --
is_awareandis_naiveare only intended to receivedatetimeobjects (or subclasses, or API-compatible classes).
The check should be in
timesinceinstead.
The same bug probably exists in
timeuntiland possibly in other filters.
'Yes, I was thinking about patching at timesince/timeuntil level, however, after considerations it seemed more logical to make changes at the bottom level instead.
by , 14 years ago
| Attachment: | timeuntil2.diff added |
|---|
comment:6 by , 14 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
Replying to aaugustin:
Thanks for the patch. Unfortunately, I think it puts the check in the wrong layer --
is_awareandis_naiveare only intended to receivedatetimeobjects (or subclasses, or API-compatible classes).
The check should be in
timesinceinstead.
The same bug probably exists in
timeuntiland possibly in other filters.
Please see second version of the patch, this one fixes problem on timeuntil() level + adds unittests.
comment:7 by , 14 years ago
| Needs tests: | unset |
|---|---|
| Patch needs improvement: | unset |
comment:8 by , 14 years ago
| Owner: | changed from to |
|---|---|
| Status: | assigned → new |
| Summary: | django.utils.timezone methods doesn't work with datetime.date objects → timeuntil doesn't work with datetime.date objects |
In fact, this problem only affects timeuntil, not timesince — there are tests checking that timeuntil accepts date objects.
It's a little bit hard to explain the problem in English but the patch is self-explanatory. It just avoids duplicating the preprocessing of parguments that is done correctly in timesince and incorrectly in timeuntil.
Indeed, the docs clearly mean that timesince accepts either a date or a datetime.