mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
notifications: Add user_id
in the GCM & APNS payload.
This makes it easy to uniquely identify the user account associated with a notification by, for example, the (realm_uri, user_id) pair. This helps improve notifications in the mobile apps. See https://github.com/zulip/zulip-mobile/pull/3407#discussion_r266196616 Fixes #11961.
This commit is contained in:
committed by
Tim Abbott
parent
2eb713552f
commit
4f7c463257
@@ -26,7 +26,7 @@ from zerver.lib.message import access_message, \
|
||||
from zerver.lib.queue import retry_event
|
||||
from zerver.lib.remote_server import send_to_push_bouncer, send_json_to_push_bouncer
|
||||
from zerver.lib.timestamp import datetime_to_timestamp
|
||||
from zerver.models import PushDeviceToken, Message, Realm, Recipient, \
|
||||
from zerver.models import PushDeviceToken, Message, Recipient, \
|
||||
UserMessage, UserProfile, \
|
||||
get_display_recipient, receives_offline_push_notifications, \
|
||||
receives_online_notifications, get_user_profile_by_id, \
|
||||
@@ -513,20 +513,21 @@ def truncate_content(content: str) -> Tuple[str, bool]:
|
||||
return content, False
|
||||
return content[:200] + "…", True
|
||||
|
||||
def get_base_payload(realm: Realm) -> Dict[str, Any]:
|
||||
def get_base_payload(user_profile: UserProfile) -> Dict[str, Any]:
|
||||
'''Common fields for all notification payloads.'''
|
||||
data = {} # type: Dict[str, Any]
|
||||
|
||||
# These will let the app support logging into multiple realms and servers.
|
||||
data['server'] = settings.EXTERNAL_HOST
|
||||
data['realm_id'] = realm.id
|
||||
data['realm_uri'] = realm.uri
|
||||
data['realm_id'] = user_profile.realm.id
|
||||
data['realm_uri'] = user_profile.realm.uri
|
||||
data['user_id'] = user_profile.id
|
||||
|
||||
return data
|
||||
|
||||
def get_message_payload(message: Message) -> Dict[str, Any]:
|
||||
def get_message_payload(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
|
||||
'''Common fields for `message` payloads, for all platforms.'''
|
||||
data = get_base_payload(message.sender.realm)
|
||||
data = get_base_payload(user_profile)
|
||||
|
||||
# `sender_id` is preferred, but some existing versions use `sender_email`.
|
||||
data['sender_id'] = message.sender.id
|
||||
@@ -569,7 +570,7 @@ def get_apns_alert_subtitle(message: Message) -> str:
|
||||
|
||||
def get_message_payload_apns(user_profile: UserProfile, message: Message) -> Dict[str, Any]:
|
||||
'''A `message` payload for iOS, via APNs.'''
|
||||
zulip_data = get_message_payload(message)
|
||||
zulip_data = get_message_payload(user_profile, message)
|
||||
zulip_data.update({
|
||||
'message_ids': [message.id],
|
||||
})
|
||||
@@ -591,7 +592,7 @@ def get_message_payload_gcm(
|
||||
user_profile: UserProfile, message: Message,
|
||||
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
||||
'''A `message` payload + options, for Android via GCM/FCM.'''
|
||||
data = get_message_payload(message)
|
||||
data = get_message_payload(user_profile, message)
|
||||
content, truncated = truncate_content(get_mobile_push_content(message.rendered_content))
|
||||
data.update({
|
||||
'user': user_profile.email,
|
||||
@@ -611,7 +612,7 @@ def get_remove_payload_gcm(
|
||||
user_profile: UserProfile, message_ids: List[int],
|
||||
) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
||||
'''A `remove` payload + options, for Android via GCM/FCM.'''
|
||||
gcm_payload = get_base_payload(user_profile.realm)
|
||||
gcm_payload = get_base_payload(user_profile)
|
||||
gcm_payload.update({
|
||||
'event': 'remove',
|
||||
'zulip_message_ids': ','.join(str(id) for id in message_ids),
|
||||
|
@@ -979,6 +979,7 @@ class TestGetAPNsPayload(PushNotificationTest):
|
||||
'server': settings.EXTERNAL_HOST,
|
||||
'realm_id': message.sender.realm.id,
|
||||
'realm_uri': message.sender.realm.uri,
|
||||
"user_id": user_profile.id,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1014,6 +1015,7 @@ class TestGetAPNsPayload(PushNotificationTest):
|
||||
'server': settings.EXTERNAL_HOST,
|
||||
'realm_id': message.sender.realm.id,
|
||||
'realm_uri': message.sender.realm.uri,
|
||||
"user_id": user_profile.id,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1047,6 +1049,7 @@ class TestGetAPNsPayload(PushNotificationTest):
|
||||
'server': settings.EXTERNAL_HOST,
|
||||
'realm_id': message.sender.realm.id,
|
||||
'realm_uri': message.sender.realm.uri,
|
||||
"user_id": user_profile.id,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1079,6 +1082,7 @@ class TestGetAPNsPayload(PushNotificationTest):
|
||||
'server': settings.EXTERNAL_HOST,
|
||||
'realm_id': message.sender.realm.id,
|
||||
'realm_uri': message.sender.realm.uri,
|
||||
"user_id": user_profile.id,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1114,6 +1118,7 @@ class TestGetAPNsPayload(PushNotificationTest):
|
||||
'server': settings.EXTERNAL_HOST,
|
||||
'realm_id': message.sender.realm.id,
|
||||
'realm_uri': message.sender.realm.uri,
|
||||
"user_id": user_profile.id,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1132,6 +1137,7 @@ class TestGetGCMPayload(PushNotificationTest):
|
||||
payload, gcm_options = get_message_payload_gcm(user_profile, message)
|
||||
self.assertDictEqual(payload, {
|
||||
"user": user_profile.email,
|
||||
"user_id": user_profile.id,
|
||||
"event": "message",
|
||||
"alert": "New mention from King Hamlet",
|
||||
"zulip_message_id": message.id,
|
||||
@@ -1160,6 +1166,7 @@ class TestGetGCMPayload(PushNotificationTest):
|
||||
payload, gcm_options = get_message_payload_gcm(user_profile, message)
|
||||
self.assertDictEqual(payload, {
|
||||
"user": user_profile.email,
|
||||
"user_id": user_profile.id,
|
||||
"event": "message",
|
||||
"alert": "New private message from King Hamlet",
|
||||
"zulip_message_id": message.id,
|
||||
@@ -1187,6 +1194,7 @@ class TestGetGCMPayload(PushNotificationTest):
|
||||
payload, gcm_options = get_message_payload_gcm(user_profile, message)
|
||||
self.assertDictEqual(payload, {
|
||||
"user": user_profile.email,
|
||||
"user_id": user_profile.id,
|
||||
"event": "message",
|
||||
"alert": "New stream message from King Hamlet in Denmark",
|
||||
"zulip_message_id": message.id,
|
||||
@@ -1217,6 +1225,7 @@ class TestGetGCMPayload(PushNotificationTest):
|
||||
payload, gcm_options = get_message_payload_gcm(user_profile, message)
|
||||
self.assertDictEqual(payload, {
|
||||
"user": user_profile.email,
|
||||
"user_id": user_profile.id,
|
||||
"event": "message",
|
||||
"alert": "New stream message from King Hamlet in Denmark",
|
||||
"zulip_message_id": message.id,
|
||||
|
Reference in New Issue
Block a user