diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py index 9e0132f0fdd..2272f030c33 100644 --- a/addons/event/models/event_mail.py +++ b/addons/event/models/event_mail.py @@ -288,8 +288,6 @@ class EventMailRegistration(models.Model): def _compute_scheduled_date(self): for mail in self: if mail.registration_id: - date_open = mail.registration_id.date_open - date_open_datetime = date_open or fields.Datetime.now() - mail.scheduled_date = date_open_datetime + _INTERVALS[mail.scheduler_id.interval_unit](mail.scheduler_id.interval_nbr) + mail.scheduled_date = mail.registration_id.create_date + _INTERVALS[mail.scheduler_id.interval_unit](mail.scheduler_id.interval_nbr) else: mail.scheduled_date = False diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 081391d0625..e104434459f 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -27,9 +27,7 @@ class EventRegistration(models.Model): utm_source_id = fields.Many2one('utm.source', 'Source', index=True, ondelete='set null') utm_medium_id = fields.Many2one('utm.medium', 'Medium', index=True, ondelete='set null') # attendee - partner_id = fields.Many2one( - 'res.partner', string='Booked by', - states={'done': [('readonly', True)]}) + partner_id = fields.Many2one('res.partner', string='Booked by', tracking=1) name = fields.Char( string='Attendee Name', index=True, compute='_compute_name', readonly=False, store=True, tracking=10) @@ -37,7 +35,6 @@ class EventRegistration(models.Model): phone = fields.Char(string='Phone', compute='_compute_phone', readonly=False, store=True, tracking=12) mobile = fields.Char(string='Mobile', compute='_compute_mobile', readonly=False, store=True, tracking=13) # organization - date_open = fields.Datetime(string='Registration Date', readonly=True, default=lambda self: fields.Datetime.now()) # weird crash is directly now date_closed = fields.Datetime( string='Attended Date', compute='_compute_date_closed', readonly=False, store=True) @@ -51,26 +48,6 @@ class EventRegistration(models.Model): ('open', 'Confirmed'), ('done', 'Attended')], string='Status', default='draft', readonly=True, copy=False, tracking=True) - @api.onchange('partner_id') - def _onchange_partner_id(self): - """ Keep an explicit onchange on partner_id. Rationale : if user explicitly - changes the partner in interface, he want to update the whole customer - information. If partner_id is updated in code (e.g. updating your personal - information after having registered in website_event_sale) fields with a - value should not be reset as we don't know which one is the right one. - - In other words - * computed fields based on partner_id should only update missing - information. Indeed automated code cannot decide which information - is more accurate; - * interface should allow to update all customer related information - at once. We consider event users really want to update all fields - related to the partner; - """ - for registration in self: - if registration.partner_id: - registration.update(registration._synchronize_partner_values(registration.partner_id)) - @api.depends('partner_id') def _compute_name(self): for registration in self: diff --git a/addons/event/static/src/scss/event.scss b/addons/event/static/src/scss/event.scss index ec8ff7be2d0..703f90377e8 100644 --- a/addons/event/static/src/scss/event.scss +++ b/addons/event/static/src/scss/event.scss @@ -24,3 +24,12 @@ } } } + +.o_event_registration_view_tree { + .o_list_button > .o_btn_cancel_registration { + color: $danger; + &:hover { + color: darken($danger, $emphasized-link-hover-darken-percentage); + } + } +} diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index 47bd7584096..c3c32a9880a 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -102,7 +102,9 @@ class TestEventCommon(common.TransactionCase): @classmethod def _create_registrations(cls, event, reg_count): # create some registrations + create_date = fields.Datetime.now() registrations = cls.env['event.registration'].create([{ + 'create_date': create_date, 'event_id': event.id, 'name': 'Test Registration %s' % x, 'email': '_test_reg_%s@example.com' % x, diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index e1602efe73e..93667aba78e 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -7,62 +7,9 @@ from dateutil.relativedelta import relativedelta from odoo.addons.event.tests.common import TestEventCommon from odoo.exceptions import ValidationError -from odoo.tests.common import Form from odoo.tools import mute_logger -class TestEventUI(TestEventCommon): - - def test_event_registration_partner_sync(self): - """ Ensure onchange on partner_id is kept for interface, not for computed - fields. """ - registration_form = Form(self.env['event.registration'].with_context( - default_name='WrongName', - default_event_id=self.event_0.id - )) - self.assertEqual(registration_form.event_id, self.event_0) - self.assertEqual(registration_form.name, 'WrongName') - self.assertFalse(registration_form.email) - self.assertFalse(registration_form.phone) - self.assertFalse(registration_form.mobile) - - # trigger onchange - registration_form.partner_id = self.event_customer - self.assertEqual(registration_form.name, self.event_customer.name) - self.assertEqual(registration_form.email, self.event_customer.email) - self.assertEqual(registration_form.phone, self.event_customer.phone) - self.assertEqual(registration_form.mobile, self.event_customer.mobile) - - # save, check record matches Form values - registration = registration_form.save() - self.assertEqual(registration.partner_id, self.event_customer) - self.assertEqual(registration.name, self.event_customer.name) - self.assertEqual(registration.email, self.event_customer.email) - self.assertEqual(registration.phone, self.event_customer.phone) - self.assertEqual(registration.mobile, self.event_customer.mobile) - - # allow writing on some fields independently from customer config - registration.write({'phone': False, 'mobile': False}) - self.assertFalse(registration.phone) - self.assertFalse(registration.mobile) - - # reset partner should not reset other fields - registration.write({'partner_id': False}) - self.assertEqual(registration.partner_id, self.env['res.partner']) - self.assertEqual(registration.name, self.event_customer.name) - self.assertEqual(registration.email, self.event_customer.email) - self.assertFalse(registration.phone) - self.assertFalse(registration.mobile) - - # update to a new partner not through UI -> update only void feilds - registration.write({'partner_id': self.event_customer2.id}) - self.assertEqual(registration.partner_id, self.event_customer2) - self.assertEqual(registration.name, self.event_customer.name) - self.assertEqual(registration.email, self.event_customer.email) - self.assertEqual(registration.phone, self.event_customer2.phone) - self.assertEqual(registration.mobile, self.event_customer2.mobile) - - class TestEventFlow(TestEventCommon): @mute_logger('odoo.addons.base.models.ir_model', 'odoo.models') diff --git a/addons/event/tests/test_event_mail_schedule.py b/addons/event/tests/test_event_mail_schedule.py index 87ce2b33afd..85f639648d2 100644 --- a/addons/event/tests/test_event_mail_schedule.py +++ b/addons/event/tests/test_event_mail_schedule.py @@ -89,12 +89,14 @@ class TestMailSchedule(TestEventCommon, MockEmail): # create some registrations with freeze_time(now), self.mock_mail_gateway(): - reg1 = self.env['event.registration'].with_user(self.user_eventuser).create({ + reg1 = self.env['event.registration'].create({ + 'create_date': now, 'event_id': test_event.id, 'name': 'Reg1', 'email': 'reg1@example.com', }) - reg2 = self.env['event.registration'].with_user(self.user_eventuser).create({ + reg2 = self.env['event.registration'].create({ + 'create_date': now, 'event_id': test_event.id, 'name': 'Reg2', 'email': 'reg2@example.com', @@ -105,7 +107,7 @@ class TestMailSchedule(TestEventCommon, MockEmail): # check registration state self.assertTrue(all(reg.state == 'open' for reg in reg1 + reg2), 'Registrations: should be auto-confirmed') - self.assertTrue(all(reg.date_open == now for reg in reg1 + reg2), 'Registrations: should have open date set to confirm date') + self.assertTrue(all(reg.create_date == now for reg in reg1 + reg2), 'Registrations: should have open date set to confirm date') # verify that subscription scheduler was auto-executed after each registration self.assertEqual(len(after_sub_scheduler.mail_registration_ids), 2, 'event: should have 2 scheduled communication (1 / registration)') @@ -204,7 +206,8 @@ class TestMailSchedule(TestEventCommon, MockEmail): test_event.write({'auto_confirm': False}) with freeze_time(now_start), self.mock_mail_gateway(): - reg3 = self.env['event.registration'].with_user(self.user_eventuser).create({ + reg3 = self.env['event.registration'].create({ + 'create_date': now_start, 'event_id': test_event.id, 'name': 'Reg3', 'email': 'reg3@example.com', @@ -220,7 +223,7 @@ class TestMailSchedule(TestEventCommon, MockEmail): self.assertTrue(after_sub_scheduler_2.mail_done, 'event: scheduler on registration not updated next to draft registration') # confirm registration -> should trigger registration schedulers - # NOTE: currently all schedulers are based on date_open which equals create_date + # NOTE: currently all schedulers are based on create_date # meaning several communications may be sent in the time time with freeze_time(now_start + relativedelta(hours=1)), self.mock_mail_gateway(): reg3.action_confirm() diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index 712a6d2b174..2dfb2c4c691 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -121,6 +121,23 @@ + event.registration + Attendees + tree,kanban,form,calendar,graph + [('event_id', '=', active_id)] + {'default_event_id': active_id} + +

+ No Attendees yet! +

+ Wait until Attendees register to your Event or create their registrations manually. +

+
+
+ + + event.registration Attendees kanban,tree,form,calendar,graph @@ -181,7 +198,8 @@
- + Expected attendees @@ -495,9 +516,10 @@ event.registration.tree event.registration - + - @@ -505,12 +527,17 @@ - + +