summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2020-03-31 10:25:33 +0000
committerThibault Delavallée <tde@odoo.com>2020-04-03 11:07:55 +0000
commit55c8367ce7d6801d4af3dc813c63eafa4725657e (patch)
tree9a90490bb35af93d29158aa5ed3a36be5b681c51
parent844909b0f1c1cd9ce3f198c9af44e0699f674c77 (diff)
[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
-rw-r--r--addons/event/models/event_event.py6
-rw-r--r--addons/event/models/event_ticket.py11
-rw-r--r--addons/event/tests/test_event_internals.py60
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):