From ee15b8461d5b98d8711012d0d58fe8dbee2c733e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 26 Nov 2019 07:57:01 +0000 Subject: [PATCH] [REM] payment: dynamic domains Make the domain stricter as well: * no reason to have / match a token if the payment method is not electronic * don't lose the capture mode * don't remove the company filter though it's probably not useful (as the journal and payment should already be in the same company so the check on the token's acquirer's journal should be enough) The domain used to select the default payment should not matter too much. Task 2147923 closes odoo/odoo#40959 Signed-off-by: Xavier Morel (xmo) --- addons/payment/models/account_payment.py | 35 +++++++++++++------ .../payment/views/account_payment_views.xml | 1 + 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/addons/payment/models/account_payment.py b/addons/payment/models/account_payment.py index dc939989104..5c398c8f634 100644 --- a/addons/payment/models/account_payment.py +++ b/addons/payment/models/account_payment.py @@ -12,27 +12,40 @@ class AccountPayment(models.Model): payment_transaction_id = fields.Many2one('payment.transaction', string='Payment Transaction', readonly=True) payment_token_id = fields.Many2one( 'payment.token', string="Saved payment token", - domain="[('acquirer_id.capture_manually', '=', False), ('company_id', '=', company_id)]", + domain="""[ + (payment_method_code == 'electronic', '=', 1), + ('company_id', '=', company_id), + ('acquirer_id.capture_manually', '=', False), + ('acquirer_id.journal_id', '=', journal_id), + ('partner_id', 'in', related_partner_ids), + ]""", help="Note that tokens from acquirers set to only authorize transactions (instead of capturing the amount) are not available.") + related_partner_ids = fields.Many2many('res.partner', compute='_compute_related_partners') def _get_payment_chatter_link(self): self.ensure_one() return '%s' % (self.id, self.name) + @api.depends('partner_id.commercial_partner_id.child_ids') + def _compute_related_partners(self): + for p in self: + p.related_partner_ids = ( + p.partner_id + | p.partner_id.commercial_partner_id + | p.partner_id.commercial_partner_id.child_ids + )._origin + @api.onchange('partner_id', 'payment_method_id', 'journal_id') def _onchange_set_payment_token_id(self): - res = {} - - if not self.payment_method_code == 'electronic' or not self.partner_id or not self.journal_id: + if not (self.payment_method_code == 'electronic' and self.partner_id and self.journal_id): self.payment_token_id = False - return res + return - partners = self.partner_id | self.partner_id.commercial_partner_id | self.partner_id.commercial_partner_id.child_ids - domain = [('partner_id', 'in', partners.ids), ('acquirer_id.journal_id', '=', self.journal_id.id)] - self.payment_token_id = self.env['payment.token'].search(domain, limit=1) - - res['domain'] = {'payment_token_id': domain} - return res + self.payment_token_id = self.env['payment.token'].search([ + ('partner_id', 'in', self.related_partner_ids.ids), + ('acquirer_id.capture_manually', '=', False), + ('acquirer_id.journal_id', '=', self.journal_id.id), + ], limit=1) def _prepare_payment_transaction_vals(self): self.ensure_one() diff --git a/addons/payment/views/account_payment_views.xml b/addons/payment/views/account_payment_views.xml index 5d25c93773c..c6ce4c1a88d 100644 --- a/addons/payment/views/account_payment_views.xml +++ b/addons/payment/views/account_payment_views.xml @@ -11,6 +11,7 @@ +