stripe: Move setup_upgrade_checkout_session_and... to BillingSession.

Moves the 'setup_upgrade_checkout_session_and_payment_intent'
function to the 'BillingSession' abstract class.

This refactoring will help in minimizing duplicate code while
supporting both realm and remote_server customers.
This commit is contained in:
Prakhar Pratyush
2023-11-10 18:33:56 +05:30
committed by Tim Abbott
parent f2e8d2dc07
commit 31f048d054
3 changed files with 57 additions and 61 deletions

View File

@@ -552,6 +552,50 @@ class BillingSession(ABC):
extra_data={"charge_automatically": charge_automatically}, extra_data={"charge_automatically": charge_automatically},
) )
def setup_upgrade_checkout_session_and_payment_intent(
self,
plan_tier: int,
seat_count: int,
licenses: int,
license_management: str,
billing_schedule: int,
billing_modality: str,
onboarding: bool,
) -> stripe.checkout.Session:
customer = self.update_or_create_stripe_customer()
assert customer is not None # for mypy
free_trial = is_free_trial_offer_enabled()
price_per_license = get_price_per_license(
plan_tier, billing_schedule, customer.default_discount
)
general_metadata = {
"billing_modality": billing_modality,
"billing_schedule": billing_schedule,
"licenses": licenses,
"license_management": license_management,
"price_per_license": price_per_license,
"seat_count": seat_count,
"type": "upgrade",
}
updated_metadata = self.update_data_for_checkout_session_and_payment_intent(
general_metadata
)
if free_trial:
if onboarding:
session_type = Session.FREE_TRIAL_UPGRADE_FROM_ONBOARDING_PAGE
else:
session_type = Session.FREE_TRIAL_UPGRADE_FROM_BILLING_PAGE
payment_intent = None
else:
session_type = Session.UPGRADE_FROM_BILLING_PAGE
payment_intent = self.create_stripe_payment_intent(
price_per_license, licenses, updated_metadata
)
stripe_session = self.create_stripe_checkout_session(
updated_metadata, session_type, payment_intent
)
return stripe_session
class RealmBillingSession(BillingSession): class RealmBillingSession(BillingSession):
def __init__(self, user: UserProfile, realm: Optional[Realm] = None) -> None: def __init__(self, user: UserProfile, realm: Optional[Realm] = None) -> None:

View File

@@ -1984,7 +1984,7 @@ class StripeTest(StripeTestCase):
stripe_session.id = "stripe_session_id" stripe_session.id = "stripe_session_id"
stripe_session.url = "stripe_session_url" stripe_session.url = "stripe_session_url"
with patch( with patch(
"corporate.views.upgrade.setup_upgrade_checkout_session_and_payment_intent", "corporate.lib.stripe.BillingSession.setup_upgrade_checkout_session_and_payment_intent",
return_value=stripe_session, return_value=stripe_session,
): ):
response = self.upgrade( response = self.upgrade(
@@ -2039,7 +2039,7 @@ class StripeTest(StripeTestCase):
hamlet = self.example_user("hamlet") hamlet = self.example_user("hamlet")
self.login_user(hamlet) self.login_user(hamlet)
with patch( with patch(
"corporate.views.upgrade.setup_upgrade_checkout_session_and_payment_intent", "corporate.lib.stripe.BillingSession.setup_upgrade_checkout_session_and_payment_intent",
side_effect=Exception, side_effect=Exception,
), self.assertLogs("corporate.stripe", "WARNING") as m: ), self.assertLogs("corporate.stripe", "WARNING") as m:
response = self.upgrade(talk_to_stripe=False) response = self.upgrade(talk_to_stripe=False)

View File

@@ -2,7 +2,6 @@ import logging
from decimal import Decimal from decimal import Decimal
from typing import Any, Dict, Optional from typing import Any, Dict, Optional
import stripe
from django import forms from django import forms
from django.conf import settings from django.conf import settings
from django.core import signing from django.core import signing
@@ -18,7 +17,6 @@ from corporate.lib.stripe import (
RealmBillingSession, RealmBillingSession,
ensure_customer_does_not_have_active_plan, ensure_customer_does_not_have_active_plan,
get_latest_seat_count, get_latest_seat_count,
get_price_per_license,
is_free_trial_offer_enabled, is_free_trial_offer_enabled,
process_initial_upgrade, process_initial_upgrade,
sign_string, sign_string,
@@ -28,7 +26,6 @@ from corporate.lib.stripe import (
from corporate.lib.support import get_support_url from corporate.lib.support import get_support_url
from corporate.models import ( from corporate.models import (
CustomerPlan, CustomerPlan,
Session,
ZulipSponsorshipRequest, ZulipSponsorshipRequest,
get_current_plan_by_customer, get_current_plan_by_customer,
get_customer_by_realm, get_customer_by_realm,
@@ -78,53 +75,6 @@ def check_upgrade_parameters(
) )
def setup_upgrade_checkout_session_and_payment_intent(
user: UserProfile,
plan_tier: int,
seat_count: int,
licenses: int,
license_management: str,
billing_schedule: int,
billing_modality: str,
onboarding: bool,
) -> stripe.checkout.Session:
billing_session = RealmBillingSession(user)
customer = billing_session.update_or_create_stripe_customer()
assert customer is not None # for mypy
free_trial = is_free_trial_offer_enabled()
price_per_license = get_price_per_license(
plan_tier, billing_schedule, customer.default_discount
)
general_metadata = {
"billing_modality": billing_modality,
"billing_schedule": billing_schedule,
"licenses": licenses,
"license_management": license_management,
"price_per_license": price_per_license,
"seat_count": seat_count,
"type": "upgrade",
}
updated_metadata = billing_session.update_data_for_checkout_session_and_payment_intent(
general_metadata
)
if free_trial:
if onboarding:
session_type = Session.FREE_TRIAL_UPGRADE_FROM_ONBOARDING_PAGE
else:
session_type = Session.FREE_TRIAL_UPGRADE_FROM_BILLING_PAGE
payment_intent = None
else:
session_type = Session.UPGRADE_FROM_BILLING_PAGE
payment_intent = billing_session.create_stripe_payment_intent(
price_per_license, licenses, updated_metadata
)
stripe_session = billing_session.create_stripe_checkout_session(
updated_metadata, session_type, payment_intent
)
return stripe_session
@require_organization_member @require_organization_member
@has_request_variables @has_request_variables
def upgrade( def upgrade(
@@ -170,15 +120,17 @@ def upgrade(
schedule schedule
] ]
if charge_automatically: if charge_automatically:
stripe_checkout_session = setup_upgrade_checkout_session_and_payment_intent( billing_session = RealmBillingSession(user)
user, stripe_checkout_session = (
CustomerPlan.STANDARD, billing_session.setup_upgrade_checkout_session_and_payment_intent(
seat_count, CustomerPlan.STANDARD,
licenses, seat_count,
license_management, licenses,
billing_schedule, license_management,
billing_modality, billing_schedule,
onboarding, billing_modality,
onboarding,
)
) )
return json_success( return json_success(
request, request,