diff --git a/puppet/zulip/files/hooks/post-deploy.d/send_zulip_update_announcements.hook b/puppet/zulip/files/hooks/post-deploy.d/send_zulip_update_announcements.hook index 88f6afc854..d77d40cabc 100644 --- a/puppet/zulip/files/hooks/post-deploy.d/send_zulip_update_announcements.hook +++ b/puppet/zulip/files/hooks/post-deploy.d/send_zulip_update_announcements.hook @@ -2,4 +2,4 @@ set -e -/home/zulip/deployments/current/manage.py send_zulip_update_announcements --automated +/home/zulip/deployments/current/manage.py send_zulip_update_announcements --automated --progress diff --git a/zerver/lib/zulip_update_announcements.py b/zerver/lib/zulip_update_announcements.py index 723a43c6c7..b0e145b6c6 100644 --- a/zerver/lib/zulip_update_announcements.py +++ b/zerver/lib/zulip_update_announcements.py @@ -632,15 +632,26 @@ def send_messages_and_update_level( realm.save(update_fields=["zulip_update_announcements_level"]) -def send_zulip_update_announcements(skip_delay: bool) -> None: +def send_zulip_update_announcements(skip_delay: bool, progress: bool = False) -> None: latest_zulip_update_announcements_level = get_latest_zulip_update_announcements_level() - for realm in get_realms_behind_zulip_update_announcements_level( + realms = get_realms_behind_zulip_update_announcements_level( level=latest_zulip_update_announcements_level - ): + ) + if len(realms) == 0: + return + + if progress: # nocoverage + print(f"Sending update announcements to {len(realms)} realms") + for i, realm in enumerate(realms, start=1): try: send_zulip_update_announcements_to_realm(realm, skip_delay) except Exception as e: # nocoverage logging.exception(e) + finally: + if progress and i % 50 == 0: # nocoverage + print(f"Processed {i}/{len(realms)} realms...") + if progress: # nocoverage + print("Done!") def send_zulip_update_announcements_to_realm(realm: Realm, skip_delay: bool) -> None: diff --git a/zerver/management/commands/send_zulip_update_announcements.py b/zerver/management/commands/send_zulip_update_announcements.py index ea022dbac4..b15e969e7a 100644 --- a/zerver/management/commands/send_zulip_update_announcements.py +++ b/zerver/management/commands/send_zulip_update_announcements.py @@ -14,6 +14,7 @@ class Command(ZulipBaseCommand): @override def add_arguments(self, parser: ArgumentParser) -> None: + parser.add_argument("--progress", action="store_true", help="Log every 50 completed realms") parser.add_argument( "--skip-delay", action="store_true", @@ -35,4 +36,6 @@ class Command(ZulipBaseCommand): ).update(zulip_update_announcements_level=options["reset_level"]) return - send_zulip_update_announcements(skip_delay=options["skip_delay"]) + send_zulip_update_announcements( + skip_delay=options["skip_delay"], progress=options["progress"] + ) diff --git a/zerver/tests/test_zulip_update_announcements.py b/zerver/tests/test_zulip_update_announcements.py index 6973edefaa..ec0870158d 100644 --- a/zerver/tests/test_zulip_update_announcements.py +++ b/zerver/tests/test_zulip_update_announcements.py @@ -166,6 +166,17 @@ class ZulipUpdateAnnouncementsTest(ZulipTestCase): self.assertEqual(stream_messages[0].content, "Announcement message 5.") self.assertEqual(realm.zulip_update_announcements_level, 5) + # Calling send_zulip_update_announcements again does nothing + with time_machine.travel(now + timedelta(days=20), tick=False): + send_zulip_update_announcements(skip_delay=False) + realm.refresh_from_db() + stream_messages = Message.objects.filter( + realm=realm, + date_sent__gte=now + timedelta(days=20), + ).order_by("id") + self.assert_length(stream_messages, 0) + self.assertEqual(realm.zulip_update_announcements_level, 5) + def test_send_zulip_update_announcements_with_stream_configured(self) -> None: with mock.patch( "zerver.lib.zulip_update_announcements.zulip_update_announcements",