[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
This commit is contained in:
Thibault Delavallée
2020-04-03 11:07:55 +00:00
parent 844909b0f1
commit 55c8367ce7
3 changed files with 49 additions and 28 deletions
+5 -1
View File
@@ -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
+7 -4
View File
@@ -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')
+37 -23
View File
@@ -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):