mirror of
https://github.com/zulip/zulip.git
synced 2025-11-14 10:57:58 +00:00
sponsorship: Populate sponsorship page with correct context.
Fixes sponsorship page to work for remote realm and server.
This commit is contained in:
@@ -2162,8 +2162,28 @@ class BillingSession(ABC):
|
|||||||
raise JsonableError(_("Pass stripe_session_id or stripe_payment_intent_id"))
|
raise JsonableError(_("Pass stripe_session_id or stripe_payment_intent_id"))
|
||||||
|
|
||||||
def get_sponsorship_request_context(self) -> Optional[Dict[str, Any]]:
|
def get_sponsorship_request_context(self) -> Optional[Dict[str, Any]]:
|
||||||
context: Dict[str, Any] = {}
|
|
||||||
customer = self.get_customer()
|
customer = self.get_customer()
|
||||||
|
is_remotely_hosted = isinstance(
|
||||||
|
self, (RemoteRealmBillingSession, RemoteServerBillingSession)
|
||||||
|
)
|
||||||
|
|
||||||
|
# We only support sponsorships for these plans.
|
||||||
|
sponsored_plan_name = CustomerPlan.name_from_tier(CustomerPlan.TIER_CLOUD_STANDARD)
|
||||||
|
if is_remotely_hosted:
|
||||||
|
sponsored_plan_name = CustomerPlan.name_from_tier(
|
||||||
|
CustomerPlan.TIER_SELF_HOSTED_COMMUNITY
|
||||||
|
)
|
||||||
|
|
||||||
|
plan_name = "Zulip Cloud Free"
|
||||||
|
if is_remotely_hosted:
|
||||||
|
plan_name = "Self-managed"
|
||||||
|
|
||||||
|
context: Dict[str, Any] = {
|
||||||
|
"billing_base_url": self.billing_base_url,
|
||||||
|
"is_remotely_hosted": is_remotely_hosted,
|
||||||
|
"sponsored_plan_name": sponsored_plan_name,
|
||||||
|
"plan_name": plan_name,
|
||||||
|
}
|
||||||
|
|
||||||
if customer is not None and customer.sponsorship_pending:
|
if customer is not None and customer.sponsorship_pending:
|
||||||
if self.on_paid_plan():
|
if self.on_paid_plan():
|
||||||
@@ -2173,18 +2193,13 @@ class BillingSession(ABC):
|
|||||||
|
|
||||||
if self.is_sponsored():
|
if self.is_sponsored():
|
||||||
context["is_sponsored"] = True
|
context["is_sponsored"] = True
|
||||||
|
context["plan_name"] = sponsored_plan_name
|
||||||
|
|
||||||
if customer is not None:
|
if customer is not None:
|
||||||
plan = get_current_plan_by_customer(customer)
|
plan = get_current_plan_by_customer(customer)
|
||||||
if plan is not None:
|
if plan is not None:
|
||||||
context["plan_name"] = plan.name
|
context["plan_name"] = plan.name
|
||||||
context["free_trial"] = plan.is_free_trial()
|
context["free_trial"] = plan.is_free_trial()
|
||||||
elif self.is_sponsored():
|
|
||||||
# We don't create CustomerPlan objects for fully sponsored realms via support page.
|
|
||||||
context["plan_name"] = "Zulip Cloud Standard"
|
|
||||||
else:
|
|
||||||
# TODO: Don't hardcode this plan name.
|
|
||||||
context["plan_name"] = "Zulip Cloud Free"
|
|
||||||
|
|
||||||
self.add_sponsorship_info_to_context(context)
|
self.add_sponsorship_info_to_context(context)
|
||||||
return context
|
return context
|
||||||
@@ -2637,6 +2652,7 @@ class RealmBillingSession(BillingSession):
|
|||||||
key=sponsorship_org_type_key_helper,
|
key=sponsorship_org_type_key_helper,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
context["org_name"] = self.realm.name
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def get_sponsorship_request_session_specific_context(
|
def get_sponsorship_request_session_specific_context(
|
||||||
@@ -2924,6 +2940,7 @@ class RemoteRealmBillingSession(BillingSession): # nocoverage
|
|||||||
key=sponsorship_org_type_key_helper,
|
key=sponsorship_org_type_key_helper,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
context["org_name"] = self.remote_realm.host
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def get_sponsorship_request_session_specific_context(
|
def get_sponsorship_request_session_specific_context(
|
||||||
@@ -3224,6 +3241,7 @@ class RemoteServerBillingSession(BillingSession): # nocoverage
|
|||||||
key=sponsorship_org_type_key_helper,
|
key=sponsorship_org_type_key_helper,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
context["org_name"] = self.remote_server.hostname
|
||||||
|
|
||||||
@override
|
@override
|
||||||
def get_sponsorship_request_session_specific_context(
|
def get_sponsorship_request_session_specific_context(
|
||||||
|
|||||||
@@ -299,6 +299,7 @@ class CustomerPlan(models.Model):
|
|||||||
CustomerPlan.TIER_CLOUD_ENTERPRISE: "Zulip Enterprise",
|
CustomerPlan.TIER_CLOUD_ENTERPRISE: "Zulip Enterprise",
|
||||||
CustomerPlan.TIER_SELF_HOSTED_LEGACY: "Self-managed",
|
CustomerPlan.TIER_SELF_HOSTED_LEGACY: "Self-managed",
|
||||||
CustomerPlan.TIER_SELF_HOSTED_BUSINESS: "Zulip Business",
|
CustomerPlan.TIER_SELF_HOSTED_BUSINESS: "Zulip Business",
|
||||||
|
CustomerPlan.TIER_SELF_HOSTED_COMMUNITY: "Community",
|
||||||
}[tier]
|
}[tier]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -233,8 +233,8 @@ urlpatterns += [
|
|||||||
name="remote_server_event_status_page",
|
name="remote_server_event_status_page",
|
||||||
),
|
),
|
||||||
# Remote variants of above API endpoints.
|
# Remote variants of above API endpoints.
|
||||||
path("json/realm/<realm_uuid>/sponsorship", remote_realm_sponsorship),
|
path("json/realm/<realm_uuid>/billing/sponsorship", remote_realm_sponsorship),
|
||||||
path("json/server/<server_uuid>/sponsorship", remote_server_sponsorship),
|
path("json/server/<server_uuid>/billing/sponsorship", remote_server_sponsorship),
|
||||||
path(
|
path(
|
||||||
"json/realm/<realm_uuid>/billing/session/start_card_update_session",
|
"json/realm/<realm_uuid>/billing/session/start_card_update_session",
|
||||||
start_card_update_stripe_session_for_remote_realm,
|
start_card_update_stripe_session_for_remote_realm,
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ def remote_realm_sponsorship_page(
|
|||||||
) -> HttpResponse: # nocoverage
|
) -> HttpResponse: # nocoverage
|
||||||
context = billing_session.get_sponsorship_request_context()
|
context = billing_session.get_sponsorship_request_context()
|
||||||
if context is None:
|
if context is None:
|
||||||
return HttpResponseRedirect(reverse("remote_realm_billing_page"))
|
return HttpResponseRedirect(
|
||||||
|
reverse("remote_realm_billing_page", args=(billing_session.remote_realm.uuid,))
|
||||||
|
)
|
||||||
|
|
||||||
return render(request, "corporate/sponsorship.html", context=context)
|
return render(request, "corporate/sponsorship.html", context=context)
|
||||||
|
|
||||||
@@ -49,7 +51,9 @@ def remote_server_sponsorship_page(
|
|||||||
) -> HttpResponse: # nocoverage
|
) -> HttpResponse: # nocoverage
|
||||||
context = billing_session.get_sponsorship_request_context()
|
context = billing_session.get_sponsorship_request_context()
|
||||||
if context is None:
|
if context is None:
|
||||||
return HttpResponseRedirect(reverse("remote_server_billing_page"))
|
return HttpResponseRedirect(
|
||||||
|
reverse("remote_server_billing_page", args=(billing_session.remote_server.uuid,))
|
||||||
|
)
|
||||||
|
|
||||||
return render(request, "corporate/sponsorship.html", context=context)
|
return render(request, "corporate/sponsorship.html", context=context)
|
||||||
|
|
||||||
|
|||||||
@@ -11,13 +11,20 @@
|
|||||||
<div class="center-block new-style">
|
<div class="center-block new-style">
|
||||||
<div class="alert alert-success sponsorship-page-success" id="sponsorship-status-success-message-top">
|
<div class="alert alert-success sponsorship-page-success" id="sponsorship-status-success-message-top">
|
||||||
{% if is_sponsored %}
|
{% if is_sponsored %}
|
||||||
Zulip is sponsoring a free <a href="/plans/">Zulip Cloud Standard</a> plan for this organization. 🎉
|
Zulip is sponsoring a free <a href="{{ billing_base_url }}/plans/">{{ sponsored_plan_name }}</a> plan for this organization. 🎉
|
||||||
{% else %}
|
{% else %}
|
||||||
This organization has requested sponsorship for a <a href="/plans/">Zulip Cloud Standard</a> plan. <a href="mailto:support@zulip.com">Contact Zulip support</a> with any questions or updates.
|
This organization has requested sponsorship for a <a href="{{ billing_base_url }}/plans/">{{ sponsored_plan_name }}</a> plan. <a href="mailto:support@zulip.com">Contact Zulip support</a> with any questions or updates.
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="pitch">
|
<div class="pitch">
|
||||||
<h1>Zulip Cloud billing for {{realm_name}}</h1>
|
<h1>
|
||||||
|
Zulip
|
||||||
|
{% if is_remotely_hosted %}
|
||||||
|
{% else %}
|
||||||
|
Cloud
|
||||||
|
{% endif %}
|
||||||
|
billing for {{ org_name }}
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="white-box">
|
<div class="white-box">
|
||||||
<div id="sponsorship-status-page-details">
|
<div id="sponsorship-status-page-details">
|
||||||
@@ -49,16 +56,22 @@
|
|||||||
<div class="register-account flex full-page sponsorship-page">
|
<div class="register-account flex full-page sponsorship-page">
|
||||||
<div class="center-block new-style">
|
<div class="center-block new-style">
|
||||||
<div class="pitch">
|
<div class="pitch">
|
||||||
<h1>Request Zulip Cloud sponsorship</h1>
|
<h1>
|
||||||
|
Request Zulip
|
||||||
|
{% if is_remotely_hosted %}
|
||||||
|
{% else %}
|
||||||
|
Cloud
|
||||||
|
{% endif %} sponsorship
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<div class="white-box">
|
<div class="white-box">
|
||||||
<div id="sponsorship-error" class="alert alert-danger"></div>
|
<div id="sponsorship-error" class="alert alert-danger"></div>
|
||||||
<div id="sponsorship-input-section">
|
<div id="sponsorship-input-section">
|
||||||
<form id="sponsorship-form" method="post">
|
<form id="sponsorship-form" method="post" data-billing-base-url="{{ billing_base_url }}">
|
||||||
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
|
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
|
||||||
<div class="input-box sponsorship-form-field no-validation">
|
<div class="input-box sponsorship-form-field no-validation">
|
||||||
<label for="org-name" class="inline-block label-title">Organization</label>
|
<label for="org-name" class="inline-block label-title">Organization</label>
|
||||||
<div id="org-name" class="not-editable-realm-field">{{ realm_name }}</div>
|
<div id="org-name" class="not-editable-realm-field">{{ org_name }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-box sponsorship-form-field">
|
<div class="input-box sponsorship-form-field">
|
||||||
<div class="inline-block relative">
|
<div class="inline-block relative">
|
||||||
|
|||||||
@@ -53,10 +53,10 @@ function create_ajax_request(): void {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const billing_base_url = $form.attr("data-billing-base-url") ?? "";
|
||||||
void $.ajax({
|
void $.ajax({
|
||||||
type: "post",
|
type: "post",
|
||||||
// TODO: This needs to be conditional on billing session type
|
url: `/json${billing_base_url}/billing/sponsorship`,
|
||||||
url: "/json/billing/sponsorship",
|
|
||||||
data,
|
data,
|
||||||
success() {
|
success() {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
|
|||||||
Reference in New Issue
Block a user