From 55c8367ce7d6801d4af3dc813c63eafa4725657e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 31 Mar 2020 10:25:33 +0000 Subject: [PATCH] [IMP] event: add some test for is_ongoing with timezones Rumors were heard of is_ongoing not working well. First try with playing with timezones. Task ID 2228189 Community PR odoo/odoo#48652 X-original-commit: d54faa336da29ff3167edb2331edd3e2508bc64f --- addons/event/models/event_event.py | 6 ++- addons/event/models/event_ticket.py | 11 ++-- addons/event/tests/test_event_internals.py | 60 +++++++++++++--------- 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index 6a1b903eb15..b76ca84d875 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -303,7 +303,7 @@ class EventEvent(models.Model): for event in self: # Need to localize because it could begin late and finish early in # another timezone - event = event.with_context(tz=event.date_tz) + event = event._set_tz_context() begin_tz = fields.Datetime.context_timestamp(event, event.date_begin) end_tz = fields.Datetime.context_timestamp(event, event.date_end) event.is_one_day = (begin_tz.date() == end_tz.date()) @@ -437,6 +437,10 @@ class EventEvent(models.Model): else: return {} + def _set_tz_context(self): + self.ensure_one() + return self.with_context(tz=self.date_tz or 'UTC') + def action_set_done(self): """ Action which will move the events diff --git a/addons/event/models/event_ticket.py b/addons/event/models/event_ticket.py index 37572bc86eb..2d55a20aa35 100644 --- a/addons/event/models/event_ticket.py +++ b/addons/event/models/event_ticket.py @@ -75,8 +75,9 @@ class EventTicket(models.Model): @api.depends('end_sale_date', 'event_id.date_tz') def _compute_is_expired(self): for ticket in self: + ticket = ticket._set_tz_context() + current_date = fields.Date.context_today(ticket) if ticket.end_sale_date: - current_date = fields.Date.context_today(ticket.with_context(tz=ticket._get_ticket_tz())) ticket.is_expired = ticket.end_sale_date < current_date else: ticket.is_expired = False @@ -84,7 +85,8 @@ class EventTicket(models.Model): @api.depends('start_sale_date', 'end_sale_date', 'event_id.date_tz', 'seats_available', 'seats_max') def _compute_sale_available(self): for ticket in self: - current_date = fields.Date.context_today(ticket.with_context(tz=ticket._get_ticket_tz())) + ticket = ticket._set_tz_context() + current_date = fields.Date.context_today(ticket) if (ticket.start_sale_date and ticket.start_sale_date > current_date) or \ ticket.end_sale_date and ticket.end_sale_date < current_date or \ ticket.seats_available <= 0 and ticket.seats_max > 0: @@ -137,5 +139,6 @@ class EventTicket(models.Model): information. """ return '%s\n%s' % (self.display_name, self.event_id.display_name) - def _get_ticket_tz(self): - return self.event_id.date_tz or self.env.user.tz + def _set_tz_context(self): + self.ensure_one() + return self.with_context(tz=self.event_id.date_tz or 'UTC') diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index 9fa9b9476d5..862f19aaddf 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -13,12 +13,21 @@ from odoo.tools import mute_logger class TestEventData(TestEventCommon): + @classmethod + def setUpClass(cls): + super(TestEventData, cls).setUpClass() + cls.patcher = patch('odoo.addons.event.models.event_event.fields.Datetime', wraps=FieldsDatetime) + cls.mock_datetime = cls.patcher.start() + cls.mock_datetime.now.return_value = datetime(2020, 1, 31, 10, 0, 0) + cls.addClassCleanup(cls.patcher.stop) + + cls.event_0.write({ + 'date_begin': datetime(2020, 2, 1, 8, 30, 0), + 'date_end': datetime(2020, 2, 4, 18, 45, 0), + }) + @users('user_eventmanager') def test_event_date_computation(self): - self.patcher = patch('odoo.addons.event.models.event_event.fields.Datetime', wraps=FieldsDatetime) - self.mock_datetime = self.patcher.start() - self.mock_datetime.now.return_value = datetime(2020, 1, 31, 8, 0, 0) - event = self.event_0.with_user(self.env.user) event.write({ 'registration_ids': [(0, 0, {'partner_id': self.customer.id, 'name': 'test_reg'})], @@ -40,14 +49,25 @@ class TestEventData(TestEventCommon): event.date_begin = datetime(2020, 3, 1, 10, 0, 0) self.assertEqual(registration.get_date_range_str(), u'on Mar 1, 2020, 11:00:00 AM') + # Is actually 8:30 to 20:00 in Mexico event.write({ - 'date_begin': '2019-11-09 14:30:00', - 'date_end': '2019-11-10 02:00:00', + 'date_begin': datetime(2020, 1, 31, 14, 30, 0), + 'date_end': datetime(2020, 2, 1, 2, 0, 0), 'date_tz': 'Mexico/General' }) self.assertTrue(event.is_one_day) - self.patcher.stop() + @users('user_eventmanager') + def test_event_date_timezone(self): + event = self.event_0.with_user(self.env.user) + # Is actually 8:30 to 20:00 in Mexico + event.write({ + 'date_begin': datetime(2020, 1, 31, 14, 30, 0), + 'date_end': datetime(2020, 2, 1, 2, 0, 0), + 'date_tz': 'Mexico/General' + }) + self.assertTrue(event.is_one_day) + self.assertFalse(event.is_ongoing) @users('user_eventmanager') def test_event_fields(self): @@ -148,8 +168,8 @@ class TestEventData(TestEventCommon): # even with valid tickets, date limits registrations event.write({ - 'date_begin': datetime.now() - timedelta(days=3), - 'date_end': datetime.now() - timedelta(days=1), + 'date_begin': datetime(2020, 1, 28, 15, 0, 0), + 'date_end': datetime(2020, 1, 30, 15, 0, 0), }) self.assertFalse(event.event_registrations_open) @@ -160,7 +180,7 @@ class TestEventData(TestEventCommon): }) registration.action_confirm() event.write({ - 'date_end': datetime.now() + timedelta(days=3), + 'date_end': datetime(2020, 2, 1, 15, 0, 0), 'seats_max': 1, 'seats_limited': True, }) @@ -173,46 +193,40 @@ class TestEventData(TestEventCommon): self.assertTrue(event.event_registrations_open) # but tickets are expired - ticket.write({'end_sale_date': datetime.now() - timedelta(days=2)}) + ticket.write({'end_sale_date': datetime(2020, 1, 30, 15, 0, 0)}) self.assertTrue(ticket.is_expired) self.assertFalse(event.event_registrations_open) @users('user_eventmanager') def test_event_ongoing(self): - self.patcher = patch('odoo.addons.event.models.event_event.fields.Datetime', wraps=FieldsDatetime) - self.mock_datetime = self.patcher.start() - self.mock_datetime.now.return_value = datetime(2020, 1, 10, 8, 0, 0) - event_1 = self.env['event.event'].create({ 'name': 'Test Event 1', - 'date_begin': datetime(2020, 1, 10, 8, 0, 0), - 'date_end': datetime(2020, 1, 13, 18, 0, 0), + 'date_begin': datetime(2020, 1, 25, 8, 0, 0), + 'date_end': datetime(2020, 2, 1, 18, 0, 0), }) self.assertTrue(event_1.is_ongoing) ongoing_event_ids = self.env['event.event']._search([('is_ongoing', '=', True)]) self.assertIn(event_1.id, ongoing_event_ids) - event_1.update({'date_begin': datetime(2020, 1, 10, 9, 0, 0)}) + event_1.update({'date_begin': datetime(2020, 2, 1, 9, 0, 0)}) self.assertFalse(event_1.is_ongoing) ongoing_event_ids = self.env['event.event']._search([('is_ongoing', '=', True)]) self.assertNotIn(event_1.id, ongoing_event_ids) event_2 = self.env['event.event'].create({ 'name': 'Test Event 2', - 'date_begin': datetime(2020, 1, 7, 8, 0, 0), - 'date_end': datetime(2020, 1, 10, 8, 0, 0), + 'date_begin': datetime(2020, 1, 25, 8, 0, 0), + 'date_end': datetime(2020, 1, 28, 8, 0, 0), }) self.assertFalse(event_2.is_ongoing) finished_or_upcoming_event_ids = self.env['event.event']._search([('is_ongoing', '=', False)]) self.assertIn(event_2.id, finished_or_upcoming_event_ids) - event_2.update({'date_end': datetime(2020, 1, 10, 8, 0, 1)}) + event_2.update({'date_end': datetime(2020, 2, 2, 8, 0, 1)}) self.assertTrue(event_2.is_ongoing) finished_or_upcoming_event_ids = self.env['event.event']._search([('is_ongoing', '=', False)]) self.assertNotIn(event_2.id, finished_or_upcoming_event_ids) - self.patcher.stop() - class TestEventTicketData(TestEventCommon):