﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
30575	Union of TruncBase annotations with different tzinfo   apply `convert_value` of last tzinfo (PostgreSQL)	Jurgis Pralgauskis	nobody	"{{{#!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}}}"	Uncategorized	new	Database layer (models, ORM)	1.11	Normal		timezone, TruncBase, Union, PostgreSQL		Unreviewed	0	0	0	0	0	0
