mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	support: Add support for activating and deactivating realm.
This commit is contained in:
		@@ -339,13 +339,17 @@ class TestSupportEndpoint(ZulipTestCase):
 | 
			
		||||
            self.assert_in_success_response(['<input type="hidden" name="realm_id" value="1"', 'Zulip Dev</h3>',
 | 
			
		||||
                                             '<option value="1" selected>Self Hosted</option>',
 | 
			
		||||
                                             '<option value="2" >Limited</option>',
 | 
			
		||||
                                             'input type="number" name="discount" value="None"'], result)
 | 
			
		||||
                                             'input type="number" name="discount" value="None"',
 | 
			
		||||
                                             '<option value="active" selected>Active</option>',
 | 
			
		||||
                                             '<option value="deactive" >Deactive</option>'], result)
 | 
			
		||||
 | 
			
		||||
        def check_lear_realm_result(result: HttpResponse) -> None:
 | 
			
		||||
            self.assert_in_success_response(['<input type="hidden" name="realm_id" value="3"', 'Lear & Co.</h3>',
 | 
			
		||||
                                             '<option value="1" selected>Self Hosted</option>',
 | 
			
		||||
                                             '<option value="2" >Limited</option>',
 | 
			
		||||
                                             'input type="number" name="discount" value="None"'], result)
 | 
			
		||||
                                             'input type="number" name="discount" value="None"',
 | 
			
		||||
                                             '<option value="active" selected>Active</option>',
 | 
			
		||||
                                             '<option value="deactive" >Deactive</option>'], result)
 | 
			
		||||
 | 
			
		||||
        cordelia_email = self.example_email("cordelia")
 | 
			
		||||
        self.login(cordelia_email)
 | 
			
		||||
@@ -416,6 +420,27 @@ class TestSupportEndpoint(ZulipTestCase):
 | 
			
		||||
            m.assert_called_once_with(get_realm("lear"), 25)
 | 
			
		||||
            self.assert_in_success_response(["Discount of Lear & Co. changed to 25 from None"], result)
 | 
			
		||||
 | 
			
		||||
    def test_activate_or_deactivate_realm(self) -> None:
 | 
			
		||||
        cordelia_email = self.example_email("cordelia")
 | 
			
		||||
        self.login(cordelia_email)
 | 
			
		||||
 | 
			
		||||
        result = self.client_post("/activity/support", {"realm_id": "3", "status": "deactive"})
 | 
			
		||||
        self.assertEqual(result.status_code, 302)
 | 
			
		||||
        self.assertEqual(result["Location"], "/login/")
 | 
			
		||||
 | 
			
		||||
        iago_email = self.example_email("iago")
 | 
			
		||||
        self.login(iago_email)
 | 
			
		||||
 | 
			
		||||
        with mock.patch("analytics.views.do_deactivate_realm") as m:
 | 
			
		||||
            result = self.client_post("/activity/support", {"realm_id": "3", "status": "deactive"})
 | 
			
		||||
            m.assert_called_once_with(get_realm("lear"))
 | 
			
		||||
            self.assert_in_success_response(["Lear & Co. deactivated"], result)
 | 
			
		||||
 | 
			
		||||
        with mock.patch("analytics.views.do_reactivate_realm") as m:
 | 
			
		||||
            result = self.client_post("/activity/support", {"realm_id": "3", "status": "active"})
 | 
			
		||||
            m.assert_called_once_with(get_realm("lear"))
 | 
			
		||||
            self.assert_in_success_response(["Lear & Co. reactivated."], result)
 | 
			
		||||
 | 
			
		||||
class TestGetChartDataHelpers(ZulipTestCase):
 | 
			
		||||
    # last_successful_fill is in analytics/models.py, but get_chart_data is
 | 
			
		||||
    # the only function that uses it at the moment
 | 
			
		||||
 
 | 
			
		||||
@@ -39,7 +39,8 @@ from zerver.lib.timestamp import convert_to_UTC, timestamp_to_datetime
 | 
			
		||||
from zerver.lib.realm_icon import realm_icon_url
 | 
			
		||||
from zerver.views.invite import get_invitee_emails_set
 | 
			
		||||
from zerver.lib.subdomains import get_subdomain_from_hostname
 | 
			
		||||
from zerver.lib.actions import do_change_plan_type
 | 
			
		||||
from zerver.lib.actions import do_change_plan_type, do_deactivate_realm, \
 | 
			
		||||
    do_reactivate_realm
 | 
			
		||||
 | 
			
		||||
if settings.BILLING_ENABLED:
 | 
			
		||||
    from corporate.lib.stripe import attach_discount_to_realm, get_discount_for_realm
 | 
			
		||||
@@ -1040,7 +1041,7 @@ def support(request: HttpRequest) -> HttpResponse:
 | 
			
		||||
            do_change_plan_type(realm, new_plan_type)
 | 
			
		||||
            msg = "Plan type of {} changed to {} from {} ".format(realm.name, get_plan_name(new_plan_type),
 | 
			
		||||
                                                                  get_plan_name(current_plan_type))
 | 
			
		||||
            context["plan_type_msg"] = msg
 | 
			
		||||
            context["message"] = msg
 | 
			
		||||
 | 
			
		||||
        new_discount = request.POST.get("discount", None)
 | 
			
		||||
        if new_discount is not None:
 | 
			
		||||
