From be03dabf76296fe201b128fd8cf2cd2aa52cb766 Mon Sep 17 00:00:00 2001 From: Mateusz Mandera Date: Sun, 18 Feb 2024 01:41:37 +0100 Subject: [PATCH] zilencer: Implement do_reactivate_remote_server utility function. The inverse of do_deactivate_remote_server. It's just flipping the .deactivated flag, but we also should have an AuditLog for these events. --- corporate/lib/stripe.py | 22 ++++++++++++++++++++++ corporate/tests/test_stripe.py | 20 +++++++++++++++++++- zerver/models/realm_audit_logs.py | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/corporate/lib/stripe.py b/corporate/lib/stripe.py index b3ee4ed9e6..066d1dade7 100644 --- a/corporate/lib/stripe.py +++ b/corporate/lib/stripe.py @@ -4699,6 +4699,28 @@ def do_change_remote_server_plan_type(remote_server: RemoteZulipServer, plan_typ ) +@transaction.atomic +def do_reactivate_remote_server(remote_server: RemoteZulipServer) -> None: + """ + Utility function for reactivating deactivated registrations. + """ + + if not remote_server.deactivated: + billing_logger.warning( + "Cannot reactivate remote server with ID %d, server is already active.", + remote_server.id, + ) + return + + remote_server.deactivated = False + remote_server.save(update_fields=["deactivated"]) + RemoteZulipServerAuditLog.objects.create( + event_type=RealmAuditLog.REMOTE_SERVER_REACTIVATED, + server=remote_server, + event_time=timezone_now(), + ) + + @transaction.atomic def do_deactivate_remote_server( remote_server: RemoteZulipServer, billing_session: RemoteServerBillingSession diff --git a/corporate/tests/test_stripe.py b/corporate/tests/test_stripe.py index 4b6947801e..350d04b4cc 100644 --- a/corporate/tests/test_stripe.py +++ b/corporate/tests/test_stripe.py @@ -66,6 +66,7 @@ from corporate.lib.stripe import ( customer_has_last_n_invoices_open, do_change_remote_server_plan_type, do_deactivate_remote_server, + do_reactivate_remote_server, downgrade_small_realms_behind_on_payments_as_needed, get_latest_seat_count, get_plan_renewal_or_end_date, @@ -4761,7 +4762,7 @@ class BillingHelpersTest(ZulipTestCase): self.assertEqual(remote_realm_audit_log.extra_data, expected_extra_data) self.assertEqual(remote_server.plan_type, RemoteZulipServer.PLAN_TYPE_BUSINESS) - def test_deactivate_remote_server(self) -> None: + def test_deactivate_reactivate_remote_server(self) -> None: server_uuid = str(uuid.uuid4()) remote_server = RemoteZulipServer.objects.create( uuid=server_uuid, @@ -4792,6 +4793,23 @@ class BillingHelpersTest(ZulipTestCase): ], ) + do_reactivate_remote_server(remote_server) + remote_server.refresh_from_db() + self.assertFalse(remote_server.deactivated) + remote_realm_audit_log = RemoteZulipServerAuditLog.objects.latest("id") + self.assertEqual(remote_realm_audit_log.event_type, RealmAuditLog.REMOTE_SERVER_REACTIVATED) + self.assertEqual(remote_realm_audit_log.server, remote_server) + + with self.assertLogs("corporate.stripe", "WARN") as warning_log: + do_reactivate_remote_server(remote_server) + self.assertEqual( + warning_log.output, + [ + "WARNING:corporate.stripe:Cannot reactivate remote server with ID " + f"{remote_server.id}, server is already active." + ], + ) + class AnalyticsHelpersTest(ZulipTestCase): def test_get_realms_to_default_discount_dict(self) -> None: diff --git a/zerver/models/realm_audit_logs.py b/zerver/models/realm_audit_logs.py index 9e9c5d8965..f1ab308536 100644 --- a/zerver/models/realm_audit_logs.py +++ b/zerver/models/realm_audit_logs.py @@ -130,6 +130,7 @@ class AbstractRealmAuditLog(models.Model): # value used for the same purpose in RealmAuditLog (e.g. # REALM_DEACTIVATED = 201, and REMOTE_SERVER_DEACTIVATED = 10201). REMOTE_SERVER_DEACTIVATED = 10201 + REMOTE_SERVER_REACTIVATED = 10202 REMOTE_SERVER_PLAN_TYPE_CHANGED = 10204 REMOTE_SERVER_DISCOUNT_CHANGED = 10209 REMOTE_SERVER_SPONSORSHIP_APPROVED = 10210