diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index b272dd6e1b5..dfddcc21bf2 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -4,6 +4,8 @@ import logging import pytz +from datetime import timedelta + from odoo import _, api, Command, fields, models from odoo.addons.base.models.res_partner import _tz_get from odoo.tools import format_datetime, is_html_empty @@ -88,6 +90,17 @@ class EventEvent(models.Model): _inherit = ['mail.thread', 'mail.activity.mixin'] _order = 'date_begin' + @api.model + def default_get(self, fields_list): + result = super().default_get(fields_list) + if 'date_begin' in fields_list and 'date_begin' not in result: + now = fields.Datetime.now() + # Round the datetime to the nearest half hour (e.g. 08:17 => 08:30 and 08:37 => 09:00) + result['date_begin'] = now.replace(second=0, microsecond=0) + timedelta(minutes=-now.minute % 30) + if 'date_end' in fields_list and 'date_end' not in result and result.get('date_begin'): + result['date_end'] = result['date_begin'] + timedelta(days=1) + return result + def _get_default_stage_id(self): return self.env['event.stage'].search([], limit=1) diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index 4713aa09716..147e24c9c85 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -90,6 +90,7 @@ class EventCase(common.TransactionCase): 'phone': '0456987654', 'mobile': '0456654321', }) + cls.reference_now = fields.Datetime.from_string('2022-09-05 15:11:34') @classmethod def _create_registrations(cls, event, reg_count): diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index dd021b25e73..ea18ac57a89 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -4,9 +4,11 @@ import datetime from dateutil.relativedelta import relativedelta +from freezegun import freeze_time from odoo.addons.event.tests.common import EventCase from odoo.exceptions import ValidationError +from odoo.tests.common import users from odoo.tools import mute_logger @@ -55,6 +57,32 @@ class TestEventFlow(EventCase): self.assertEqual(test_reg1.state, 'done', 'Event: wrong state of attended registration') self.assertEqual(test_event.seats_used, 2, 'Event: incorrect number of attendees after closing registration') + @users('user_eventmanager') + def test_event_default_datetime(self): + """ Check that the default date_begin and date_end are correctly set """ + + # Should apply default datetimes + with freeze_time(self.reference_now): + default_event = self.env['event.event'].create({ + 'name': 'Test Default Event', + }) + self.assertEqual(default_event.date_begin, datetime.datetime.strptime('2022-09-05 15:30:00', '%Y-%m-%d %H:%M:%S')) + self.assertEqual(default_event.date_end, datetime.datetime.strptime('2022-09-06 15:30:00', '%Y-%m-%d %H:%M:%S')) + + specific_datetimes = { + 'date_begin': self.reference_now + relativedelta(days=1), + 'date_end': self.reference_now + relativedelta(days=3), + } + + # Should not apply default datetimes if values are set manually + with freeze_time(self.reference_now): + event = self.env['event.event'].create({ + 'name': 'Test Event', + **specific_datetimes, + }) + self.assertEqual(event.date_begin, specific_datetimes['date_begin']) + self.assertEqual(event.date_end, specific_datetimes['date_end']) + @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models') def test_event_flow(self): """ Advanced event flow: no auto confirmation, manage minimum / maximum diff --git a/addons/event/views/event_event_views.xml b/addons/event/views/event_event_views.xml index faafbbc9b44..d95b628fbc5 100644 --- a/addons/event/views/event_event_views.xml +++ b/addons/event/views/event_event_views.xml @@ -35,7 +35,7 @@
@@ -148,7 +148,7 @@
- +