From 643df62f12db9f4af895678fdcede82c3dc1f6d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 12 Jul 2023 09:32:42 +0200 Subject: [PATCH] [REF] event: merge phone and mobile fields on registration RATIONALE Merge two phone-related field on registration as they overlap. Having only one is sufficient for contact-oriented model like registration. SPECIFICATIONS Registration model currently holds two phone field, phone and mobile. This leads to having records with sometimes phone, sometimes mobile being filled. This makes phone flows not easy: we have to define fallbacks (use phone or mobile), data is not always synchronized, ... in the end what event users need is one phone field to be able to communicate with attendees. Having only one field is sufficient and simplifies the model. Keep only one phone field, instead of two. Merge phone and mobile into a single one, keeping phone as first value when having both available e.g. when synchronizing with the partner. Task-3366899 Part-of: odoo/odoo#128232 Co-authored-by: "Jeremy Hennecart" --- addons/event/__manifest__.py | 2 +- addons/event/models/event_registration.py | 48 ++++------- addons/event/tests/common.py | 8 +- addons/event/tests/test_event_internals.py | 80 +++++++++---------- .../event/views/event_registration_views.xml | 4 +- addons/event_booth/__manifest__.py | 2 +- addons/event_booth/data/mail_templates.xml | 4 - addons/event_booth/models/event_booth.py | 9 +-- .../tests/test_event_booth_internals.py | 1 - .../event_booth/views/event_booth_views.xml | 2 - addons/event_booth_sale/__manifest__.py | 2 +- .../models/event_booth_registration.py | 11 +-- .../tests/test_event_booth_sale.py | 3 - .../views/event_booth_registration_views.xml | 2 - addons/event_crm/models/event_lead_rule.py | 2 +- addons/event_crm/models/event_registration.py | 16 ++-- addons/event_crm/tests/common.py | 5 +- addons/event_crm/tests/test_event_crm_flow.py | 20 +++-- addons/event_sale/__manifest__.py | 2 +- addons/event_sale/tests/test_event_sale.py | 12 +-- .../wizard/event_edit_registration.py | 6 +- .../wizard/event_edit_registration.xml | 1 - addons/test_event_full/tests/common.py | 34 ++++---- .../test_event_full/tests/test_performance.py | 1 - .../models/event_registration.py | 2 +- .../website_event/models/website_visitor.py | 4 +- .../views/event_registration_views.xml | 2 +- .../controllers/event_booth.py | 8 +- .../event_booth_registration_templates.xml | 7 -- .../controllers/event_booth.py | 4 +- 30 files changed, 116 insertions(+), 188 deletions(-) diff --git a/addons/event/__manifest__.py b/addons/event/__manifest__.py index 12689659c87..ecba97514f5 100644 --- a/addons/event/__manifest__.py +++ b/addons/event/__manifest__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- { 'name': 'Events Organization', - 'version': '1.7', + 'version': '1.8', 'website': 'https://www.odoo.com/app/events', 'category': 'Marketing/Events', 'summary': 'Trainings, Conferences, Meetings, Exhibitions, Registrations', diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 857dedd70b0..4b6799407bf 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -28,12 +28,11 @@ class EventRegistration(models.Model): partner_id = fields.Many2one('res.partner', string='Booked by', tracking=1) name = fields.Char( string='Attendee Name', index='trigram', - compute='_compute_name', readonly=False, store=True, tracking=10) - email = fields.Char(string='Email', compute='_compute_email', readonly=False, store=True, tracking=11) - 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) + compute='_compute_name', readonly=False, store=True, tracking=2) + email = fields.Char(string='Email', compute='_compute_email', readonly=False, store=True, tracking=3) + phone = fields.Char(string='Phone', compute='_compute_phone', readonly=False, store=True, tracking=4) company_name = fields.Char( - string='Company Name', compute='_compute_company_name', readonly=False, store=True, tracking=14) + string='Company Name', compute='_compute_company_name', readonly=False, store=True, tracking=5) # organization date_closed = fields.Datetime( string='Attended Date', compute='_compute_date_closed', @@ -48,7 +47,7 @@ class EventRegistration(models.Model): state = fields.Selection([ ('draft', 'Unconfirmed'), ('cancel', 'Cancelled'), ('open', 'Confirmed'), ('done', 'Attended')], - string='Status', default='draft', readonly=True, copy=False, tracking=True) + string='Status', default='draft', readonly=True, copy=False, tracking=6) @api.depends('partner_id') def _compute_name(self): @@ -56,7 +55,7 @@ class EventRegistration(models.Model): if not registration.name and registration.partner_id: registration.name = registration._synchronize_partner_values( registration.partner_id, - fnames=['name'] + fnames={'name'}, ).get('name') or False @api.depends('partner_id') @@ -65,26 +64,18 @@ class EventRegistration(models.Model): if not registration.email and registration.partner_id: registration.email = registration._synchronize_partner_values( registration.partner_id, - fnames=['email'] + fnames={'email'}, ).get('email') or False @api.depends('partner_id') def _compute_phone(self): for registration in self: if not registration.phone and registration.partner_id: - registration.phone = registration._synchronize_partner_values( + partner_values = registration._synchronize_partner_values( registration.partner_id, - fnames=['phone'] - ).get('phone') or False - - @api.depends('partner_id') - def _compute_mobile(self): - for registration in self: - if not registration.mobile and registration.partner_id: - registration.mobile = registration._synchronize_partner_values( - registration.partner_id, - fnames=['mobile'] - ).get('mobile') or False + fnames={'phone', 'mobile'}, + ) + registration.phone = partner_values.get('phone') or partner_values.get('mobile') or False @api.depends('partner_id') def _compute_company_name(self): @@ -92,7 +83,7 @@ class EventRegistration(models.Model): if not registration.company_name and registration.partner_id: registration.company_name = registration._synchronize_partner_values( registration.partner_id, - fnames=['company_name'] + fnames={'company_name'}, ).get('company_name') or False @api.depends('state') @@ -111,7 +102,7 @@ class EventRegistration(models.Model): def _synchronize_partner_values(self, partner, fnames=None): if fnames is None: - fnames = ['name', 'email', 'phone', 'mobile'] + fnames = {'name', 'email', 'phone', 'mobile'} if partner: contact_id = partner.address_get().get('contact', False) if contact_id: @@ -125,12 +116,6 @@ class EventRegistration(models.Model): country = self.partner_id.country_id or self.event_id.country_id or self.env.company.country_id self.phone = self._phone_format(fname='phone', country=country) or self.phone - @api.onchange('mobile', 'event_id', 'partner_id') - def _onchange_mobile_validation(self): - if self.mobile: - country = self.partner_id.country_id or self.event_id.country_id or self.env.company.country_id - self.mobile = self._phone_format(fname='mobile', country=country) - # ------------------------------------------------------------ # CRUD # ------------------------------------------------------------ @@ -141,7 +126,7 @@ class EventRegistration(models.Model): all_partner_ids = set(values['partner_id'] for values in vals_list if values.get('partner_id')) all_event_ids = set(values['event_id'] for values in vals_list if values.get('event_id')) for values in vals_list: - if not values.get('phone') and not values.get('mobile'): + if not values.get('phone'): continue related_country = self.env['res.country'] @@ -151,10 +136,7 @@ class EventRegistration(models.Model): related_country = self.env['event.event'].with_prefetch(all_event_ids).browse(values['event_id']).country_id if not related_country: related_country = self.env.company.country_id - - for fname in {'mobile', 'phone'}: - if values.get(fname): - values[fname] = self._phone_format(number=values[fname], country=related_country) or values[fname] + values['phone'] = self._phone_format(number=values['phone'], country=related_country) or values['phone'] registrations = super(EventRegistration, self).create(vals_list) diff --git a/addons/event/tests/common.py b/addons/event/tests/common.py index 147e24c9c85..1122af2381f 100644 --- a/addons/event/tests/common.py +++ b/addons/event/tests/common.py @@ -99,8 +99,8 @@ class EventCase(common.TransactionCase): 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, - 'phone': '04560000%s%s' % (x, x), - } for x in range(0, reg_count)]) + 'name': f'Test Registration {idx}', + 'email': f'_test_reg_{idx}@example.com', + 'phone': f'04560000{idx}{idx}', + } for idx in range(0, reg_count)]) return registrations diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index db4f1ed3a16..5bad5b385f0 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -710,79 +710,75 @@ class TestEventRegistrationPhone(EventCase): """ Test onchange on phone / mobile, should try to format number """ event = self.test_event.with_user(self.env.user) - lead_form = Form(self.env['event.registration']) - lead_form.event_id = event - lead_form.mobile = '7200000011' - lead_form.phone = '7200000000' - self.assertEqual(lead_form.mobile, '+917200000011') - self.assertEqual(lead_form.phone, '+917200000000') + reg_form = Form(self.env['event.registration']) + reg_form.event_id = event + reg_form.phone = '7200000000' + self.assertEqual(reg_form.phone, '+917200000000') @users('user_eventregistrationdesk') def test_registration_phone_format(self): """ Test phone formatting: based on partner (BE numbers) or event (IN numbers) or company (BE numbers). """ + partner_mobileonly = self.env['res.partner'].sudo().create({ + 'name': 'Constantin Customer 3 Mobile', + 'email': 'constantin3test.example.com', + 'country_id': self.env.ref('base.be').id, + 'phone': False, + 'mobile': '0456987654', + }) event = self.test_event.with_user(self.env.user) - # customer_id, mobile, phone -> based on partner or event country + # customer_id, phone -> based on partner or event country sources = [ - (self.event_customer.id, None, None), # BE local on partner - (self.event_customer2.id, None, None), # BE local on partner - (self.event_customer2.id, '0456001122', None), # BE local + on partner - (False, '0456778899', '+32456778899'), # BE local + BE global - (False, '7200000000', False), # IN local - (False, False, '7200000011'), # IN local - (False, '7200000000', '7200000011'), # IN local - (False, '+917200000088', '+917200000099'), # IN global + (self.event_customer.id, None), # BE local on partner + (self.event_customer2.id, None), # BE local on partner + (partner_mobileonly.id, None), # BE local on partner + (self.event_customer2.id, '0456001122'), # BE local + on partner + (False, '0456778899'), # BE local + (False, '7200000000'), # IN local + (False, '+917200000088'), # IN global ] - # mobile, phone + # expected phone expected = [ - (False, '0485112233'), # partner values, no format - ('0456654321', '0456987654'), # partner values, no format - ('+32456001122', '0456987654'), # BE on partner / partner value, no format - ('0456778899', '+32456778899'), # IN on event -> cannot format BE - ('+917200000000', False), # IN on event - (False, '+917200000011'), # IN on event - ('+917200000000', '+917200000011'), # IN on event - ('+917200000088', '+917200000099'), # already formatted + '0485112233', # partner values, no format (phone only) + '0456987654', # partner values, no format (both: phone wins) + '0456987654', # partner values, no format (mobile only) + '+32456001122', # BE on partner + '0456778899', # IN on event -> cannot format BE + '+917200000000', # IN on event + '+917200000088', # already formatted ] - for (partner_id, mobile, phone), (exp_mobile, exp_phone) in zip(sources, expected): - with self.subTest(partner_id=partner_id, mobile=mobile, phone=phone): + for (partner_id, phone), exp_phone in zip(sources, expected): + with self.subTest(partner_id=partner_id, phone=phone): create_vals = { 'event_id': event.id, 'partner_id': partner_id, } - if mobile is not None: - create_vals['mobile'] = mobile if phone is not None: create_vals['phone'] = phone reg = self.env['event.registration'].create(create_vals) - self.assertEqual(reg.mobile, exp_mobile) self.assertEqual(reg.phone, exp_phone) # no country on event -> based on partner or event company country self.test_event.write({'address_id': False}) expected = [ - (False, '0485112233'), # partner values, no format - ('0456654321', '0456987654'), # partner values, no format - ('+32456001122', '0456987654'), # BE on partner / partner value, no format - ('+32456778899', '+32456778899'), # BE on company - ('7200000000', False), # BE on company -> cannot format IN - (False, '7200000011'), # BE on company -> cannot format IN - ('7200000000', '7200000011'), # BE on company -> cannot format IN - ('+917200000088', '+917200000099'), # already formatted + '0485112233', # partner values, no format (phone only) + '0456987654', # partner values, no format (both: phone wins) + '0456987654', # partner values, no format (mobile only) + '+32456001122', # BE on company + '+32456778899', # BE on company + '7200000000', # BE on company -> cannot format IN + '+917200000088', # already formatted ] - for (partner_id, mobile, phone), (exp_mobile, exp_phone) in zip(sources, expected): - with self.subTest(partner_id=partner_id, mobile=mobile, phone=phone): + for (partner_id, phone), exp_phone in zip(sources, expected): + with self.subTest(partner_id=partner_id, phone=phone): create_vals = { 'event_id': event.id, 'partner_id': partner_id, } - if mobile is not None: - create_vals['mobile'] = mobile if phone is not None: create_vals['phone'] = phone reg = self.env['event.registration'].create(create_vals) - self.assertEqual(reg.mobile, exp_mobile) self.assertEqual(reg.phone, exp_phone) diff --git a/addons/event/views/event_registration_views.xml b/addons/event/views/event_registration_views.xml index 7f15ae3d867..47f78b7f97f 100644 --- a/addons/event/views/event_registration_views.xml +++ b/addons/event/views/event_registration_views.xml @@ -15,7 +15,6 @@ - @@ -64,8 +63,7 @@ - - + diff --git a/addons/event_booth/__manifest__.py b/addons/event_booth/__manifest__.py index 80ae450a0be..7d087e9f921 100644 --- a/addons/event_booth/__manifest__.py +++ b/addons/event_booth/__manifest__.py @@ -4,7 +4,7 @@ { 'name': "Events Booths", 'category': 'Marketing/Events', - 'version': '1.0', + 'version': '1.1', 'summary': "Manage event booths", 'description': """ Create booths for your favorite event. diff --git a/addons/event_booth/data/mail_templates.xml b/addons/event_booth/data/mail_templates.xml index b5b7e41c37c..477ed9881a8 100644 --- a/addons/event_booth/data/mail_templates.xml +++ b/addons/event_booth/data/mail_templates.xml @@ -25,10 +25,6 @@
  • Renter Email:
  • - -
  • - Renter Mobile: -
  • Renter Phone: diff --git a/addons/event_booth/models/event_booth.py b/addons/event_booth/models/event_booth.py index 592d7223f60..b3e79def61a 100644 --- a/addons/event_booth/models/event_booth.py +++ b/addons/event_booth/models/event_booth.py @@ -21,7 +21,6 @@ class EventBooth(models.Model): partner_id = fields.Many2one('res.partner', string='Renter', tracking=True, copy=False) contact_name = fields.Char('Renter Name', compute='_compute_contact_name', readonly=False, store=True, copy=False) contact_email = fields.Char('Renter Email', compute='_compute_contact_email', readonly=False, store=True, copy=False) - contact_mobile = fields.Char('Renter Mobile', compute='_compute_contact_mobile', readonly=False, store=True, copy=False) contact_phone = fields.Char('Renter Phone', compute='_compute_contact_phone', readonly=False, store=True, copy=False) # state state = fields.Selection( @@ -42,17 +41,11 @@ class EventBooth(models.Model): if not booth.contact_email: booth.contact_email = booth.partner_id.email or False - @api.depends('partner_id') - def _compute_contact_mobile(self): - for booth in self: - if not booth.contact_mobile: - booth.contact_mobile = booth.partner_id.mobile or False - @api.depends('partner_id') def _compute_contact_phone(self): for booth in self: if not booth.contact_phone: - booth.contact_phone = booth.partner_id.phone or False + booth.contact_phone = booth.partner_id.phone or booth.partner_id.mobile or False @api.depends('state') def _compute_is_available(self): diff --git a/addons/event_booth/tests/test_event_booth_internals.py b/addons/event_booth/tests/test_event_booth_internals.py index 4dd7e1f7f87..d20c8a9c725 100644 --- a/addons/event_booth/tests/test_event_booth_internals.py +++ b/addons/event_booth/tests/test_event_booth_internals.py @@ -40,7 +40,6 @@ class TestEventData(TestEventBoothCommon): self.assertEqual(booth.contact_name, customer.name) self.assertEqual(booth.contact_email, customer_email) self.assertEqual(booth.contact_phone, customer.phone) - self.assertFalse(booth.contact_mobile, 'Data has no mobile') booth.write({ 'contact_email': '"New Emails" - @@ -75,7 +74,6 @@ - diff --git a/addons/event_booth_sale/__manifest__.py b/addons/event_booth_sale/__manifest__.py index ebdb1b78f32..4c2922c9856 100644 --- a/addons/event_booth_sale/__manifest__.py +++ b/addons/event_booth_sale/__manifest__.py @@ -4,7 +4,7 @@ { 'name': "Events Booths Sales", 'category': 'Marketing/Events', - 'version': '1.1', + 'version': '1.2', 'summary': "Manage event booths sale", 'description': """ Sell your event booths and track payments on sale orders. diff --git a/addons/event_booth_sale/models/event_booth_registration.py b/addons/event_booth_sale/models/event_booth_registration.py index 4d7c6995517..3f0b160636d 100644 --- a/addons/event_booth_sale/models/event_booth_registration.py +++ b/addons/event_booth_sale/models/event_booth_registration.py @@ -19,7 +19,6 @@ class EventBoothRegistration(models.Model): contact_name = fields.Char(string='Contact Name', compute='_compute_contact_name', readonly=False, store=True) contact_email = fields.Char(string='Contact Email', compute='_compute_contact_email', readonly=False, store=True) contact_phone = fields.Char(string='Contact Phone', compute='_compute_contact_phone', readonly=False, store=True) - contact_mobile = fields.Char(string='Contact Mobile', compute='_compute_contact_mobile', readonly=False, store=True) _sql_constraints = [('unique_registration', 'unique(sale_order_line_id, event_booth_id)', 'There can be only one registration for a booth by sale order line')] @@ -40,17 +39,11 @@ class EventBoothRegistration(models.Model): def _compute_contact_phone(self): for registration in self: if not registration.contact_phone: - registration.contact_phone = registration.partner_id.phone or False - - @api.depends('partner_id') - def _compute_contact_mobile(self): - for registration in self: - if not registration.contact_mobile: - registration.contact_mobile = registration.partner_id.mobile or False + registration.contact_phone = registration.partner_id.phone or registration.partner_id.mobile or False @api.model def _get_fields_for_booth_confirmation(self): - return ['sale_order_line_id', 'partner_id', 'contact_name', 'contact_email', 'contact_phone', 'contact_mobile'] + return ['sale_order_line_id', 'partner_id', 'contact_name', 'contact_email', 'contact_phone'] def action_confirm(self): for registration in self: diff --git a/addons/event_booth_sale/tests/test_event_booth_sale.py b/addons/event_booth_sale/tests/test_event_booth_sale.py index 4b32733a647..28ece1bf22f 100644 --- a/addons/event_booth_sale/tests/test_event_booth_sale.py +++ b/addons/event_booth_sale/tests/test_event_booth_sale.py @@ -106,9 +106,6 @@ class TestEventBoothSale(TestEventBoothSaleWData): self.assertEqual( booth.contact_name, self.event_customer.name, "Booth contact name should be the same as sale order customer name.") - self.assertEqual( - booth.contact_mobile, self.event_customer.mobile, - "Booth contact mobile should be the same as sale order customer mobile.") self.assertEqual( booth.contact_phone, self.event_customer.phone, "Booth contact phone should be the same as sale order customer phone.") diff --git a/addons/event_booth_sale/views/event_booth_registration_views.xml b/addons/event_booth_sale/views/event_booth_registration_views.xml index 84c5d6948fa..68b31115852 100644 --- a/addons/event_booth_sale/views/event_booth_registration_views.xml +++ b/addons/event_booth_sale/views/event_booth_registration_views.xml @@ -19,7 +19,6 @@ - @@ -38,7 +37,6 @@ - diff --git a/addons/event_crm/models/event_lead_rule.py b/addons/event_crm/models/event_lead_rule.py index 70d3a0fc250..45b095f3e2a 100644 --- a/addons/event_crm/models/event_lead_rule.py +++ b/addons/event_crm/models/event_lead_rule.py @@ -55,7 +55,7 @@ class EventLeadRule(models.Model): If conditions are met, leads are created with pre-filled informations defined on the rule (type, user_id, team_id). Contact information coming from the - registrations are computed (customer, name, email, phone, mobile, contact_name). + registrations are computed (customer, name, email, phone, contact_name). SPECIFICATIONS: OTHER POINTS diff --git a/addons/event_crm/models/event_registration.py b/addons/event_crm/models/event_registration.py index d84556811c7..09721ac8f12 100644 --- a/addons/event_crm/models/event_registration.py +++ b/addons/event_crm/models/event_registration.py @@ -215,26 +215,32 @@ class EventRegistration(models.Model): if (not phone_formatted or not partner_phone_formatted) and self.phone != valid_partner.phone: valid_partner = self.env['res.partner'] + registration_phone = self._find_first_notnull('phone') if valid_partner: contact_vals = self.env['crm.lead']._prepare_values_from_partner(valid_partner) # force email_from / phone only if not set on partner because those fields are now synchronized automatically if not valid_partner.email: contact_vals['email_from'] = self._find_first_notnull('email') if not valid_partner.phone: - contact_vals['phone'] = self._find_first_notnull('phone') + contact_vals['phone'] = registration_phone else: # don't force email_from + partner_id because those fields are now synchronized automatically contact_vals = { 'contact_name': self._find_first_notnull('name'), 'email_from': self._find_first_notnull('email'), - 'phone': self._find_first_notnull('phone'), + 'phone': registration_phone, 'lang_id': False, } contact_vals.update({ 'name': "%s - %s" % (self.event_id.name, valid_partner.name or self._find_first_notnull('name') or self._find_first_notnull('email')), 'partner_id': valid_partner.id, - 'mobile': valid_partner.mobile or self._find_first_notnull('mobile'), }) + # try to avoid copying registration_phone on both phone and mobile fields + # as would be noise; pay attention partner.hone is propagated through compute + mobile = valid_partner.mobile or registration_phone + if mobile != contact_vals.get('phone', valid_partner.phone): + contact_vals['mobile'] = valid_partner.mobile or registration_phone + return contact_vals def _get_lead_description(self, prefix='', line_counter=True, line_suffix=''): @@ -328,12 +334,12 @@ class EventRegistration(models.Model): """ Get registration fields linked to lead contact. Those are used notably to see if an update of lead is necessary or to fill contact values in ``_get_lead_contact_values())`` """ - return ['name', 'email', 'phone', 'mobile', 'partner_id'] + return ['name', 'email', 'phone', 'partner_id'] @api.model def _get_lead_description_fields(self): """ Get registration fields linked to lead description. Those are used - notablyto see if an update of lead is necessary or to fill description + notably to see if an update of lead is necessary or to fill description in ``_get_lead_description())`` """ return ['name', 'email', 'phone'] diff --git a/addons/event_crm/tests/common.py b/addons/event_crm/tests/common.py index 8197aca73ea..567a4bbcd1c 100644 --- a/addons/event_crm/tests/common.py +++ b/addons/event_crm/tests/common.py @@ -94,14 +94,15 @@ class EventCrmCase(TestCrmCommon, EventCase): self.assertEqual(lead.referred, event.name) # registration information + registration_phone = registrations._find_first_notnull('phone') self.assertEqual(lead.partner_id, partner) self.assertEqual(lead.name, '%s - %s' % (event.name, expected_reg_name)) self.assertNotIn('False', lead.name) # avoid a "Dear False" like construct ^^ (this assert is serious and intended) self.assertEqual(lead.contact_name, expected_contact_name) self.assertEqual(lead.partner_name, expected_partner_name) self.assertEqual(lead.email_from, partner.email if partner and partner.email else registrations._find_first_notnull('email')) - self.assertEqual(lead.phone, partner.phone if partner and partner.phone else registrations._find_first_notnull('phone')) - self.assertEqual(lead.mobile, partner.mobile if partner and partner.mobile else registrations._find_first_notnull('mobile')) + self.assertEqual(lead.phone, partner.phone if partner and partner.phone else registration_phone) + self.assertEqual(lead.mobile, partner.mobile if partner and partner.mobile else ((registration_phone != lead.phone) and registration_phone)) # description: to improve self.assertNotIn('False', lead.description) # avoid a "Dear False" like construct ^^ (this assert is serious and intended) diff --git a/addons/event_crm/tests/test_event_crm_flow.py b/addons/event_crm/tests/test_event_crm_flow.py index b0fe62e5f76..c590b4d7c68 100644 --- a/addons/event_crm/tests/test_event_crm_flow.py +++ b/addons/event_crm/tests/test_event_crm_flow.py @@ -2,10 +2,12 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from odoo.addons.event_crm.tests.common import TestEventCrmCommon +from odoo.tests import tagged from odoo.tests.common import users from odoo.tools import mute_logger +@tagged('event_flow') class TestEventCrmFlow(TestEventCrmCommon): @classmethod @@ -103,17 +105,16 @@ class TestEventCrmFlow(TestEventCrmCommon): def test_event_crm_flow_per_attendee_single_wo_partner(self): """ Single registration, attendee based, no partner involved, check contact info propagation """ - for name, email, mobile, phone in [ - ('My Name', 'super.email@test.example.com', '0456442211', '0456332211'), - (False, 'super.email@test.example.com', False, '0456442211'), - ('"My Name"', '"My Name" ', False, False), + for name, email, phone in [ + ('My Name', 'super.email@test.example.com', '0456442211'), + (False, 'super.email@test.example.com', False), + ('"My Name"', '"My Name" ', False), ]: - with self.subTest(name=name, email=email, mobile=mobile, phone=phone): + with self.subTest(name=name, email=email, phone=phone): registration = self.env['event.registration'].create({ 'name': name, 'partner_id': False, 'email': email, - 'mobile': mobile, 'phone': phone, 'event_id': self.event_0.id, }) @@ -123,8 +124,7 @@ class TestEventCrmFlow(TestEventCrmCommon): registration = self.env['event.registration'].create({ 'partner_id': self.event_customer.id, 'email': 'other.email@test.example.com', - 'phone': False, - 'mobile': '0456112233', + 'phone': '0456112233', 'event_id': self.event_0.id, }) self.assertLeadConvertion(self.test_rule_attendee, registration, partner=None) @@ -164,8 +164,7 @@ class TestEventCrmFlow(TestEventCrmCommon): registration = self.env['event.registration'].create({ 'partner_id': self.event_customer.id, 'email': 'trigger.test@not.test.example.com', - 'phone': False, - 'mobile': '0456112233', + 'phone': '0456112233', 'event_id': self.event_0.id, }) @@ -192,7 +191,6 @@ class TestEventCrmFlow(TestEventCrmCommon): 'partner_id': False, 'email': 'super.email@test.example.com', 'phone': False, - 'mobile': '0456332211', 'event_id': self.event_0.id, }) self.assertEqual(len(self.test_rule_order.lead_ids), 1) diff --git a/addons/event_sale/__manifest__.py b/addons/event_sale/__manifest__.py index b72a994c359..1d081c0ebc6 100644 --- a/addons/event_sale/__manifest__.py +++ b/addons/event_sale/__manifest__.py @@ -2,7 +2,7 @@ { 'name': 'Events Sales', - 'version': '1.2', + 'version': '1.3', 'category': 'Marketing/Events', 'website': 'https://www.odoo.com/app/events', 'description': """ diff --git a/addons/event_sale/tests/test_event_sale.py b/addons/event_sale/tests/test_event_sale.py index cf1ea2756d8..956f404f59f 100644 --- a/addons/event_sale/tests/test_event_sale.py +++ b/addons/event_sale/tests/test_event_sale.py @@ -110,7 +110,7 @@ class TestEventSale(TestEventSaleCommon): 'sale_order_line_id': ticket1_line.id, }) self.assertEqual(ticket1_reg1.partner_id, self.event_customer) - for field in ['name', 'email', 'phone', 'mobile']: + for field in ['name', 'email', 'phone']: self.assertEqual(ticket1_reg1[field], self.event_customer[field]) # EVENT REGISTRATION EDITOR @@ -126,7 +126,7 @@ class TestEventSale(TestEventSaleCommon): # check line linked to existing registration (ticket1_reg1) ticket1_editor_reg1 = editor.event_registration_ids.filtered(lambda line: line.registration_id) - for field in ['name', 'email', 'phone', 'mobile']: + for field in ['name', 'email', 'phone']: self.assertEqual(ticket1_editor_reg1[field], ticket1_reg1[field]) # check new lines @@ -144,7 +144,6 @@ class TestEventSale(TestEventSaleCommon): ticket1_editor_other[1].write({ 'name': 'ManualEntry2', 'email': 'manual.email.2@test.example.com', - 'mobile': '+32456222222', }) self.assertFalse(editor.seats_available_insufficient) @@ -170,14 +169,9 @@ class TestEventSale(TestEventSaleCommon): set(ticket1_new_reg.mapped('phone')), set(['+32456111111', self.event_customer._phone_format(fname='phone')]) ) - self.assertEqual( - set(ticket1_new_reg.mapped('mobile')), - set(['+32456222222', self.event_customer._phone_format(fname='mobile')]) - ) for field in ['name', 'email']: self.assertEqual(ticket2_new_reg[field], self.event_customer[field]) - for field in ['phone', 'mobile']: - self.assertEqual(ticket2_new_reg[field], self.event_customer._phone_format(fname=field)) + self.assertEqual(ticket2_new_reg['phone'], self.event_customer._phone_format(fname='phone')) # ADDING MANUAL LINES ON SO # ------------------------------------------------------------ diff --git a/addons/event_sale/wizard/event_edit_registration.py b/addons/event_sale/wizard/event_edit_registration.py index 2b13cfee473..13b55fdece4 100644 --- a/addons/event_sale/wizard/event_edit_registration.py +++ b/addons/event_sale/wizard/event_edit_registration.py @@ -67,7 +67,6 @@ class RegistrationEditor(models.TransientModel): 'name': reg.name, 'email': reg.email, 'phone': reg.phone, - 'mobile': reg.mobile, 'sale_order_line_id': so_line.id, }]) for count in range(int(so_line.product_uom_qty) - len(existing_registrations)): @@ -78,7 +77,6 @@ class RegistrationEditor(models.TransientModel): '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) @@ -114,7 +112,6 @@ class RegistrationEditorLine(models.TransientModel): event_ticket_id = fields.Many2one('event.event.ticket', string='Event Ticket') email = fields.Char(string='Email') phone = fields.Char(string='Phone') - mobile = fields.Char(string='Mobile') name = fields.Char(string='Name') def get_registration_data(self): @@ -124,8 +121,7 @@ class RegistrationEditorLine(models.TransientModel): 'event_ticket_id': self.event_ticket_id.id, 'partner_id': self.editor_id.sale_order_id.partner_id.id, 'name': self.name or self.editor_id.sale_order_id.partner_id.name, - 'phone': self.phone or self.editor_id.sale_order_id.partner_id.phone, - 'mobile': self.mobile or self.editor_id.sale_order_id.partner_id.mobile, + 'phone': self.phone or self.editor_id.sale_order_id.partner_id.phone or self.editor_id.sale_order_id.partner_id.mobile, 'email': self.email or self.editor_id.sale_order_id.partner_id.email, 'sale_order_id': self.editor_id.sale_order_id.id, 'sale_order_line_id': self.sale_order_line_id.id, diff --git a/addons/event_sale/wizard/event_edit_registration.xml b/addons/event_sale/wizard/event_edit_registration.xml index 9dd29152244..9876f1da7bf 100644 --- a/addons/event_sale/wizard/event_edit_registration.xml +++ b/addons/event_sale/wizard/event_edit_registration.xml @@ -22,7 +22,6 @@ - diff --git a/addons/test_event_full/tests/common.py b/addons/test_event_full/tests/common.py index b79b16b574e..a85449c10f5 100644 --- a/addons/test_event_full/tests/common.py +++ b/addons/test_event_full/tests/common.py @@ -250,39 +250,37 @@ class TestEventFullCommon(EventCrmCase, TestSalesCommon, MockVisitor): ], limit=1) cls.customer_data = [ - {'email': 'customer.email.%02d@test.example.com' % x, - 'name': 'My Customer %02d' % x, - 'mobile': '04569999%02d' % x, + {'email': f'customer.email.{idx:02d}@test.example.com', + 'name': f'My Customer {idx:02d}', 'partner_id': False, - 'phone': '04560000%02d' % x, - } for x in range(0, 10) + 'phone': f'04560000{idx:02d}', + } for idx in range(0, 10) ] cls.website_customer_data = [ - {'email': 'website.email.%02d@test.example.com' % x, - 'name': 'My Customer %02d' % x, - 'mobile': '04569999%02d' % x, + {'email': f'website.email.{idx:02d}@test.example.com', + 'name': f'My Customer {idx:02d}', 'partner_id': cls.env.ref('base.public_partner').id, - 'phone': '04560000%02d' % x, + 'phone': f'04560000{idx:02d}', 'registration_answer_ids': [ (0, 0, { 'question_id': cls.test_event.question_ids[0].id, - 'value_answer_id': cls.test_event.question_ids[0].answer_ids[(x % 2)].id, + 'value_answer_id': cls.test_event.question_ids[0].answer_ids[(idx % 2)].id, }), (0, 0, { 'question_id': cls.test_event.question_ids[1].id, - 'value_answer_id': cls.test_event.question_ids[1].answer_ids[(x % 2)].id, + 'value_answer_id': cls.test_event.question_ids[1].answer_ids[(idx % 2)].id, }), (0, 0, { 'question_id': cls.test_event.question_ids[2].id, - 'value_text_box': 'CustomerAnswer%s' % x, + 'value_text_box': f'CustomerAnswer{idx}', }) ], - } for x in range(0, 10) + } for idx in range(0, 10) ] cls.partners = cls.env['res.partner'].create([ - {'email': 'partner.email.%02d@test.example.com' % x, - 'name': 'PartnerCustomer', - 'mobile': '04569999%02d' % x, - 'phone': '04560000%02d' % x, - } for x in range(0, 10) + {'email': f'partner.email.{idx:02d}@test.example.com', + 'name': f'PartnerCustomer {idx:02d}', + 'mobile': f'04569999{idx:02d}', + 'phone': f'04560000{idx:02d}', + } for idx in range(0, 10) ]) def assertLeadConvertion(self, rule, registrations, partner=None, **expected): diff --git a/addons/test_event_full/tests/test_performance.py b/addons/test_event_full/tests/test_performance.py index de7a3cb237b..24a6a07fd51 100644 --- a/addons/test_event_full/tests/test_performance.py +++ b/addons/test_event_full/tests/test_performance.py @@ -306,7 +306,6 @@ class TestRegistrationPerformance(EventPerformanceCase): with Form(self.env['event.registration']) as reg_form: reg_form.event_id = event reg_form.email = 'email.00@test.example.com' - reg_form.mobile = '0456999999' reg_form.name = 'My Customer' reg_form.phone = '0456000000' _registration = reg_form.save() diff --git a/addons/website_event/models/event_registration.py b/addons/website_event/models/event_registration.py index aa93b29964f..2575f477631 100644 --- a/addons/website_event/models/event_registration.py +++ b/addons/website_event/models/event_registration.py @@ -14,7 +14,7 @@ class EventRegistration(models.Model): domain=[('question_type', '=', 'simple_choice')]) def _get_website_registration_allowed_fields(self): - return {'name', 'phone', 'email', 'mobile', 'company_name', 'event_id', 'partner_id', 'event_ticket_id'} + return {'name', 'phone', 'email', 'company_name', 'event_id', 'partner_id', 'event_ticket_id'} def _get_registration_summary(self): res = super()._get_registration_summary() diff --git a/addons/website_event/models/website_visitor.py b/addons/website_event/models/website_visitor.py index 70d009bc5bf..2f80761b245 100644 --- a/addons/website_event/models/website_visitor.py +++ b/addons/website_event/models/website_visitor.py @@ -39,7 +39,7 @@ class WebsiteVisitor(models.Model): for visitor in self: visitor.event_registration_count = visitor_mapping.get(visitor.id, 0) - @api.depends('event_registration_ids.email', 'event_registration_ids.mobile', 'event_registration_ids.phone') + @api.depends('event_registration_ids.email', 'event_registration_ids.phone') def _compute_email_phone(self): super(WebsiteVisitor, self)._compute_email_phone() @@ -48,7 +48,7 @@ class WebsiteVisitor(models.Model): if not visitor.email: visitor.email = next((reg.email for reg in linked_registrations if reg.email), False) if not visitor.mobile: - visitor.mobile = next((reg.mobile or reg.phone for reg in linked_registrations if reg.mobile or reg.phone), False) + visitor.mobile = next((reg.phone for reg in linked_registrations if reg.phone), False) @api.depends('event_registration_ids') def _compute_event_registered_ids(self): diff --git a/addons/website_event/views/event_registration_views.xml b/addons/website_event/views/event_registration_views.xml index 487954a17a3..452d513f3c9 100644 --- a/addons/website_event/views/event_registration_views.xml +++ b/addons/website_event/views/event_registration_views.xml @@ -17,7 +17,7 @@ event.registration - + diff --git a/addons/website_event_booth/controllers/event_booth.py b/addons/website_event_booth/controllers/event_booth.py index f78a2273ab0..9c850c06d65 100644 --- a/addons/website_event_booth/controllers/event_booth.py +++ b/addons/website_event_booth/controllers/event_booth.py @@ -58,7 +58,7 @@ class WebsiteEventBoothController(WebsiteEventController): default_contact = { 'name': request.env.user.partner_id.name, 'email': request.env.user.partner_id.email, - 'phone': request.env.user.partner_id.phone, + 'phone': request.env.user.partner_id.phone or request.env.user.partner_id.mobile, 'mobile': request.env.user.partner_id.mobile, } else: @@ -128,16 +128,13 @@ class WebsiteEventBoothController(WebsiteEventController): partner.name = kwargs['contact_name'] if not partner.phone and kwargs.get('contact_phone'): partner.phone = kwargs['contact_phone'] - if not partner.mobile and kwargs.get('contact_mobile'): - partner.mobile = kwargs['contact_mobile'] else: partner = request.env.user.partner_id return { 'partner_id': partner.id, 'contact_name': kwargs.get('contact_name') or partner.name, 'contact_email': kwargs.get('contact_email') or partner.email, - 'contact_mobile': kwargs.get('contact_mobile') or partner.mobile, - 'contact_phone': kwargs.get('contact_phone') or partner.phone, + 'contact_phone': kwargs.get('contact_phone') or partner.phone or partner.mobile, } def _prepare_booth_registration_success_values(self, event_name, booth_values): @@ -148,7 +145,6 @@ class WebsiteEventBoothController(WebsiteEventController): 'name': booth_values.get('contact_name'), 'email': booth_values.get('contact_email'), 'phone': booth_values.get('contact_phone'), - 'mobile': booth_values.get('contact_mobile'), }, }) diff --git a/addons/website_event_booth/views/event_booth_registration_templates.xml b/addons/website_event_booth/views/event_booth_registration_templates.xml index 8ba5d522caf..24b014d5ce9 100644 --- a/addons/website_event_booth/views/event_booth_registration_templates.xml +++ b/addons/website_event_booth/views/event_booth_registration_templates.xml @@ -44,13 +44,6 @@ t-att-value="default_contact.get('phone', '')"/> -
    - -
    - -
    -