portico: Fix logic for scheduled upgrade context variables.

Renames context variables used for the pricing model template for
when the customer has a current plan that has an upgrade to a new
plan tier scheduled.

Fixes the "Upgrade scheduled" note that was being shown when an
annual fixed-price plan has a subsequent fixed-price plan scheduled
to start when the current plan ends.

Prep for adding a complimentary access plan for Zulip Cloud.
This commit is contained in:
Lauryn Menard
2025-01-20 17:00:05 +01:00
committed by Tim Abbott
parent 5f8959397b
commit 9fdaa9de0c
2 changed files with 24 additions and 17 deletions

View File

@@ -78,8 +78,8 @@ class PlansPageContext:
is_new_customer: bool = False is_new_customer: bool = False
on_free_tier: bool = False on_free_tier: bool = False
customer_plan: CustomerPlan | None = None customer_plan: CustomerPlan | None = None
is_legacy_server_with_scheduled_upgrade: bool = False has_scheduled_upgrade: bool = False
legacy_server_new_plan: CustomerPlan | None = None scheduled_upgrade_plan: CustomerPlan | None = None
requested_sponsorship_plan: str | None = None requested_sponsorship_plan: str | None = None
billing_base_url: str = "" billing_base_url: str = ""
@@ -123,6 +123,7 @@ def plans_view(request: HttpRequest) -> HttpResponse:
context.on_free_tier = not context.is_sponsored context.on_free_tier = not context.is_sponsored
else: else:
context.on_free_trial = is_customer_on_free_trial(context.customer_plan) context.on_free_trial = is_customer_on_free_trial(context.customer_plan)
# TODO implement a complimentary access plan/tier for Zulip Cloud.
context.is_new_customer = ( context.is_new_customer = (
not context.on_free_tier and context.customer_plan is None and not context.is_sponsored not context.on_free_tier and context.customer_plan is None and not context.is_sponsored
@@ -178,16 +179,19 @@ def remote_realm_plans_page(
and not context.is_sponsored and not context.is_sponsored
) )
context.on_free_trial = is_customer_on_free_trial(context.customer_plan) context.on_free_trial = is_customer_on_free_trial(context.customer_plan)
context.is_legacy_server_with_scheduled_upgrade = ( if context.customer_plan.status == CustomerPlan.SWITCH_PLAN_TIER_AT_PLAN_END:
context.customer_plan.status == CustomerPlan.SWITCH_PLAN_TIER_AT_PLAN_END
)
if context.is_legacy_server_with_scheduled_upgrade:
assert context.customer_plan.end_date is not None assert context.customer_plan.end_date is not None
context.legacy_server_new_plan = CustomerPlan.objects.get( context.scheduled_upgrade_plan = CustomerPlan.objects.get(
customer=customer, customer=customer,
billing_cycle_anchor=context.customer_plan.end_date, billing_cycle_anchor=context.customer_plan.end_date,
status=CustomerPlan.NEVER_STARTED, status=CustomerPlan.NEVER_STARTED,
) )
# Fixed-price plan renewals have a CustomerPlan.status of
# SWITCH_PLAN_TIER_AT_PLAN_END, so we check to see if there is
# a CustomerPlan.tier change for the scheduled upgrade note.
context.has_scheduled_upgrade = (
context.customer_plan.tier != context.scheduled_upgrade_plan.tier
)
if billing_session.customer_plan_exists(): if billing_session.customer_plan_exists():
# Free trial is disabled for existing customers. # Free trial is disabled for existing customers.
@@ -243,16 +247,19 @@ def remote_server_plans_page(
CustomerPlan.TIER_SELF_HOSTED_BASE, CustomerPlan.TIER_SELF_HOSTED_BASE,
) )
context.on_free_trial = is_customer_on_free_trial(context.customer_plan) context.on_free_trial = is_customer_on_free_trial(context.customer_plan)
context.is_legacy_server_with_scheduled_upgrade = ( if context.customer_plan.status == CustomerPlan.SWITCH_PLAN_TIER_AT_PLAN_END:
context.customer_plan.status == CustomerPlan.SWITCH_PLAN_TIER_AT_PLAN_END
)
if context.is_legacy_server_with_scheduled_upgrade:
assert context.customer_plan.end_date is not None assert context.customer_plan.end_date is not None
context.legacy_server_new_plan = CustomerPlan.objects.get( context.scheduled_upgrade_plan = CustomerPlan.objects.get(
customer=customer, customer=customer,
billing_cycle_anchor=context.customer_plan.end_date, billing_cycle_anchor=context.customer_plan.end_date,
status=CustomerPlan.NEVER_STARTED, status=CustomerPlan.NEVER_STARTED,
) )
# Fixed-price plan renewals have a CustomerPlan.status of
# SWITCH_PLAN_TIER_AT_PLAN_END, so we check to see if there is
# a CustomerPlan.tier change for the scheduled upgrade note.
context.has_scheduled_upgrade = (
context.customer_plan.tier != context.scheduled_upgrade_plan.tier
)
if billing_session.customer_plan_exists(): if billing_session.customer_plan_exists():
# Free trial is disabled for existing customers. # Free trial is disabled for existing customers.

View File

@@ -225,7 +225,7 @@
<div class="bottom"> <div class="bottom">
<div class="text-content"> <div class="text-content">
<div class="standard-price-box"> <div class="standard-price-box">
{% if (is_legacy_server_with_scheduled_upgrade and legacy_server_new_plan.tier == legacy_server_new_plan.TIER_SELF_HOSTED_BASIC) {% if (has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BASIC)
or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Basic") or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Basic")
or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%} or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%}
<div class="price"><span class="currency-symbol">$</span>3.50</div> <div class="price"><span class="currency-symbol">$</span>3.50</div>
@@ -246,7 +246,7 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% if is_legacy_server_with_scheduled_upgrade and legacy_server_new_plan.tier == legacy_server_new_plan.TIER_SELF_HOSTED_BASIC %} {% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BASIC %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button"> <a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled Upgrade is scheduled
</a> </a>
@@ -310,7 +310,7 @@
<div class="bottom"> <div class="bottom">
<div class="text-content"> <div class="text-content">
<div class="standard-price-box"> <div class="standard-price-box">
{% if (is_legacy_server_with_scheduled_upgrade and legacy_server_new_plan.tier == legacy_server_new_plan.TIER_SELF_HOSTED_BUSINESS) {% if (has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BUSINESS)
or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Business") or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Business")
or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%} or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%}
<div class="price"><span class="currency-symbol">$</span>6.67</div> <div class="price"><span class="currency-symbol">$</span>6.67</div>
@@ -333,7 +333,7 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% if is_legacy_server_with_scheduled_upgrade and legacy_server_new_plan.tier == legacy_server_new_plan.TIER_SELF_HOSTED_BUSINESS %} {% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BUSINESS %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button"> <a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled Upgrade is scheduled
</a> </a>
@@ -389,7 +389,7 @@
</div> </div>
<div class="bottom"> <div class="bottom">
<div class="text-content"> <div class="text-content">
{% if is_legacy_server_with_scheduled_upgrade and legacy_server_new_plan.tier == legacy_server_new_plan.TIER_SELF_HOSTED_ENTERPRISE %} {% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_ENTERPRISE %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button"> <a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled Upgrade is scheduled
</a> </a>