From fd16c2e2b0d22c5fe49eb05abc80279ac0c270ea Mon Sep 17 00:00:00 2001 From: Lauryn Menard Date: Wed, 28 May 2025 18:11:14 +0200 Subject: [PATCH] templates: Update deactivated organization template for deleted data. If a realm's data has been scrubbed, update the deactivated realm to note the URL can be reused, but not that the realm can be reactivated. Updates the template for context variables that are no longer used. --- templates/zerver/deactivated.html | 25 +++++++++++++------------ zerver/tests/test_signup.py | 28 +++++++++++++++++++++++++++- zerver/views/auth.py | 7 ++++++- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/templates/zerver/deactivated.html b/templates/zerver/deactivated.html index 4195d95793..1bc3c511fb 100644 --- a/templates/zerver/deactivated.html +++ b/templates/zerver/deactivated.html @@ -16,23 +16,24 @@
- {% if deactivated_redirect %} -

{{ _("Organization moved") }}

- {% else %} -

{{ _("Deactivated organization") }}

- {% endif %} +

{{ _("Deactivated organization") }}

- {% if deactivated_redirect %} - {% trans %} - This organization has moved to {{ deactivated_redirect }}. - {% endtrans %} + {% if realm_data_deleted %} + {{ _("This organization has been deactivated, and all organization data has been deleted.") }} + {% if corporate_enabled %} + {% trans %} + You can contact Zulip support to inquire about reusing this URL for a new organization. + {% endtrans %} + {% else %} + {% trans %} + You can contact this Zulip server's administrators to inquire about reusing this URL for a new organization. + {% endtrans %} + {% endif %} {% else %} - {% trans %} - This organization has been deactivated. - {% endtrans %} + {{ _("This organization has been deactivated.") }} {% if corporate_enabled %} {% trans %} If you are an owner of this organization, you can contact Zulip support to reactivate it. diff --git a/zerver/tests/test_signup.py b/zerver/tests/test_signup.py index d1a9644445..9d957e06a3 100644 --- a/zerver/tests/test_signup.py +++ b/zerver/tests/test_signup.py @@ -24,8 +24,10 @@ from zerver.actions.create_realm import do_change_realm_subdomain, do_create_rea from zerver.actions.create_user import add_new_user_history, do_create_user from zerver.actions.default_streams import do_add_default_stream, do_create_default_stream_group from zerver.actions.invites import do_invite_users +from zerver.actions.message_send import internal_send_private_message from zerver.actions.realm_settings import ( do_deactivate_realm, + do_scrub_realm, do_set_realm_authentication_methods, do_set_realm_property, do_set_realm_user_default_setting, @@ -180,7 +182,7 @@ class DeactivationNoticeTestCase(ZulipTestCase): result = self.client_get("/login/", follow=True) self.assertEqual(result.redirect_chain[-1], ("/accounts/deactivated/", 302)) self.assertIn("This organization has been deactivated.", result.content.decode()) - self.assertNotIn("It has moved to", result.content.decode()) + self.assertNotIn("and all organization data has been deleted", result.content.decode()) def test_deactivation_notice_when_deactivated_and_deactivated_redirect_is_set(self) -> None: realm = get_realm("zulip") @@ -225,6 +227,30 @@ class DeactivationNoticeTestCase(ZulipTestCase): result = self.client_get("/login/", follow=True) self.assertIn(result.request.get("SERVER_NAME"), ["new-name-2.testserver"]) + def test_deactivation_notice_when_deactivated_and_scrubbed(self) -> None: + # We expect system bot messages when scrubbing a realm. + internal_realm = get_realm(settings.SYSTEM_BOT_REALM) + notification_bot = get_system_bot(settings.NOTIFICATION_BOT, internal_realm.id) + hamlet = self.example_user("hamlet") + internal_send_private_message(notification_bot, hamlet, "test") + realm = get_realm("zulip") + do_deactivate_realm( + realm, + acting_user=None, + deactivation_reason="owner_request", + email_owners=False, + ) + realm.refresh_from_db() + assert realm.deactivated + assert realm.deactivated_redirect is None + with self.assertLogs(level="WARNING"): + do_scrub_realm(realm, acting_user=None) + + result = self.client_get("/login/", follow=True) + self.assertEqual(result.redirect_chain[-1], ("/accounts/deactivated/", 302)) + self.assertIn("This organization has been deactivated,", result.content.decode()) + self.assertIn("and all organization data has been deleted", result.content.decode()) + class AddNewUserHistoryTest(ZulipTestCase): def test_add_new_user_history_race(self) -> None: diff --git a/zerver/views/auth.py b/zerver/views/auth.py index eaed843c3e..1c40c36304 100644 --- a/zerver/views/auth.py +++ b/zerver/views/auth.py @@ -78,6 +78,7 @@ from zerver.models import ( UserProfile, ) from zerver.models.prereg_users import filter_to_valid_prereg_users +from zerver.models.realm_audit_logs import AuditLogEventType, RealmAuditLog from zerver.models.realms import get_realm from zerver.models.users import remote_user_to_email from zerver.signals import email_on_new_login @@ -808,12 +809,16 @@ def redirect_to_misconfigured_ldap_notice(request: HttpRequest, error_type: int) def show_deactivation_notice(request: HttpRequest, next: str = "/") -> HttpResponse: realm = get_realm_from_request(request) if realm and realm.deactivated: - context = {"deactivated_domain_name": realm.name} if realm.deactivated_redirect is not None: # URL hash is automatically preserved by the browser. # See https://stackoverflow.com/a/5283739 redirect_to = get_safe_redirect_to(next, realm.deactivated_redirect) return HttpResponseRedirect(redirect_to) + + realm_data_scrubbed = RealmAuditLog.objects.filter( + realm=realm, event_type=AuditLogEventType.REALM_SCRUBBED + ).exists() + context = {"realm_data_deleted": realm_data_scrubbed} return render(request, "zerver/deactivated.html", context=context) return HttpResponseRedirect(reverse("login_page"))