diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 3f977b3df5d..58960460622 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -1,13 +1,12 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from dateutil.relativedelta import relativedelta from odoo import _, api, fields, models from odoo.tools import format_datetime from odoo.exceptions import AccessError, ValidationError -from dateutil.relativedelta import relativedelta - class EventRegistration(models.Model): _name = 'event.registration' @@ -32,10 +31,10 @@ class EventRegistration(models.Model): states={'done': [('readonly', True)]}) name = fields.Char( string='Attendee Name', index=True, - compute='_compute_contact_info', readonly=False, store=True, tracking=10) - email = fields.Char(string='Email', compute='_compute_contact_info', readonly=False, store=True, tracking=11) - phone = fields.Char(string='Phone', compute='_compute_contact_info', readonly=False, store=True, tracking=12) - mobile = fields.Char(string='Mobile', compute='_compute_contact_info', readonly=False, store=True, tracking=13) + 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) # 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( @@ -72,16 +71,40 @@ class EventRegistration(models.Model): registration.update(registration._synchronize_partner_values(registration.partner_id)) @api.depends('partner_id') - def _compute_contact_info(self): + def _compute_name(self): for registration in self: - if registration.partner_id: - partner_vals = self._synchronize_partner_values(registration.partner_id) - registration.update( - dict((fname, fvalue) - for fname, fvalue in partner_vals.items() - if fvalue and not (registration[fname] or registration._origin[fname]) - ) - ) + if not registration.name and registration.partner_id: + registration.name = registration._synchronize_partner_values( + registration.partner_id, + fnames=['name'] + ).get('name') or False + + @api.depends('partner_id') + def _compute_email(self): + for registration in self: + if not registration.email and registration.partner_id: + registration.email = registration._synchronize_partner_values( + registration.partner_id, + 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( + 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 @api.depends('state') def _compute_date_closed(self): @@ -109,6 +132,16 @@ class EventRegistration(models.Model): if any(registration.event_id != registration.event_ticket_id.event_id for registration in self if registration.event_ticket_id): raise ValidationError(_('Invalid event / ticket choice')) + def _synchronize_partner_values(self, partner, fnames=None): + if fnames is None: + fnames = ['name', 'email', 'phone', 'mobile'] + if partner: + contact_id = partner.address_get().get('contact', False) + if contact_id: + contact = self.env['res.partner'].browse(contact_id) + return dict((fname, contact[fname]) for fname in fnames if contact[fname]) + return {} + # ------------------------------------------------------------ # CRUD # ------------------------------------------------------------ @@ -158,14 +191,6 @@ class EventRegistration(models.Model): return False return True - def _synchronize_partner_values(self, partner): - if partner: - contact_id = partner.address_get().get('contact', False) - if contact_id: - contact = self.env['res.partner'].browse(contact_id) - return dict((fname, contact[fname]) for fname in ['name', 'email', 'phone', 'mobile'] if contact[fname]) - return {} - # ------------------------------------------------------------ # ACTIONS / BUSINESS # ------------------------------------------------------------ diff --git a/addons/event/tests/test_event_internals.py b/addons/event/tests/test_event_internals.py index e27db0709e6..5f4c7753e3d 100644 --- a/addons/event/tests/test_event_internals.py +++ b/addons/event/tests/test_event_internals.py @@ -351,9 +351,9 @@ class TestEventRegistrationData(TestEventCommon): self.assertEqual( new_reg.email, test_email, 'Registration should take user input over computed partner value') - # self.assertEqual( - # new_reg.phone, customer.phone, - # 'Registration should take partner value if not user input') + self.assertEqual( + new_reg.phone, customer.phone, + 'Registration should take partner value if not user input') # already filled information should not be updated event.write({