From e9bbb67035873bb90d256a7c9daee657f54a2949 Mon Sep 17 00:00:00 2001 From: Aman Agrawal Date: Fri, 1 Dec 2023 05:44:59 +0000 Subject: [PATCH] upgrade: Make card add / update work for remote servers. --- corporate/lib/stripe.py | 4 ++-- corporate/urls.py | 19 ++++++++++++++++++- corporate/views/event_status.py | 24 +++++++++++++++++++++++- corporate/views/session.py | 28 ++++++++++++++++++++++++++-- corporate/views/upgrade.py | 27 ++++++++++++++++++++++++++- 5 files changed, 95 insertions(+), 7 deletions(-) diff --git a/corporate/lib/stripe.py b/corporate/lib/stripe.py index c2f006fab8..1953e87412 100644 --- a/corporate/lib/stripe.py +++ b/corporate/lib/stripe.py @@ -2594,12 +2594,12 @@ class RemoteServerBillingSession(BillingSession): # nocoverage @override @property def billing_session_url(self) -> str: - return "TBD" + return f"{settings.EXTERNAL_URI_SCHEME}{settings.SELF_HOSTING_MANAGEMENT_SUBDOMAIN}.{settings.EXTERNAL_HOST}/server/{self.remote_server.uuid}" @override @property def billing_base_url(self) -> str: - return f"/server/${self.remote_server.uuid}" + return f"/server/{self.remote_server.uuid}" @override def support_url(self) -> str: diff --git a/corporate/urls.py b/corporate/urls.py index 8f682826ff..edbade8874 100644 --- a/corporate/urls.py +++ b/corporate/urls.py @@ -10,6 +10,7 @@ from corporate.views.event_status import ( event_status_page, remote_realm_event_status, remote_realm_event_status_page, + remote_server_event_status, remote_server_event_status_page, ) from corporate.views.portico import ( @@ -33,6 +34,7 @@ from corporate.views.session import ( start_card_update_stripe_session, start_card_update_stripe_session_for_realm_upgrade, start_card_update_stripe_session_for_remote_realm_upgrade, + start_card_update_stripe_session_for_remote_server_upgrade, ) from corporate.views.sponsorship import ( remote_realm_sponsorship, @@ -43,7 +45,12 @@ from corporate.views.sponsorship import ( sponsorship_page, ) from corporate.views.support import support_request -from corporate.views.upgrade import remote_realm_upgrade_page, upgrade, upgrade_page +from corporate.views.upgrade import ( + remote_realm_upgrade_page, + remote_server_upgrade_page, + upgrade, + upgrade_page, +) from corporate.views.webhook import stripe_webhook from zerver.lib.rest import rest_path from zerver.lib.url_redirects import LANDING_PAGE_REDIRECTS @@ -180,6 +187,11 @@ urlpatterns += [ path("realm//billing", remote_billing_page_realm, name="remote_billing_page_realm"), path("server//", remote_billing_page_server, name="remote_billing_page_server"), path("realm//upgrade", remote_realm_upgrade_page, name="remote_realm_upgrade_page"), + path( + "server//upgrade", + remote_server_upgrade_page, + name="remote_server_upgrade_page", + ), path( "realm//sponsorship", remote_realm_sponsorship_page, @@ -212,7 +224,12 @@ urlpatterns += [ "json/realm//upgrade/session/start_card_update_session", start_card_update_stripe_session_for_remote_realm_upgrade, ), + path( + "json/server//upgrade/session/start_card_update_session", + start_card_update_stripe_session_for_remote_server_upgrade, + ), path("json/realm//billing/event/status", remote_realm_event_status), + path("json/server//billing/event/status", remote_server_event_status), ] urlpatterns += [ diff --git a/corporate/views/event_status.py b/corporate/views/event_status.py index f0864dc382..54d8715445 100644 --- a/corporate/views/event_status.py +++ b/corporate/views/event_status.py @@ -6,9 +6,15 @@ from django.shortcuts import render from corporate.lib.decorator import ( authenticated_remote_realm_management_endpoint, + authenticated_remote_server_management_endpoint, self_hosting_management_endpoint, ) -from corporate.lib.stripe import EventStatusRequest, RealmBillingSession, RemoteRealmBillingSession +from corporate.lib.stripe import ( + EventStatusRequest, + RealmBillingSession, + RemoteRealmBillingSession, + RemoteServerBillingSession, +) from zerver.decorator import require_organization_member, zulip_login_required from zerver.lib.response import json_success from zerver.lib.typed_endpoint import typed_endpoint @@ -50,6 +56,22 @@ def remote_realm_event_status( return json_success(request, data) +@authenticated_remote_server_management_endpoint +@typed_endpoint +def remote_server_event_status( + request: HttpRequest, + billing_session: RemoteServerBillingSession, + *, + stripe_session_id: Optional[str] = None, + stripe_payment_intent_id: Optional[str] = None, +) -> HttpResponse: # nocoverage + event_status_request = EventStatusRequest( + stripe_session_id=stripe_session_id, stripe_payment_intent_id=stripe_payment_intent_id + ) + data = billing_session.get_event_status(event_status_request) + return json_success(request, data) + + @zulip_login_required @typed_endpoint def event_status_page( diff --git a/corporate/views/session.py b/corporate/views/session.py index 39e771becd..3c682a2010 100644 --- a/corporate/views/session.py +++ b/corporate/views/session.py @@ -3,8 +3,15 @@ import logging from django.http import HttpRequest, HttpResponse from pydantic import Json -from corporate.lib.decorator import authenticated_remote_realm_management_endpoint -from corporate.lib.stripe import RealmBillingSession, RemoteRealmBillingSession +from corporate.lib.decorator import ( + authenticated_remote_realm_management_endpoint, + authenticated_remote_server_management_endpoint, +) +from corporate.lib.stripe import ( + RealmBillingSession, + RemoteRealmBillingSession, + RemoteServerBillingSession, +) from corporate.models import Session from zerver.decorator import require_billing_access, require_organization_member from zerver.lib.response import json_success @@ -67,3 +74,20 @@ def start_card_update_stripe_session_for_remote_realm_upgrade( request, data=session_data, ) + + +@authenticated_remote_server_management_endpoint +@typed_endpoint +def start_card_update_stripe_session_for_remote_server_upgrade( + request: HttpRequest, + billing_session: RemoteServerBillingSession, + *, + manual_license_management: Json[bool] = False, +) -> HttpResponse: # nocoverage + session_data = billing_session.get_card_update_session_data_for_upgrade( + manual_license_management + ) + return json_success( + request, + data=session_data, + ) diff --git a/corporate/views/upgrade.py b/corporate/views/upgrade.py index 8fdc0e1785..d12d4558cc 100644 --- a/corporate/views/upgrade.py +++ b/corporate/views/upgrade.py @@ -6,7 +6,10 @@ from django.http import HttpRequest, HttpResponse, HttpResponseRedirect from django.shortcuts import render from pydantic import Json -from corporate.lib.decorator import authenticated_remote_realm_management_endpoint +from corporate.lib.decorator import ( + authenticated_remote_realm_management_endpoint, + authenticated_remote_server_management_endpoint, +) from corporate.lib.stripe import ( VALID_BILLING_MODALITY_VALUES, VALID_BILLING_SCHEDULE_VALUES, @@ -15,6 +18,7 @@ from corporate.lib.stripe import ( InitialUpgradeRequest, RealmBillingSession, RemoteRealmBillingSession, + RemoteServerBillingSession, UpgradeRequest, ) from corporate.models import CustomerPlan @@ -120,3 +124,24 @@ def remote_realm_upgrade_page( response = render(request, "corporate/upgrade.html", context=context) return response + + +@authenticated_remote_server_management_endpoint +@typed_endpoint +def remote_server_upgrade_page( + request: HttpRequest, + billing_session: RemoteServerBillingSession, + *, + manual_license_management: Json[bool] = False, +) -> HttpResponse: # nocoverage + initial_upgrade_request = InitialUpgradeRequest( + manual_license_management=manual_license_management, + tier=CustomerPlan.TIER_CLOUD_STANDARD, + ) + redirect_url, context = billing_session.get_initial_upgrade_context(initial_upgrade_request) + + if redirect_url: + return HttpResponseRedirect(redirect_url) + + response = render(request, "corporate/upgrade.html", context=context) + return response