[IMP] website_event: round default datetime
Add default date_begin and date_end when creating an event. To avoid having weird time (like 11:23) we round date_begin to the nearest 30 minutes range and the date_end is set to the next day of date_begin. So for example if now is "2022-06-30 10:12" then: date_begin = "2022-06-30 10:30" and date_end = "2022-07-01 10:30" task-2845417 Part-of: odoo/odoo#91883
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user