From 1296681cbdd92f789a8d0df2abc66bbe4d1075ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Debauche?= Date: Mon, 27 Jan 2020 13:54:42 +0000 Subject: [PATCH] [IMP] event(_sale): improve attendees integration Purpose ======= Improve the attendees management: improve views, actions, (views, actions). Specifications ============== In order to allow state management in batch, state field is made editable in multi edit mode of registrations. That way event managers are able to work in batch. It required to move some code currently called in custom action-called methods directly in write. It makes sense to consider that some required code is called by writing on state field instead of depending on calling the right method. Indeed there is not much "business" code to move: calling mail schedulers on confirmation, and putting the closing date when closing. Event and registration tree views are improved, some fields are now editable in multi edit mode. When a user register on a event from website, it will create a sale order and a partner (the customer of the SO). Set automatically the partner of the registration to the partner of the sale order. Task ID 2119333 PR #40949 --- addons/event/models/event_registration.py | 51 ++++++++--- addons/event/tests/test_event_flow.py | 4 +- addons/event/views/event_views.xml | 87 +++++++++---------- addons/event_sale/models/sale_order.py | 24 +++-- addons/event_sale/views/event_views.xml | 12 +++ .../website_event_sale/models/sale_order.py | 2 +- addons/website_sale/controllers/main.py | 1 + 7 files changed, 115 insertions(+), 66 deletions(-) diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 8f940a2812e..3a85bee3e68 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -61,9 +61,21 @@ class EventRegistration(models.Model): def create(self, vals): registration = super(EventRegistration, self).create(vals) if registration._check_auto_confirmation(): - registration.sudo().confirm_registration() + registration.sudo().action_confirm() return registration + def write(self, vals): + ret = super(EventRegistration, self).write(vals) + + if vals.get('state') == 'open': + # auto-trigger after_sub (on subscribe) mail schedulers, if needed + onsubscribe_schedulers = self.mapped('event_id.event_mail_ids').filtered(lambda s: s.interval_type == 'after_sub') + onsubscribe_schedulers.execute() + elif vals.get('state') == 'done' and 'date_closed' not in vals: + vals['date_closed'] = fields.Datetime.now() + + return ret + @api.model def _prepare_attendee_values(self, registration): """ Method preparing the values to create new attendees based on a @@ -83,23 +95,38 @@ class EventRegistration(models.Model): data.update({key: value for key, value in registration.items() if key in self._fields}) return data - def do_draft(self): + def name_get(self): + """ Custom name_get implementation to better differentiate registrations + linked to a given partner but with different name (one partner buying + several registrations) + + * name, partner_id has no name -> take name + * partner_id has name, name void or same -> take partner name + * both have name: partner + name + """ + ret_list = [] + for registration in self: + if registration.partner_id.name: + if registration.name and registration.name != registration.partner_id.name: + name = '%s, %s' % (registration.partner_id.name, registration.name) + else: + name = registration.partner_id.name + else: + name = registration.name + ret_list.append((registration.id, name)) + return ret_list + + def action_set_draft(self): self.write({'state': 'draft'}) - def confirm_registration(self): + def action_confirm(self): self.write({'state': 'open'}) - # auto-trigger after_sub (on subscribe) mail schedulers, if needed - onsubscribe_schedulers = self.event_id.event_mail_ids.filtered( - lambda s: s.interval_type == 'after_sub') - onsubscribe_schedulers.execute() - - def button_reg_close(self): + def action_set_done(self): """ Close Registration """ - for registration in self: - registration.write({'state': 'done', 'date_closed': fields.Datetime.now()}) + self.write({'state': 'done'}) - def button_reg_cancel(self): + def action_cancel(self): self.write({'state': 'cancel'}) @api.onchange('partner_id') diff --git a/addons/event/tests/test_event_flow.py b/addons/event/tests/test_event_flow.py index 6c317b74a02..572e64a8231 100644 --- a/addons/event/tests/test_event_flow.py +++ b/addons/event/tests/test_event_flow.py @@ -47,10 +47,10 @@ class TestEventFlow(TestEventCommon): }) # EventUser validates registrations - test_reg1.button_reg_close() + test_reg1.action_set_done() self.assertEqual(test_reg1.state, 'done', 'Event: wrong state of attended registration') self.assertEqual(test_event.seats_used, 1, 'Event: incorrect number of attendees after closing registration') - test_reg2.button_reg_close() + test_reg2.action_set_done() 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') diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index 62acfb7bba0..919c4251c43 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -291,18 +291,21 @@ event.event.tree event.event - + - - - - - - - - - - + + + + + + + + + + @@ -485,18 +488,20 @@ event.registration.tree event.registration - - + + + - + - - + + + -