﻿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.	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=tzname)  # was but in test hardcoded ""UTC"" instead of `tzname`
                _qs = _qs.annotate(trunc_local_time=TruncSecond('timestamp', tzinfo=tz)) # could be Trunc_anything_
                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)

}}}

Problem - different TZ offsets
{{{
Failure
Traceback (most recent call last):
  File ""/home/jurgis/dev/new/tableair/sync_tableair-cloud/ta/api/bookables/tests/test_endpoints.py"", line 689, 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: 'foo'): 2016-12-31 16:00:00+00:00 != 2016-12-31 16:00:00-08:00
}}}"	Bug	closed	Database layer (models, ORM)	dev	Normal	wontfix	timezone, TruncBase, Union, PostgreSQL	Jurgis Pralgauskis	Unreviewed	0	0	0	0	0	0
