#30575: Union of TruncBase annotations with different tzinfo apply
`convert_value` of last tzinfo (PostgreSQL)
-------------------------------------+-------------------------------------
Reporter: Jurgis | Owner: nobody
Pralgauskis |
Type: | Status: new
Uncategorized |
Component: Database | Version: 1.11
layer (models, ORM) | Keywords: timezone,
Severity: Normal | TruncBase, Union, PostgreSQL
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
{{{#!python
class Message(models.Model):
timestamp = models.DateTimeField(auto_now=True) # PostgreSQL,
USE_TZ=True
msg = models.CharField(max_length=254)
timezone = models.CharField(max_length=64, default="UTC",
help_text="pytz name")
}}}
{{{#!python
def test_demo_bug(self):
from ..models import Message
import pytz
from django.db.models.functions import Trunc, TruncSecond
import mock
from django.utils import timezone
with patch.object(timezone, 'now',
return_value=pytz.utc.localize(datetime(2017, 1, 1, 0, 0))):
# we have info
Message.objects.create( msg = "bar", timezone = 'UTC')
Message.objects.create( msg = "foo", timezone =
'America/Los_Angeles')
# we want to get it with "localized" timestamps:
qs = Message.objects.all()
partitions = [] # partition by timezones
for tzname in ['UTC', 'America/Los_Angeles']:
tz = pytz.timezone(tzname)
_qs = qs.filter(timezone='UTC')
_qs =
_qs.annotate(trunc_local_time=TruncSecond('timestamp', tzinfo=tz))
partitions.append(_qs)
qs1, qs2 = partitions
result = list(qs1.union(qs2))
for x in result:
tz = pytz.timezone(x.timezone)
print(x.msg)
x.timestamp_trunc = x.timestamp.replace(microsecond=0)
x.expected = x.timestamp_trunc.astimezone(tz) # this is
the working way (but I wanted to get localization in DB layer)
assert x.trunc_local_time == x.expected, "Error (msg:
'{x.msg}'): {x.trunc_local_time} != {x.expected}".format(x=x)
}}}
{{{
Failure
Traceback (most recent call last):
File "/home/jurgis/dev/new/tableair/sync_tableair-
cloud/ta/api/booking/tests/test_endpoints.py", line 1107, in test_demo_bug
assert x.trunc_local_time == x.expected, "Error (msg: '{x.msg}'):
{x.trunc_local_time} != {x.expected}".format(x=x)
AssertionError: Error (msg: 'bla'): 2016-12-31 16:00:00+00:00 !=
2017-01-01 00:00:00+00:00}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/30575>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/046.7e3964351c1456efeb603e7a1f5f0ed2%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.