mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	page load: Remove sender_ids in unread messages for streams.
This commit is contained in:
		
				
					committed by
					
						
						Steve Howell
					
				
			
			
				
	
			
			
			
						parent
						
							a9501772c1
						
					
				
				
					commit
					45f6c8d27f
				
			@@ -11,6 +11,15 @@ below features are supported.
 | 
			
		||||
 | 
			
		||||
## Changes in Zulip 5.0
 | 
			
		||||
 | 
			
		||||
=======
 | 
			
		||||
**Feature level 90**
 | 
			
		||||
 | 
			
		||||
* We no longer include `sender_ids` in the `streams` section of
 | 
			
		||||
  `UnreadMessagesResult`, which becomes the `unread_msgs` section of
 | 
			
		||||
  the events that clients fetch when registering events at page
 | 
			
		||||
  load time. (We don't believe this feature has ever been used in
 | 
			
		||||
  a meaningful way.)
 | 
			
		||||
 | 
			
		||||
**Feature level 89**
 | 
			
		||||
 | 
			
		||||
* [`GET /events`](/api/get-events): Introduced the `user_settings`
 | 
			
		||||
 
 | 
			
		||||
@@ -69,7 +69,6 @@ class RawReactionRow(TypedDict):
 | 
			
		||||
class RawUnreadStreamDict(TypedDict):
 | 
			
		||||
    stream_id: int
 | 
			
		||||
    topic: str
 | 
			
		||||
    sender_id: int
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RawUnreadPrivateMessageDict(TypedDict):
 | 
			
		||||
@@ -871,7 +870,7 @@ def huddle_users(recipient_id: int) -> str:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def aggregate_message_dict(
 | 
			
		||||
    input_dict: Dict[int, Any], lookup_fields: List[str], collect_senders: bool
 | 
			
		||||
    input_dict: Dict[int, Any], lookup_fields: List[str]
 | 
			
		||||
) -> List[Dict[str, Any]]:
 | 
			
		||||
    lookup_dict: Dict[Tuple[Any, ...], Dict[str, Any]] = {}
 | 
			
		||||
 | 
			
		||||
