mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	digest: Don't send emails to deactivated users, even if queued.
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							7a13836d26
						
					
				
				
					commit
					fcf82bf047
				
			@@ -348,7 +348,11 @@ def get_digest_context(user: UserProfile, cutoff: float) -> Dict[str, Any]:
 | 
				
			|||||||
def bulk_handle_digest_email(user_ids: List[int], cutoff: float) -> None:
 | 
					def bulk_handle_digest_email(user_ids: List[int], cutoff: float) -> None:
 | 
				
			||||||
    # We go directly to the database to get user objects,
 | 
					    # We go directly to the database to get user objects,
 | 
				
			||||||
    # since inactive users are likely to not be in the cache.
 | 
					    # since inactive users are likely to not be in the cache.
 | 
				
			||||||
    users = UserProfile.objects.filter(id__in=user_ids).order_by("id").select_related("realm")
 | 
					    users = (
 | 
				
			||||||
 | 
					        UserProfile.objects.filter(id__in=user_ids, is_active=True, realm__deactivated=False)
 | 
				
			||||||
 | 
					        .order_by("id")
 | 
				
			||||||
 | 
					        .select_related("realm")
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
    context_map = bulk_get_digest_context(users, cutoff)
 | 
					    context_map = bulk_get_digest_context(users, cutoff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    digest_users = []
 | 
					    digest_users = []
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,7 @@ from django.utils.timezone import now as timezone_now
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from confirmation.models import one_click_unsubscribe_link
 | 
					from confirmation.models import one_click_unsubscribe_link
 | 
				
			||||||
from zerver.actions.create_user import do_create_user
 | 
					from zerver.actions.create_user import do_create_user
 | 
				
			||||||
 | 
					from zerver.actions.users import do_deactivate_user
 | 
				
			||||||
from zerver.lib.digest import (
 | 
					from zerver.lib.digest import (
 | 
				
			||||||
    DigestTopic,
 | 
					    DigestTopic,
 | 
				
			||||||
    _enqueue_emails_for_realm,
 | 
					    _enqueue_emails_for_realm,
 | 
				
			||||||
@@ -86,6 +87,32 @@ class TestDigestEmailMessages(ZulipTestCase):
 | 
				
			|||||||
        self.assertIn("some content", teaser_messages[0]["content"][0]["plain"])
 | 
					        self.assertIn("some content", teaser_messages[0]["content"][0]["plain"])
 | 
				
			||||||
        self.assertIn(teaser_messages[0]["sender"], expected_participants)
 | 
					        self.assertIn(teaser_messages[0]["sender"], expected_participants)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_bulk_handle_digest_email_skips_deactivated_users(self) -> None:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        A user id may be added to the queue before the user is deactivated. In such a case,
 | 
				
			||||||
 | 
					        the function responsible for sending the email should correctly skip them.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        realm = get_realm("zulip")
 | 
				
			||||||
 | 
					        hamlet = self.example_user("hamlet")
 | 
				
			||||||
 | 
					        user_ids = list(
 | 
				
			||||||
 | 
					            UserProfile.objects.filter(is_bot=False, realm=realm).values_list("id", flat=True)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        do_deactivate_user(hamlet, acting_user=None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with mock.patch("zerver.lib.digest.enough_traffic", return_value=True), mock.patch(
 | 
				
			||||||
 | 
					            "zerver.lib.digest.send_future_email"
 | 
				
			||||||
 | 
					        ) as mock_send_email:
 | 
				
			||||||
 | 
					            bulk_handle_digest_email(user_ids, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        emailed_user_ids = [
 | 
				
			||||||
 | 
					            call_args[1]["to_user_ids"][0] for call_args in mock_send_email.call_args_list
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            set(emailed_user_ids), set(user_id for user_id in user_ids if user_id != hamlet.id)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch("zerver.lib.digest.enough_traffic")
 | 
					    @mock.patch("zerver.lib.digest.enough_traffic")
 | 
				
			||||||
    @mock.patch("zerver.lib.digest.send_future_email")
 | 
					    @mock.patch("zerver.lib.digest.send_future_email")
 | 
				
			||||||
    def test_guest_user_multiple_stream_sender(
 | 
					    def test_guest_user_multiple_stream_sender(
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user