mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	upgrade: Make card add / update work for remote servers.
This commit is contained in:
		@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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/<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("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(
 | 
			
		||||
        "realm/<realm_uuid>/sponsorship",
 | 
			
		||||
        remote_realm_sponsorship_page,
 | 
			
		||||
@@ -212,7 +224,12 @@ urlpatterns += [
 | 
			
		||||
        "json/realm/<realm_uuid>/upgrade/session/start_card_update_session",
 | 
			
		||||
        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/server/<server_uuid>/billing/event/status", remote_server_event_status),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
urlpatterns += [
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user