[IMP] payment_stripe: prevent enabling Stripe if onboarding is ongoing

For now, you can enable the Stripe payment provider while onboarding
with Stripe Connect.

This raises two issues:
- This will raise errors in online payments because Stripe is not
completely configured;
- The button to continue the onboarding is not working anymore,
preventing the user to finish the configuration of his account from
Odoo.

This commit prevents enabling Stripe if the onboarding has been
initiated but is not finished. It also changes the way constants are
read from const.py to allow patching one of them if needed.

OPW-3149159

closes odoo/odoo#111534

X-original-commit: fa3bcac71d1699aa9b9a7bc1d6b6181a70171662
Signed-off-by: Antoine Vandevenne (anv) <anv@odoo.com>
Signed-off-by: Vallaeys Valentin (vava) <vava@odoo.com>
This commit is contained in:
Valentin Vallaeys (vava)
2023-01-31 21:16:56 +01:00
parent f18153b042
commit 956d0d26a3
2 changed files with 48 additions and 8 deletions
+11 -3
View File
@@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~15.4\n"
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-06-09 14:05+0000\n"
"PO-Revision-Date: 2022-06-09 14:05+0000\n"
"POT-Creation-Date: 2023-01-31 14:10+0000\n"
"PO-Revision-Date: 2023-01-31 14:10+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -199,6 +199,14 @@ msgid ""
"You cannot create a Stripe Webhook if your Stripe Secret Key is not set."
msgstr ""
#. module: payment_stripe
#: code:addons/payment_stripe/models/payment_acquirer.py:0
#, python-format
msgid ""
"You cannot set the provider state to Enabled until your onboarding to Stripe"
" is completed."
msgstr ""
#. module: payment_stripe
#: code:addons/payment_stripe/models/payment_acquirer.py:0
#, python-format
@@ -10,7 +10,7 @@ from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError
from odoo.addons.payment_stripe import utils as stripe_utils
from odoo.addons.payment_stripe.const import API_VERSION, PROXY_URL, HANDLED_WEBHOOK_EVENTS
from odoo.addons.payment_stripe import const
from odoo.addons.payment_stripe.controllers.onboarding import OnboardingController
from odoo.addons.payment_stripe.controllers.main import StripeController
@@ -61,6 +61,7 @@ class PaymentProvider(models.Model):
`state` together with writing on those custom fields, the constraint would be triggered.
:return: None
:raise ValidationError: If the provider of a connected account is set in state 'test'.
"""
for provider in self:
if provider.state == 'test' and provider._stripe_has_connected_account():
@@ -81,6 +82,37 @@ class PaymentProvider(models.Model):
self.ensure_one()
return False
@api.constrains('state')
def _check_onboarding_of_enabled_provider_is_completed(self):
""" Check that the provider cannot be set to 'enabled' if the onboarding is ongoing.
This constraint is defined in the present module to allow the export of the translation
string of the `ValidationError` should it be raised by modules that would fully implement
Stripe Connect.
:return: None
:raise ValidationError: If the provider of a connected account is set in state 'enabled'
while the onboarding is not finished.
"""
for provider in self:
if provider.state == 'enabled' and provider._stripe_onboarding_is_ongoing():
raise ValidationError(_(
"You cannot set the provider state to Enabled until your onboarding to Stripe "
"is completed."
))
def _stripe_onboarding_is_ongoing(self):
""" Return whether the provider is linked to an ongoing onboarding to Stripe Connect.
Note: This method serves as a hook for modules that would fully implement Stripe Connect.
Note: self.ensure_one()
:return: Whether the provider is linked to an ongoing onboarding to Stripe Connect
:rtype: bool
"""
self.ensure_one()
return False
# === ACTION METHODS === #
def action_stripe_connect_account(self, menu_id=None):
@@ -152,8 +184,8 @@ class PaymentProvider(models.Model):
webhook = self._stripe_make_request(
'webhook_endpoints', payload={
'url': self._get_stripe_webhook_url(),
'enabled_events[]': HANDLED_WEBHOOK_EVENTS,
'api_version': API_VERSION,
'enabled_events[]': const.HANDLED_WEBHOOK_EVENTS,
'api_version': const.API_VERSION,
}
)
self.stripe_webhook_secret = webhook.get('secret')
@@ -228,7 +260,7 @@ class PaymentProvider(models.Model):
url = url_join('https://api.stripe.com/v1/', endpoint)
headers = {
'AUTHORIZATION': f'Bearer {stripe_utils.get_secret_key(self)}',
'Stripe-Version': API_VERSION, # SetupIntent requires a specific version.
'Stripe-Version': const.API_VERSION, # SetupIntent requires a specific version.
**self._get_stripe_extra_request_headers(),
}
if method == 'POST' and idempotency_key:
@@ -365,7 +397,7 @@ class PaymentProvider(models.Model):
'proxy_data': self._stripe_prepare_proxy_data(stripe_payload=payload),
},
}
url = url_join(PROXY_URL, f'{version}/{endpoint}')
url = url_join(const.PROXY_URL, f'{version}/{endpoint}')
try:
response = requests.post(url=url, json=proxy_payload, timeout=60)
response.raise_for_status()