mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	reaction: Add user object back in reaction events.
				
					
				
			The deprecated `user` object was removed from message objects and reaction events in #32701. This commit restores the `user` object in reaction events to maintain compatibility with mobile clients.
This commit is contained in:
		@@ -20,6 +20,14 @@ format used by the Zulip server that they are interacting with.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Changes in Zulip 10.0
 | 
					## Changes in Zulip 10.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Feature level 339**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* [`GET /events`](/api/get-events): Added `user` field back in
 | 
				
			||||||
 | 
					  `reaction` events, reverting part of the [feature level 328
 | 
				
			||||||
 | 
					  changes](#feature-level-328). Note that this field was only restored
 | 
				
			||||||
 | 
					  in the events API, and remains deprecated, pending core clients
 | 
				
			||||||
 | 
					  fully migrating away from accessing it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
**Feature level 338**
 | 
					**Feature level 338**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* [`POST /register`](/api/register-queue): Added `password_max_length`
 | 
					* [`POST /register`](/api/register-queue): Added `password_max_length`
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,7 +34,7 @@ DESKTOP_WARNING_VERSION = "5.9.3"
 | 
				
			|||||||
# new level means in api_docs/changelog.md, as well as "**Changes**"
 | 
					# new level means in api_docs/changelog.md, as well as "**Changes**"
 | 
				
			||||||
# entries in the endpoint's documentation in `zulip.yaml`.
 | 
					# entries in the endpoint's documentation in `zulip.yaml`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
API_FEATURE_LEVEL = 338  # Last bumped for adding password_max_length.
 | 
					API_FEATURE_LEVEL = 339  # Last bumped for reaction events.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Bump the minor PROVISION_VERSION to indicate that folks should provision
 | 
					# Bump the minor PROVISION_VERSION to indicate that folks should provision
 | 
				
			||||||
# only when going from an old version of the code to a newer version. Bump
 | 
					# only when going from an old version of the code to a newer version. Bump
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -238,6 +238,11 @@ exports.fixtures = {
 | 
				
			|||||||
        emoji_name: "airplane",
 | 
					        emoji_name: "airplane",
 | 
				
			||||||
        emoji_code: "2708",
 | 
					        emoji_code: "2708",
 | 
				
			||||||
        user_id: test_user.user_id,
 | 
					        user_id: test_user.user_id,
 | 
				
			||||||
 | 
					        user: {
 | 
				
			||||||
 | 
					            email: test_user.email,
 | 
				
			||||||
 | 
					            full_name: test_user.full_name,
 | 
				
			||||||
 | 
					            user_id: test_user.user_id,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    reaction__remove: {
 | 
					    reaction__remove: {
 | 
				
			||||||
@@ -248,6 +253,11 @@ exports.fixtures = {
 | 
				
			|||||||
        emoji_name: "8ball",
 | 
					        emoji_name: "8ball",
 | 
				
			||||||
        emoji_code: "1f3b1",
 | 
					        emoji_code: "1f3b1",
 | 
				
			||||||
        user_id: test_user.user_id,
 | 
					        user_id: test_user.user_id,
 | 
				
			||||||
 | 
					        user: {
 | 
				
			||||||
 | 
					            email: test_user.email,
 | 
				
			||||||
 | 
					            full_name: test_user.full_name,
 | 
				
			||||||
 | 
					            user_id: test_user.user_id,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    realm__deactivated: {
 | 
					    realm__deactivated: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,10 +20,20 @@ from zerver.tornado.django_api import send_event_on_commit
 | 
				
			|||||||
def notify_reaction_update(
 | 
					def notify_reaction_update(
 | 
				
			||||||
    user_profile: UserProfile, message: Message, reaction: Reaction, op: str
 | 
					    user_profile: UserProfile, message: Message, reaction: Reaction, op: str
 | 
				
			||||||
) -> None:
 | 
					) -> None:
 | 
				
			||||||
 | 
					    user_dict = {
 | 
				
			||||||
 | 
					        "user_id": user_profile.id,
 | 
				
			||||||
 | 
					        "email": user_profile.email,
 | 
				
			||||||
 | 
					        "full_name": user_profile.full_name,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    event: dict[str, Any] = {
 | 
					    event: dict[str, Any] = {
 | 
				
			||||||
        "type": "reaction",
 | 
					        "type": "reaction",
 | 
				
			||||||
        "op": op,
 | 
					        "op": op,
 | 
				
			||||||
        "user_id": user_profile.id,
 | 
					        "user_id": user_profile.id,
 | 
				
			||||||
 | 
					        # TODO: We plan to remove this redundant user_dict object once
 | 
				
			||||||
 | 
					        # clients are updated to support accessing use user_id.  See
 | 
				
			||||||
 | 
					        # https://github.com/zulip/zulip/pull/14711 for details.
 | 
				
			||||||
 | 
					        "user": user_dict,
 | 
				
			||||||
        "message_id": message.id,
 | 
					        "message_id": message.id,
 | 
				
			||||||
        "emoji_name": reaction.emoji_name,
 | 
					        "emoji_name": reaction.emoji_name,
 | 
				
			||||||
        "emoji_code": reaction.emoji_code,
 | 
					        "emoji_code": reaction.emoji_code,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -288,6 +288,15 @@ class EventPresence(EventPresenceCore):
 | 
				
			|||||||
    email: str | None = None
 | 
					    email: str | None = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Type for the legacy user field; the `user_id` field is intended to
 | 
				
			||||||
 | 
					# replace this and we expect to remove this once clients have migrated
 | 
				
			||||||
 | 
					# to support the modern API.
 | 
				
			||||||
 | 
					class ReactionLegacyUserType(BaseModel):
 | 
				
			||||||
 | 
					    email: str
 | 
				
			||||||
 | 
					    full_name: str
 | 
				
			||||||
 | 
					    user_id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class EventReactionAdd(BaseModel):
 | 
					class EventReactionAdd(BaseModel):
 | 
				
			||||||
    type: Literal["reaction"]
 | 
					    type: Literal["reaction"]
 | 
				
			||||||
    op: Literal["add"]
 | 
					    op: Literal["add"]
 | 
				
			||||||
@@ -296,6 +305,7 @@ class EventReactionAdd(BaseModel):
 | 
				
			|||||||
    emoji_code: str
 | 
					    emoji_code: str
 | 
				
			||||||
    reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
 | 
					    reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
 | 
				
			||||||
    user_id: int
 | 
					    user_id: int
 | 
				
			||||||
 | 
					    user: ReactionLegacyUserType
 | 
				
			||||||
    id: int
 | 
					    id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -307,6 +317,7 @@ class EventReactionRemove(BaseModel):
 | 
				
			|||||||
    emoji_code: str
 | 
					    emoji_code: str
 | 
				
			||||||
    reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
 | 
					    reaction_type: Literal["realm_emoji", "unicode_emoji", "zulip_extra_emoji"]
 | 
				
			||||||
    user_id: int
 | 
					    user_id: int
 | 
				
			||||||
 | 
					    user: ReactionLegacyUserType
 | 
				
			||||||
    id: int
 | 
					    id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1564,11 +1564,18 @@ paths:
 | 
				
			|||||||
                                    emoji_name: {}
 | 
					                                    emoji_name: {}
 | 
				
			||||||
                                    reaction_type: {}
 | 
					                                    reaction_type: {}
 | 
				
			||||||
                                    user_id: {}
 | 
					                                    user_id: {}
 | 
				
			||||||
 | 
					                                    user: {}
 | 
				
			||||||
                                  example:
 | 
					                                  example:
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                      "type": "reaction",
 | 
					                                      "type": "reaction",
 | 
				
			||||||
                                      "op": "add",
 | 
					                                      "op": "add",
 | 
				
			||||||
                                      "user_id": 10,
 | 
					                                      "user_id": 10,
 | 
				
			||||||
 | 
					                                      "user":
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                          "user_id": 10,
 | 
				
			||||||
 | 
					                                          "email": "user10@zulip.testserver",
 | 
				
			||||||
 | 
					                                          "full_name": "King Hamlet",
 | 
				
			||||||
 | 
					                                        },
 | 
				
			||||||
                                      "message_id": 32,
 | 
					                                      "message_id": 32,
 | 
				
			||||||
                                      "emoji_name": "tada",
 | 
					                                      "emoji_name": "tada",
 | 
				
			||||||
                                      "emoji_code": "1f389",
 | 
					                                      "emoji_code": "1f389",
 | 
				
			||||||
@@ -1603,11 +1610,18 @@ paths:
 | 
				
			|||||||
                                    emoji_name: {}
 | 
					                                    emoji_name: {}
 | 
				
			||||||
                                    reaction_type: {}
 | 
					                                    reaction_type: {}
 | 
				
			||||||
                                    user_id: {}
 | 
					                                    user_id: {}
 | 
				
			||||||
 | 
					                                    user: {}
 | 
				
			||||||
                                  example:
 | 
					                                  example:
 | 
				
			||||||
                                    {
 | 
					                                    {
 | 
				
			||||||
                                      "type": "reaction",
 | 
					                                      "type": "reaction",
 | 
				
			||||||
                                      "op": "remove",
 | 
					                                      "op": "remove",
 | 
				
			||||||
                                      "user_id": 10,
 | 
					                                      "user_id": 10,
 | 
				
			||||||
 | 
					                                      "user":
 | 
				
			||||||
 | 
					                                        {
 | 
				
			||||||
 | 
					                                          "user_id": 10,
 | 
				
			||||||
 | 
					                                          "email": "user10@zulip.testserver",
 | 
				
			||||||
 | 
					                                          "full_name": "King Hamlet",
 | 
				
			||||||
 | 
					                                        },
 | 
				
			||||||
                                      "message_id": 52,
 | 
					                                      "message_id": 52,
 | 
				
			||||||
                                      "emoji_name": "tada",
 | 
					                                      "emoji_name": "tada",
 | 
				
			||||||
                                      "emoji_code": "1f389",
 | 
					                                      "emoji_code": "1f389",
 | 
				
			||||||
@@ -23415,10 +23429,43 @@ components:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                **Changes**: New in Zulip 3.0 (feature level 2). The `user`
 | 
					                **Changes**: New in Zulip 3.0 (feature level 2). The `user`
 | 
				
			||||||
                object is deprecated and will be removed in the future.
 | 
					                object is deprecated and will be removed in the future.
 | 
				
			||||||
 | 
					            user:
 | 
				
			||||||
 | 
					              type: object
 | 
				
			||||||
 | 
					              additionalProperties: false
 | 
				
			||||||
 | 
					              deprecated: true
 | 
				
			||||||
 | 
					              description: |
 | 
				
			||||||
 | 
					                Dictionary with data on the user who added the
 | 
				
			||||||
 | 
					                reaction, including the user ID as the `user_id`
 | 
				
			||||||
 | 
					                field.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                In Zulip 10.0 (feature level 328), the deprecated `user` object
 | 
					                **Changes**: This field was re-added in Zulip 10.0 (feature
 | 
				
			||||||
                was removed which contained the following properties: `user_id`,
 | 
					                level 339) after having been removed in Zulip 10.0 (feature
 | 
				
			||||||
                `email`, `full_name` and `is_mirror_dummy`.
 | 
					                level 328). It remains deprecated; it was re-added because the
 | 
				
			||||||
 | 
					                React Native mobile app was still using it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Deprecated and to be removed in a future release once core
 | 
				
			||||||
 | 
					                clients have migrated to use the adjacent `user_id` field, which
 | 
				
			||||||
 | 
					                was introduced in Zulip 3.0 (feature level 2).  Clients
 | 
				
			||||||
 | 
					                supporting older Zulip server versions should use the user ID
 | 
				
			||||||
 | 
					                mentioned in the description above as they would the `user_id`
 | 
				
			||||||
 | 
					                field.
 | 
				
			||||||
 | 
					              properties:
 | 
				
			||||||
 | 
					                user_id:
 | 
				
			||||||
 | 
					                  type: integer
 | 
				
			||||||
 | 
					                  description: |
 | 
				
			||||||
 | 
					                    ID of the user.
 | 
				
			||||||
 | 
					                email:
 | 
				
			||||||
 | 
					                  type: string
 | 
				
			||||||
 | 
					                  description: |
 | 
				
			||||||
 | 
					                    Zulip API email of the user.
 | 
				
			||||||
 | 
					                full_name:
 | 
				
			||||||
 | 
					                  type: string
 | 
				
			||||||
 | 
					                  description: |
 | 
				
			||||||
 | 
					                    Full name of the user.
 | 
				
			||||||
 | 
					                is_mirror_dummy:
 | 
				
			||||||
 | 
					                  type: boolean
 | 
				
			||||||
 | 
					                  description: |
 | 
				
			||||||
 | 
					                    Whether the user is a mirror dummy.
 | 
				
			||||||
    MessagesEvent:
 | 
					    MessagesEvent:
 | 
				
			||||||
      allOf:
 | 
					      allOf:
 | 
				
			||||||
        - $ref: "#/components/schemas/MessagesBase"
 | 
					        - $ref: "#/components/schemas/MessagesBase"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -441,6 +441,7 @@ class ReactionEventTest(ZulipTestCase):
 | 
				
			|||||||
        event_user_ids = set(events[0]["users"])
 | 
					        event_user_ids = set(events[0]["users"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
					        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["email"], reaction_sender.email)
 | 
				
			||||||
        self.assertEqual(event["type"], "reaction")
 | 
					        self.assertEqual(event["type"], "reaction")
 | 
				
			||||||
        self.assertEqual(event["op"], "add")
 | 
					        self.assertEqual(event["op"], "add")
 | 
				
			||||||
        self.assertEqual(event["emoji_name"], "smile")
 | 
					        self.assertEqual(event["emoji_name"], "smile")
 | 
				
			||||||
@@ -1060,6 +1061,9 @@ class ReactionAPIEventTest(EmojiReactionBase):
 | 
				
			|||||||
        event_user_ids = set(events[0]["users"])
 | 
					        event_user_ids = set(events[0]["users"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
					        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["user_id"], reaction_sender.id)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["email"], reaction_sender.email)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["full_name"], reaction_sender.full_name)
 | 
				
			||||||
        self.assertEqual(event["type"], "reaction")
 | 
					        self.assertEqual(event["type"], "reaction")
 | 
				
			||||||
        self.assertEqual(event["op"], "add")
 | 
					        self.assertEqual(event["op"], "add")
 | 
				
			||||||
        self.assertEqual(event["message_id"], pm_id)
 | 
					        self.assertEqual(event["message_id"], pm_id)
 | 
				
			||||||
@@ -1102,6 +1106,9 @@ class ReactionAPIEventTest(EmojiReactionBase):
 | 
				
			|||||||
        event_user_ids = set(events[0]["users"])
 | 
					        event_user_ids = set(events[0]["users"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
					        self.assertEqual(expected_recipient_ids, event_user_ids)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["user_id"], reaction_sender.id)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["email"], reaction_sender.email)
 | 
				
			||||||
 | 
					        self.assertEqual(event["user"]["full_name"], reaction_sender.full_name)
 | 
				
			||||||
        self.assertEqual(event["type"], "reaction")
 | 
					        self.assertEqual(event["type"], "reaction")
 | 
				
			||||||
        self.assertEqual(event["op"], "remove")
 | 
					        self.assertEqual(event["op"], "remove")
 | 
				
			||||||
        self.assertEqual(event["message_id"], pm_id)
 | 
					        self.assertEqual(event["message_id"], pm_id)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user