From 5ccfdfd96d4ff1e43f1cb8bf90273cb96d425265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Hennecart?= Date: Fri, 15 May 2020 13:35:54 +0000 Subject: [PATCH] [REF] event_sale: create registrations in batch in SO confirm or registration editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PURPOSE Create event registrations in batch. It will allow to customize group-creation of registrations, notably with automated rules for crm / event synchronization. SPECIFICATIONS Improve registration editor to create registrations in batch. Also be less dependent from context in its code, currently a bit weird. Move creation of registrations based on line from _action_confirm to action_confirm. Indeed it adds complexity and we are unsure it really helps having two methods. Update based on lines now create registrations in batch instead of one by one. LINKS Task ID 2258685 Prepare Task ID 2166679 (create leads from registrations) PR odoo/odoo#51341 Co-Authored-By: Jeremy Hennecart Co-Authored-By: Thibault Delavallée --- addons/event_sale/models/sale_order.py | 23 +++++++++---------- .../wizard/event_edit_registration.py | 14 +++++++---- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/addons/event_sale/models/sale_order.py b/addons/event_sale/models/sale_order.py index b3b79a3899c..28426520a18 100644 --- a/addons/event_sale/models/sale_order.py +++ b/addons/event_sale/models/sale_order.py @@ -18,16 +18,11 @@ class SaleOrder(models.Model): registrations_toupdate.write({'partner_id': vals['partner_id']}) return result - def _action_confirm(self): - res = super(SaleOrder, self)._action_confirm() - for so in self: - # confirm registration if it was free (otherwise it will be confirmed once invoice fully paid) - so.order_line._update_registrations(confirm=so.amount_total == 0, cancel_to_draft=False) - return res - def action_confirm(self): res = super(SaleOrder, self).action_confirm() for so in self: + # confirm registration if it was free (otherwise it will be confirmed once invoice fully paid) + so.order_line._update_registrations(confirm=so.amount_total == 0, cancel_to_draft=False) if any(so.order_line.filtered(lambda line: line.event_id)): return self.env['ir.actions.act_window'] \ .with_context(default_sale_order_id=so.id) \ @@ -87,13 +82,17 @@ class SaleOrderLine(models.Model): if cancel_to_draft: existing_registrations.filtered(lambda self: self.state == 'cancel').action_set_draft() + registrations_vals = [] for count in range(int(so_line.product_uom_qty) - len(existing_registrations)): - registration_vals = {} - if registration_data: - registration_vals = registration_data.pop() + values = { + 'sale_order_line_id': so_line.id, + 'sale_order_id': so_line.order_id.id + } # TDE CHECK: auto confirmation - registration_vals['sale_order_line_id'] = so_line.id - Registration.create(registration_vals) + if registration_data: + values.update(registration_data.pop()) + registrations_vals.append(values) + Registration.create(registrations_vals) return True @api.onchange('product_id') diff --git a/addons/event_sale/wizard/event_edit_registration.py b/addons/event_sale/wizard/event_edit_registration.py index 0cc1ab9c4ca..9db556ba804 100644 --- a/addons/event_sale/wizard/event_edit_registration.py +++ b/addons/event_sale/wizard/event_edit_registration.py @@ -41,6 +41,10 @@ class RegistrationEditor(models.TransientModel): 'event_id': so_line.event_id.id, 'event_ticket_id': so_line.event_ticket_id.id, 'sale_order_line_id': so_line.id, + 'name': so_line.order_partner_id.name, + 'email': so_line.order_partner_id.email, + 'phone': so_line.order_partner_id.phone, + 'mobile': so_line.order_partner_id.mobile, }]) res['event_registration_ids'] = attendee_list res = self._convert_to_write(res) @@ -48,15 +52,17 @@ class RegistrationEditor(models.TransientModel): def action_make_registration(self): self.ensure_one() + registrations_to_create = [] for registration_line in self.event_registration_ids: values = registration_line.get_registration_data() if registration_line.registration_id: registration_line.registration_id.write(values) else: - self.env['event.registration'].create(values) - if self.env.context.get('active_model') == 'sale.order': - for order in self.env['sale.order'].browse(self.env.context.get('active_ids', [])): - order.order_line._update_registrations(confirm=False) + registrations_to_create.append(values) + + self.env['event.registration'].create(registrations_to_create) + self.sale_order_id.order_line._update_registrations(confirm=self.sale_order_id.amount_total == 0) + return {'type': 'ir.actions.act_window_close'}