diff options
| author | Thibault Delavallée <tde@odoo.com> | 2021-02-08 09:34:29 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2021-02-10 16:56:13 +0000 |
| commit | 1b59fe9aeb2e853b502b494344c57a194a8c0c3e (patch) | |
| tree | 4d1c964b7b494de56ffab694979ef58c163183cc /addons/event | |
| parent | 6eac6ede401fd949405b7e1c8c82acfa5a3f6a9d (diff) | |
[FIX] event: split stored editable computed fields compute method
RATIONALE
Stored editable fields receive their values either from compute either from
user input. If a user input is given to create / write compute method is not
called. If multiple fields are computed through the same method giving one
field value discard call to compute method and other fields are not called.
SPECIFICATIONS
Split ``_compute_contact_info`` compute method so that partner related fields
are independent.
LINKS
COM PR #65688
Task ID-2455165
Diffstat (limited to 'addons/event')
| -rw-r--r-- | addons/event/models/event_registration.py | 71 | ||||
| -rw-r--r-- | addons/event/tests/test_event_internals.py | 6 |
2 files changed, 51 insertions, 26 deletions
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({ |
