[FIX] payment: hide the tokenization input when required by the provider

Due to an oversight, the "Save my payment details" checkbox was shown on
the inline payment form of SEPA Direct Debit acquirers, which should
never happen because the transaction is *always* tokenized with those.

With this commit, the `_is_tokenization_required` method is slightly
refactored to read the provider from the current `payment.acquirer`
record rather than from the kwargs. This conveniently fixes the issue
and prevents it from happening again elsewhere.

closes odoo/odoo#95519

X-original-commit: ebeebd87ed6d687b96dda3006b81356dfa76d0a0
Related: odoo/enterprise#29237
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
This commit is contained in:
Antoine Vandevenne (anv)
2022-07-07 14:44:48 +02:00
parent 5212b01cfd
commit 889fbffb7f
2 changed files with 6 additions and 11 deletions
+5 -8
View File
@@ -173,11 +173,11 @@ class PaymentPortal(portal.CustomerPortal):
:rtype: dict
"""
show_tokenize_input_mapping = {}
for acquirer in acquirers_sudo:
show_tokenize_input = acquirer.allow_tokenization \
and not acquirer._is_tokenization_required(**kwargs) \
for acquirer_sudo in acquirers_sudo:
show_tokenize_input = acquirer_sudo.allow_tokenization \
and not acquirer_sudo._is_tokenization_required(**kwargs) \
and logged_in
show_tokenize_input_mapping[acquirer.id] = show_tokenize_input
show_tokenize_input_mapping[acquirer_sudo.id] = show_tokenize_input
return show_tokenize_input_mapping
def _get_payment_page_template_xmlid(self, **kwargs):
@@ -282,14 +282,11 @@ class PaymentPortal(portal.CustomerPortal):
if flow in ['redirect', 'direct']: # Direct payment or payment with redirection
acquirer_sudo = request.env['payment.acquirer'].sudo().browse(payment_option_id)
token_id = None
tokenization_required_or_requested = acquirer_sudo._is_tokenization_required(
provider=acquirer_sudo.provider, **kwargs
) or tokenization_requested
tokenize = bool(
# Don't tokenize if the user tried to force it through the browser's developer tools
acquirer_sudo.allow_tokenization
# Token is only created if required by the flow or requested by the user
and tokenization_required_or_requested
and (acquirer_sudo._is_tokenization_required(**kwargs) or tokenization_requested)
)
elif flow == 'token': # Payment by token
token_sudo = request.env['payment.token'].sudo().browse(payment_option_id)
+1 -3
View File
@@ -343,14 +343,12 @@ class PaymentAcquirer(models.Model):
compatible_acquirers = self.env['payment.acquirer'].search(domain)
return compatible_acquirers
@api.model
def _is_tokenization_required(self, provider=None, **kwargs):
def _is_tokenization_required(self, **kwargs):
""" Return whether tokenizing the transaction is required given its context.
For a module to make the tokenization required based on the transaction context, it must
override this method and return whether it is required.
:param str provider: The provider of the acquirer handling the transaction
:param dict kwargs: The transaction context. This parameter is not used here
:return: Whether tokenizing the transaction is required
:rtype: bool