support: Add support for downgrading realm.

This commit is contained in:
Vishnu KS
2020-08-13 16:50:18 +05:30
committed by Tim Abbott
parent dbaea757ae
commit 3e438538b4
4 changed files with 69 additions and 0 deletions

View File

@@ -684,6 +684,36 @@ class TestSupportEndpoint(ZulipTestCase):
m.assert_called_once_with(lear_realm)
self.assert_in_success_response(["Realm reactivation email sent to admins of Lear"], result)
def test_downgrade_realm(self) -> None:
cordelia = self.example_user('cordelia')
self.login_user(cordelia)
result = self.client_post("/activity/support", {"realm_id": f"{cordelia.realm_id}", "plan_type": "2"})
self.assertEqual(result.status_code, 302)
self.assertEqual(result["Location"], "/login/")
iago = self.example_user("iago")
self.login_user(iago)
with mock.patch("analytics.views.downgrade_at_the_end_of_billing_cycle") as m:
result = self.client_post("/activity/support", {"realm_id": f"{iago.realm_id}",
"downgrade_method": "downgrade_at_billing_cycle_end"})
m.assert_called_once_with(get_realm("zulip"))
self.assert_in_success_response(["Zulip Dev marked for downgrade at the end of billing cycle"], result)
with mock.patch("analytics.views.downgrade_now_without_creating_additional_invoices") as m:
result = self.client_post("/activity/support", {"realm_id": f"{iago.realm_id}",
"downgrade_method": "downgrade_now_without_additional_licenses"})
m.assert_called_once_with(get_realm("zulip"))
self.assert_in_success_response(["Zulip Dev downgraded without creating additional invoices"], result)
with mock.patch("analytics.views.downgrade_now_without_creating_additional_invoices") as m1:
with mock.patch("analytics.views.void_all_open_invoices", return_value=1) as m2:
result = self.client_post("/activity/support", {"realm_id": f"{iago.realm_id}",
"downgrade_method": "downgrade_now_void_open_invoices"})
m1.assert_called_once_with(get_realm("zulip"))
m2.assert_called_once_with(get_realm("zulip"))
self.assert_in_success_response(["Zulip Dev downgraded and voided 1 open invoices"], result)
def test_scrub_realm(self) -> None:
cordelia = self.example_user('cordelia')
lear_realm = get_realm('lear')

View File

@@ -75,12 +75,15 @@ if settings.BILLING_ENABLED:
from corporate.lib.stripe import (
approve_sponsorship,
attach_discount_to_realm,
downgrade_at_the_end_of_billing_cycle,
downgrade_now_without_creating_additional_invoices,
get_current_plan_by_realm,
get_customer_by_realm,
get_discount_for_realm,
get_latest_seat_count,
make_end_of_cycle_updates_if_needed,
update_sponsorship_status,
void_all_open_invoices,
)
if settings.ZILENCER_ENABLED:
@@ -1183,6 +1186,18 @@ def support(request: HttpRequest) -> HttpResponse:
if request.POST.get('approve_sponsorship') == "approve_sponsorship":
approve_sponsorship(realm)
context["message"] = f"Sponsorship approved for {realm.name}"
elif request.POST.get('downgrade_method', None) is not None:
downgrade_method = request.POST.get('downgrade_method')
if downgrade_method == "downgrade_at_billing_cycle_end":
downgrade_at_the_end_of_billing_cycle(realm)
context["message"] = f"{realm.name} marked for downgrade at the end of billing cycle"
elif downgrade_method == "downgrade_now_without_additional_licenses":
downgrade_now_without_creating_additional_invoices(realm)
context["message"] = f"{realm.name} downgraded without creating additional invoices"
elif downgrade_method == "downgrade_now_void_open_invoices":
downgrade_now_without_creating_additional_invoices(realm)
voided_invoices_count = void_all_open_invoices(realm)
context["message"] = f"{realm.name} downgraded and voided {voided_invoices_count} open invoices"
elif request.POST.get("scrub_realm", None) is not None:
if request.POST.get("scrub_realm") == "scrub_realm":
do_scrub_realm(realm, acting_user=request.user)