@@ -1048,7 +1049,16 @@ def support(request: HttpRequest) -> HttpResponse:
 | 
			
		||||
            current_discount = get_discount_for_realm(realm)
 | 
			
		||||
            attach_discount_to_realm(realm, new_discount)
 | 
			
		||||
            msg = "Discount of {} changed to {} from {} ".format(realm.name, new_discount, current_discount)
 | 
			
		||||
            context["discount_msg"] = msg
 | 
			
		||||
            context["message"] = msg
 | 
			
		||||
 | 
			
		||||
        status = request.POST.get("status", None)
 | 
			
		||||
        if status is not None:
 | 
			
		||||
            if status == "active":
 | 
			
		||||
                do_reactivate_realm(realm)
 | 
			
		||||
                context["message"] = "{} reactivated.".format(realm.name)
 | 
			
		||||
            elif status == "deactive":
 | 
			
		||||
                do_deactivate_realm(realm)
 | 
			
		||||
                context["message"] = "{} deactivated.".format(realm.name)
 | 
			
		||||
 | 
			
		||||
    query = request.GET.get("q", None)
 | 
			
		||||
    if query:
 | 
			
		||||
 
 | 
			
		||||
@@ -66,6 +66,11 @@ tr.admin td:first-child {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.support-discount-form {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: -50px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.support-plan-type-form {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: -25px;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -22,18 +22,10 @@
 | 
			
		||||
        </center>
 | 
			
		||||
    </form>
 | 
			
		||||
 | 
			
		||||
    {% if plan_type_msg %}
 | 
			
		||||
    {% if message %}
 | 
			
		||||
    <div class="alert alert-success">
 | 
			
		||||
        <center>
 | 
			
		||||
            {{ plan_type_msg }}
 | 
			
		||||
        </center>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
 | 
			
		||||
    {% if discount_msg %}
 | 
			
		||||
    <div class="alert alert-success">
 | 
			
		||||
        <center>
 | 
			
		||||
            {{ discount_msg }}
 | 
			
		||||
            {{ message }}
 | 
			
		||||
        </center>
 | 
			
		||||
    </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
@@ -53,9 +45,18 @@
 | 
			
		||||
                <h3><img src="{{ user.realm.realm_icon_url }}" class="support-realm-icon"> {{ user.realm.name }}</h3>
 | 
			
		||||
                <b>URL</b>: <a target="_blank" href="{{ user.realm.uri }}">{{ user.realm.uri }}</a><br>
 | 
			
		||||
                <b>Date created</b>: {{ user.realm.date_created|timesince }} ago<br>
 | 
			
		||||
                <b>Is active</b>: {{ not user.realm.deactivated }}<br>
 | 
			
		||||
                <b>Admins</b>: {% for admin in user.realm.admins %}{{ admin.email }} {% endfor %}<br>
 | 
			
		||||
                <form method="POST">
 | 
			
		||||
                    <b>Status</b>:<br>
 | 
			
		||||
                    {{ csrf_input }}
 | 
			
		||||
                    <input type="hidden" name="realm_id" value="{{ user.realm.id }}" />
 | 
			
		||||
                    <select name="status">
 | 
			
		||||
                        <option value="active" {% if not user.realm.deactivated %}selected{% endif %}>Active</option>
 | 
			
		||||
                        <option value="deactive" {% if user.realm.deactivated %}selected{% endif %}>Deactive</option>
 | 
			
		||||
                    </select>
 | 
			
		||||
                    <button type="submit" class="btn btn-small support-submit-button">Update</button>
 | 
			
		||||
                </form>
 | 
			
		||||
                <form method="POST" class="support-plan-type-form">
 | 
			
		||||
                    {{ csrf_input }}
 | 
			
		||||
                    <input type="hidden" name="realm_id" value="{{ user.realm.id }}" />
 | 
			
		||||
                    <b>Plan type</b>:<br>
 | 
			
		||||
@@ -85,10 +86,19 @@
 | 
			
		||||
            <h3><img src="{{ realm.realm_icon_url }}" class="support-realm-icon"> {{ realm.name }}</h3>
 | 
			
		||||
            <b>URL</b>: <a target="_blank" href="{{ realm.uri }}">{{ realm.uri }}</a><br>
 | 
			
		||||
            <b>Date created</b>: {{ realm.date_created|timesince }} ago<br>
 | 
			
		||||
            <b>Is active</b>: {{ not realm.deactivated }}<br>
 | 
			
		||||
            <b>Admins</b>: {% for admin in realm.admins %}{{ admin.email }} {% endfor %}<br>
 | 
			
		||||
            <b>Plan type</b>:
 | 
			
		||||
            <form method="POST">
 | 
			
		||||
                <b>Status</b>:<br>
 | 
			
		||||
                {{ csrf_input }}
 | 
			
		||||
                <input type="hidden" name="realm_id" value="{{ realm.id }}" />
 | 
			
		||||
                <select name="status">
 | 
			
		||||
                    <option value="active" {% if not realm.deactivated %}selected{% endif %}>Active</option>
 | 
			
		||||
                    <option value="deactive" {% if realm.deactivated %}selected{% endif %}>Deactive</option>
 | 
			
		||||
                </select>
 | 
			
		||||
                <button type="submit" class="btn btn-small support-submit-button">Update</button>
 | 
			
		||||
            </form>
 | 
			
		||||
            <form method="POST" class="support-plan-type-form">
 | 
			
		||||
                <b>Plan type</b>:<br>
 | 
			
		||||
                {{ csrf_input }}
 | 
			
		||||
                <input type="hidden" name="realm_id" value="{{ realm.id }}" />
 | 
			
		||||
                <select name="plan_type">
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user