@@ -879,21 +878,20 @@ def aggregate_message_dict(
 | 
			
		||||
    A concrete example might help explain the inputs here:
 | 
			
		||||
 | 
			
		||||
    input_dict = {
 | 
			
		||||
        1002: dict(stream_id=5, topic='foo', sender_id=40),
 | 
			
		||||
        1003: dict(stream_id=5, topic='foo', sender_id=41),
 | 
			
		||||
        1004: dict(stream_id=6, topic='baz', sender_id=99),
 | 
			
		||||
        1002: dict(stream_id=5, topic='foo'),
 | 
			
		||||
        1003: dict(stream_id=5, topic='foo'),
 | 
			
		||||
        1004: dict(stream_id=6, topic='baz'),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    lookup_fields = ['stream_id', 'topic']
 | 
			
		||||
 | 
			
		||||
    The first time through the loop:
 | 
			
		||||
        attribute_dict = dict(stream_id=5, topic='foo', sender_id=40)
 | 
			
		||||
        lookup_dict = (5, 'foo')
 | 
			
		||||
        attribute_dict = dict(stream_id=5, topic='foo')
 | 
			
		||||
        lookup_key = (5, 'foo')
 | 
			
		||||
 | 
			
		||||
    lookup_dict = {
 | 
			
		||||
        (5, 'foo'): dict(stream_id=5, topic='foo',
 | 
			
		||||
                         unread_message_ids=[1002, 1003],
 | 
			
		||||
                         sender_ids=[40, 41],
 | 
			
		||||
                        ),
 | 
			
		||||
        ...
 | 
			
		||||
    }
 | 
			
		||||
@@ -901,7 +899,6 @@ def aggregate_message_dict(
 | 
			
		||||
    result = [
 | 
			
		||||
        dict(stream_id=5, topic='foo',
 | 
			
		||||
             unread_message_ids=[1002, 1003],
 | 
			
		||||
             sender_ids=[40, 41],
 | 
			
		||||
            ),
 | 
			
		||||
        ...
 | 
			
		||||
    ]
 | 
			
		||||
@@ -914,19 +911,13 @@ def aggregate_message_dict(
 | 
			
		||||
            for f in lookup_fields:
 | 
			
		||||
                obj[f] = attribute_dict[f]
 | 
			
		||||
            obj["unread_message_ids"] = []
 | 
			
		||||
            if collect_senders:
 | 
			
		||||
                obj["sender_ids"] = set()
 | 
			
		||||
            lookup_dict[lookup_key] = obj
 | 
			
		||||
 | 
			
		||||
        bucket = lookup_dict[lookup_key]
 | 
			
		||||
        bucket["unread_message_ids"].append(message_id)
 | 
			
		||||
        if collect_senders:
 | 
			
		||||
            bucket["sender_ids"].add(attribute_dict["sender_id"])
 | 
			
		||||
 | 
			
		||||
    for dct in lookup_dict.values():
 | 
			
		||||
        dct["unread_message_ids"].sort()
 | 
			
		||||
        if collect_senders:
 | 
			
		||||
            dct["sender_ids"] = sorted(dct["sender_ids"])
 | 
			
		||||
 | 
			
		||||
    sorted_keys = sorted(lookup_dict.keys())
 | 
			
		||||
 | 
			
		||||
@@ -1073,7 +1064,6 @@ def extract_unread_data_from_um_rows(
 | 
			
		||||
            stream_dict[message_id] = dict(
 | 
			
		||||
                stream_id=stream_id,
 | 
			
		||||
                topic=topic,
 | 
			
		||||
                sender_id=sender_id,
 | 
			
		||||
            )
 | 
			
		||||
            if not is_row_muted(stream_id, recipient_id, topic):
 | 
			
		||||
                unmuted_stream_msgs.add(message_id)
 | 
			
		||||
@@ -1137,7 +1127,6 @@ def aggregate_unread_data(raw_data: RawUnreadMessagesResult) -> UnreadMessagesRe
 | 
			
		||||
        lookup_fields=[
 | 
			
		||||
            "sender_id",
 | 
			
		||||
        ],
 | 
			
		||||
        collect_senders=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    stream_objects = aggregate_message_dict(
 | 
			
		||||
@@ -1146,7 +1135,6 @@ def aggregate_unread_data(raw_data: RawUnreadMessagesResult) -> UnreadMessagesRe
 | 
			
		||||
            "stream_id",
 | 
			
		||||
            "topic",
 | 
			
		||||
        ],
 | 
			
		||||
        collect_senders=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    huddle_objects = aggregate_message_dict(
 | 
			
		||||
@@ -1154,7 +1142,6 @@ def aggregate_unread_data(raw_data: RawUnreadMessagesResult) -> UnreadMessagesRe
 | 
			
		||||
        lookup_fields=[
 | 
			
		||||
            "user_ids_string",
 | 
			
		||||
        ],
 | 
			
		||||
        collect_senders=False,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    result: UnreadMessagesResult = dict(
 | 
			
		||||
@@ -1187,15 +1174,12 @@ def apply_unread_message_event(
 | 
			
		||||
    else:
 | 
			
		||||
        raise AssertionError("Invalid message type {}".format(message["type"]))
 | 
			
		||||
 | 
			
		||||
    sender_id = message["sender_id"]
 | 
			
		||||
 | 
			
		||||
    if message_type == "stream":
 | 
			
		||||
        stream_id = message["stream_id"]
 | 
			
		||||
        topic = message[TOPIC_NAME]
 | 
			
		||||
        state["stream_dict"][message_id] = RawUnreadStreamDict(
 | 
			
		||||
            stream_id=stream_id,
 | 
			
		||||
            topic=topic,
 | 
			
		||||
            sender_id=sender_id,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        if stream_id not in state["muted_stream_ids"]:
 | 
			
		||||
 
 | 
			
		||||
@@ -8864,13 +8864,6 @@ paths:
 | 
			
		||||
                                message with the message_id as the key.
 | 
			
		||||
                              additionalProperties: false
 | 
			
		||||
                              properties:
 | 
			
		||||
                                sender_ids:
 | 
			
		||||
                                  type: array
 | 
			
		||||
                                  items:
 | 
			
		||||
                                    type: integer
 | 
			
		||||
                                  description: |
 | 
			
		||||
                                    Array containing the id of the users who have sent recent messages
 | 
			
		||||
                                    on this stream under the given topic which have been unread by the user.
 | 
			
		||||
                                topic:
 | 
			
		||||
                                  type: string
 | 
			
		||||
                                  description: |
 | 
			
		||||
 
 | 
			
		||||
@@ -645,7 +645,6 @@ class GetUnreadMsgsTest(ZulipTestCase):
 | 
			
		||||
        self.assertEqual(
 | 
			
		||||
            stream_dict[message_ids["lunch"][0]],
 | 
			
		||||
            dict(
 | 
			
		||||
                sender_id=cordelia.id,
 | 
			
		||||
                stream_id=get_stream("social", realm).id,
 | 
			
		||||
                topic="lunch",
 | 
			
		||||
            ),
 | 
			
		||||
@@ -870,19 +869,16 @@ class GetUnreadMsgsTest(ZulipTestCase):
 | 
			
		||||
        unread_pm = result["pms"][0]
 | 
			
		||||
        self.assertEqual(unread_pm["sender_id"], sender_id)
 | 
			
		||||
        self.assertEqual(unread_pm["unread_message_ids"], [pm1_message_id, pm2_message_id])
 | 
			
		||||
        self.assertTrue("sender_ids" not in unread_pm)
 | 
			
		||||
 | 
			
		||||
        unread_stream = result["streams"][0]
 | 
			
		||||
        self.assertEqual(unread_stream["stream_id"], get_stream("Denmark", user_profile.realm).id)
 | 
			
		||||
        self.assertEqual(unread_stream["topic"], "muted-topic")
 | 
			
		||||
        self.assertEqual(unread_stream["unread_message_ids"], [muted_topic_message_id])
 | 
			
		||||
        self.assertEqual(unread_stream["sender_ids"], [sender_id])
 | 
			
		||||
 | 
			
		||||
        unread_stream = result["streams"][1]
 | 
			
		||||
        self.assertEqual(unread_stream["stream_id"], get_stream("Denmark", user_profile.realm).id)
 | 
			
		||||
        self.assertEqual(unread_stream["topic"], "test")
 | 
			
		||||
        self.assertEqual(unread_stream["unread_message_ids"], [stream_message_id])
 | 
			
		||||
        self.assertEqual(unread_stream["sender_ids"], [sender_id])
 | 
			
		||||
 | 
			
		||||
        unread_stream = result["streams"][2]
 | 
			
		||||
        self.assertEqual(
 | 
			
		||||
@@ -890,7 +886,6 @@ class GetUnreadMsgsTest(ZulipTestCase):
 | 
			
		||||
        )
 | 
			
		||||
        self.assertEqual(unread_stream["topic"], "test")
 | 
			
		||||
        self.assertEqual(unread_stream["unread_message_ids"], [muted_stream_message_id])
 | 
			
		||||
        self.assertEqual(unread_stream["sender_ids"], [sender_id])
 | 
			
		||||
 | 
			
		||||
        huddle_string = ",".join(
 | 
			
		||||
            str(uid) for uid in sorted([sender_id, user_profile.id, othello.id])
 | 
			
		||||
@@ -899,7 +894,6 @@ class GetUnreadMsgsTest(ZulipTestCase):
 | 
			
		||||
        unread_huddle = result["huddles"][0]
 | 
			
		||||
        self.assertEqual(unread_huddle["user_ids_string"], huddle_string)
 | 
			
		||||
        self.assertEqual(unread_huddle["unread_message_ids"], [huddle_message_id])
 | 
			
		||||
        self.assertTrue("sender_ids" not in unread_huddle)
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(result["mentions"], [])
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -83,7 +83,6 @@ from zerver.models import (
 | 
			
		||||
    get_default_stream_groups,
 | 
			
		||||
    get_realm,
 | 
			
		||||
    get_stream,
 | 
			
		||||
    get_system_bot,
 | 
			
		||||
    get_user,
 | 
			
		||||
    get_user_profile_by_id_in_realm,
 | 
			
		||||
)
 | 
			
		||||
@@ -279,7 +278,6 @@ class TestCreateStreams(ZulipTestCase):
 | 
			
		||||
        self.subscribe(iago, announce_stream.name)
 | 
			
		||||
        self.subscribe(hamlet, announce_stream.name)
 | 
			
		||||
 | 
			
		||||
        notification_bot = get_system_bot(settings.NOTIFICATION_BOT, realm.id)
 | 
			
		||||
        self.login_user(iago)
 | 
			
		||||
 | 
			
		||||
        initial_message_count = Message.objects.count()
 | 
			
		||||
@@ -336,7 +334,6 @@ class TestCreateStreams(ZulipTestCase):
 | 
			
		||||
 | 
			
		||||
        # According to the code in zerver/views/streams/add_subscriptions_backend
 | 
			
		||||
        # the notification stream message is sent first, then the new stream's message.
 | 
			
		||||
        self.assertEqual(hamlet_unread_messages[0]["sender_ids"][0], notification_bot.id)
 | 
			
		||||
        self.assertEqual(hamlet_unread_messages[1]["stream_id"], stream_id)
 | 
			
		||||
 | 
			
		||||
        # But it should be marked as read for Iago, the stream creator.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user