upgrade: Make card add / update work for remote servers.

This commit is contained in:
Aman Agrawal
2023-12-01 05:44:59 +00:00
committed by Tim Abbott
parent 9889dc38fe
commit e9bbb67035
5 changed files with 95 additions and 7 deletions

View File

@@ -2594,12 +2594,12 @@ class RemoteServerBillingSession(BillingSession): # nocoverage
@override @override
@property @property
def billing_session_url(self) -> str: 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 @override
@property @property
def billing_base_url(self) -> str: def billing_base_url(self) -> str:
return f"/server/${self.remote_server.uuid}" return f"/server/{self.remote_server.uuid}"
@override @override
def support_url(self) -> str: def support_url(self) -> str:

View File

@@ -10,6 +10,7 @@ from corporate.views.event_status import (
event_status_page, event_status_page,
remote_realm_event_status, remote_realm_event_status,
remote_realm_event_status_page, remote_realm_event_status_page,
remote_server_event_status,
remote_server_event_status_page, remote_server_event_status_page,
) )
from corporate.views.portico import ( from corporate.views.portico import (
@@ -33,6 +34,7 @@ from corporate.views.session import (
start_card_update_stripe_session, start_card_update_stripe_session,
start_card_update_stripe_session_for_realm_upgrade, start_card_update_stripe_session_for_realm_upgrade,
start_card_update_stripe_session_for_remote_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 ( from corporate.views.sponsorship import (
remote_realm_sponsorship, remote_realm_sponsorship,
@@ -43,7 +45,12 @@ from corporate.views.sponsorship import (
sponsorship_page, sponsorship_page,
) )
from corporate.views.support import support_request 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 corporate.views.webhook import stripe_webhook
from zerver.lib.rest import rest_path from zerver.lib.rest import rest_path
from zerver.lib.url_redirects import LANDING_PAGE_REDIRECTS from zerver.lib.url_redirects import LANDING_PAGE_REDIRECTS
@@ -180,6 +187,11 @@ urlpatterns += [
path("realm/<realm_uuid>/billing", remote_billing_page_realm, name="remote_billing_page_realm"), path("realm/<realm_uuid>/billing", remote_billing_page_realm, name="remote_billing_page_realm"),
path("server/<server_uuid>/", remote_billing_page_server, name="remote_billing_page_server"), path("server/<server_uuid>/", remote_billing_page_server, name="remote_billing_page_server"),
path("realm/<realm_uuid>/upgrade", remote_realm_upgrade_page, name="remote_realm_upgrade_page"), path("realm/<realm_uuid>/upgrade", remote_realm_upgrade_page, name="remote_realm_upgrade_page"),
path(
"server/<server_uuid>/upgrade",
remote_server_upgrade_page,
name="remote_server_upgrade_page",
),
path( path(
"realm/<realm_uuid>/sponsorship", "realm/<realm_uuid>/sponsorship",
remote_realm_sponsorship_page, remote_realm_sponsorship_page,
@@ -212,7 +224,12 @@ urlpatterns += [
"json/realm/<realm_uuid>/upgrade/session/start_card_update_session", "json/realm/<realm_uuid>/upgrade/session/start_card_update_session",
start_card_update_stripe_session_for_remote_realm_upgrade, start_card_update_stripe_session_for_remote_realm_upgrade,
), ),
path(
"json/server/<server_uuid>/upgrade/session/start_card_update_session",
start_card_update_stripe_session_for_remote_server_upgrade,
),
path("json/realm/<realm_uuid>/billing/event/status", remote_realm_event_status), path("json/realm/<realm_uuid>/billing/event/status", remote_realm_event_status),
path("json/server/<server_uuid>/billing/event/status", remote_server_event_status),
] ]
urlpatterns += [ urlpatterns += [

View File

@@ -6,9 +6,15 @@ from django.shortcuts import render
from corporate.lib.decorator import ( from corporate.lib.decorator import (
authenticated_remote_realm_management_endpoint, authenticated_remote_realm_management_endpoint,
authenticated_remote_server_management_endpoint,
self_hosting_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.decorator import require_organization_member, zulip_login_required
from zerver.lib.response import json_success from zerver.lib.response import json_success
from zerver.lib.typed_endpoint import typed_endpoint from zerver.lib.typed_endpoint import typed_endpoint
@@ -50,6 +56,22 @@ def remote_realm_event_status(
return json_success(request, data) 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 @zulip_login_required
@typed_endpoint @typed_endpoint
def event_status_page( def event_status_page(

View File

@@ -3,8 +3,15 @@ import logging
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from pydantic import Json from pydantic import Json
from corporate.lib.decorator import authenticated_remote_realm_management_endpoint from corporate.lib.decorator import (
from corporate.lib.stripe import RealmBillingSession, RemoteRealmBillingSession authenticated_remote_realm_management_endpoint,
authenticated_remote_server_management_endpoint,
)
from corporate.lib.stripe import (
RealmBillingSession,
RemoteRealmBillingSession,
RemoteServerBillingSession,
)
from corporate.models import Session from corporate.models import Session
from zerver.decorator import require_billing_access, require_organization_member from zerver.decorator import require_billing_access, require_organization_member
from zerver.lib.response import json_success from zerver.lib.response import json_success
@@ -67,3 +74,20 @@ def start_card_update_stripe_session_for_remote_realm_upgrade(
request, request,
data=session_data, 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,
)

View File

@@ -6,7 +6,10 @@ from django.http import HttpRequest, HttpResponse, HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from pydantic import Json 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 ( from corporate.lib.stripe import (
VALID_BILLING_MODALITY_VALUES, VALID_BILLING_MODALITY_VALUES,
VALID_BILLING_SCHEDULE_VALUES, VALID_BILLING_SCHEDULE_VALUES,
@@ -15,6 +18,7 @@ from corporate.lib.stripe import (
InitialUpgradeRequest, InitialUpgradeRequest,
RealmBillingSession, RealmBillingSession,
RemoteRealmBillingSession, RemoteRealmBillingSession,
RemoteServerBillingSession,
UpgradeRequest, UpgradeRequest,
) )
from corporate.models import CustomerPlan from corporate.models import CustomerPlan
@@ -120,3 +124,24 @@ def remote_realm_upgrade_page(
response = render(request, "corporate/upgrade.html", context=context) response = render(request, "corporate/upgrade.html", context=context)
return response 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