diff --git a/corporate/lib/stripe.py b/corporate/lib/stripe.py index f90dcbb084..5e169f3609 100644 --- a/corporate/lib/stripe.py +++ b/corporate/lib/stripe.py @@ -2162,8 +2162,28 @@ class BillingSession(ABC): raise JsonableError(_("Pass stripe_session_id or stripe_payment_intent_id")) def get_sponsorship_request_context(self) -> Optional[Dict[str, Any]]: - context: Dict[str, Any] = {} 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 self.on_paid_plan(): @@ -2173,18 +2193,13 @@ class BillingSession(ABC): if self.is_sponsored(): context["is_sponsored"] = True + context["plan_name"] = sponsored_plan_name if customer is not None: plan = get_current_plan_by_customer(customer) if plan is not None: context["plan_name"] = plan.name 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) return context @@ -2637,6 +2652,7 @@ class RealmBillingSession(BillingSession): key=sponsorship_org_type_key_helper, ), ) + context["org_name"] = self.realm.name @override def get_sponsorship_request_session_specific_context( @@ -2924,6 +2940,7 @@ class RemoteRealmBillingSession(BillingSession): # nocoverage key=sponsorship_org_type_key_helper, ), ) + context["org_name"] = self.remote_realm.host @override def get_sponsorship_request_session_specific_context( @@ -3224,6 +3241,7 @@ class RemoteServerBillingSession(BillingSession): # nocoverage key=sponsorship_org_type_key_helper, ), ) + context["org_name"] = self.remote_server.hostname @override def get_sponsorship_request_session_specific_context( diff --git a/corporate/models.py b/corporate/models.py index 49ac8c512b..7a11f0cc56 100644 --- a/corporate/models.py +++ b/corporate/models.py @@ -299,6 +299,7 @@ class CustomerPlan(models.Model): CustomerPlan.TIER_CLOUD_ENTERPRISE: "Zulip Enterprise", CustomerPlan.TIER_SELF_HOSTED_LEGACY: "Self-managed", CustomerPlan.TIER_SELF_HOSTED_BUSINESS: "Zulip Business", + CustomerPlan.TIER_SELF_HOSTED_COMMUNITY: "Community", }[tier] @property diff --git a/corporate/urls.py b/corporate/urls.py index 85101e58bc..9edf182634 100644 --- a/corporate/urls.py +++ b/corporate/urls.py @@ -233,8 +233,8 @@ urlpatterns += [ name="remote_server_event_status_page", ), # Remote variants of above API endpoints. - path("json/realm//sponsorship", remote_realm_sponsorship), - path("json/server//sponsorship", remote_server_sponsorship), + path("json/realm//billing/sponsorship", remote_realm_sponsorship), + path("json/server//billing/sponsorship", remote_server_sponsorship), path( "json/realm//billing/session/start_card_update_session", start_card_update_stripe_session_for_remote_realm, diff --git a/corporate/views/sponsorship.py b/corporate/views/sponsorship.py index 5b331f78f5..ca91d8d019 100644 --- a/corporate/views/sponsorship.py +++ b/corporate/views/sponsorship.py @@ -37,7 +37,9 @@ def remote_realm_sponsorship_page( ) -> HttpResponse: # nocoverage context = billing_session.get_sponsorship_request_context() 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) @@ -49,7 +51,9 @@ def remote_server_sponsorship_page( ) -> HttpResponse: # nocoverage context = billing_session.get_sponsorship_request_context() 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) diff --git a/templates/corporate/sponsorship.html b/templates/corporate/sponsorship.html index 29d1cc82ab..864c7073c5 100644 --- a/templates/corporate/sponsorship.html +++ b/templates/corporate/sponsorship.html @@ -11,13 +11,20 @@
{% if is_sponsored %} - Zulip is sponsoring a free Zulip Cloud Standard plan for this organization. 🎉 + Zulip is sponsoring a free {{ sponsored_plan_name }} plan for this organization. 🎉 {% else %} - This organization has requested sponsorship for a Zulip Cloud Standard plan. Contact Zulip support with any questions or updates. + This organization has requested sponsorship for a {{ sponsored_plan_name }} plan. Contact Zulip support with any questions or updates. {% endif %}
-

Zulip Cloud billing for {{realm_name}}

+

+ Zulip + {% if is_remotely_hosted %} + {% else %} + Cloud + {% endif %} + billing for {{ org_name }} +

@@ -49,16 +56,22 @@