def remote_server_notify_push( request: HttpRequest, entity: Union[UserProfile, RemoteZulipServer], payload: Dict[str, Any] = REQ(argument_type='body') ) -> HttpResponse: validate_entity(entity) server = cast(RemoteZulipServer, entity) user_id = payload['user_id'] gcm_payload = payload['gcm_payload'] apns_payload = payload['apns_payload'] android_devices = list( RemotePushDeviceToken.objects.filter(user_id=user_id, kind=RemotePushDeviceToken.GCM, server=server)) apple_devices = list( RemotePushDeviceToken.objects.filter(user_id=user_id, kind=RemotePushDeviceToken.APNS, server=server)) if android_devices: send_android_push_notification(android_devices, gcm_payload, remote=True) if apple_devices: send_apple_push_notification(user_id, apple_devices, apns_payload) return json_success()
def remote_server_notify_push(request: HttpRequest, entity: Union[UserProfile, RemoteZulipServer], payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse: validate_entity(entity) server = cast(RemoteZulipServer, entity) user_id = payload['user_id'] gcm_payload = payload['gcm_payload'] apns_payload = payload['apns_payload'] android_devices = list(RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.GCM, server=server )) apple_devices = list(RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.APNS, server=server )) if android_devices: send_android_push_notification(android_devices, gcm_payload, remote=True) if apple_devices: send_apple_push_notification(user_id, apple_devices, apns_payload, remote=True) return json_success()
def remote_server_notify_push( request: HttpRequest, entity: Union[UserProfile, RemoteZulipServer], payload: Dict[str, Any] = REQ(argument_type="body"), ) -> HttpResponse: server = validate_entity(entity) user_id = payload["user_id"] gcm_payload = payload["gcm_payload"] apns_payload = payload["apns_payload"] gcm_options = payload.get("gcm_options", {}) android_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.GCM, server=server, ) ) apple_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.APNS, server=server, ) ) send_android_push_notification(android_devices, gcm_payload, gcm_options, remote=True) send_apple_push_notification(user_id, apple_devices, apns_payload, remote=True) return json_success()
def test_send_apple_push_notifiction(self, mock_send, mock_info, mock_warn): # type: (mock.MagicMock, mock.MagicMock, mock.MagicMock) -> None def test_send(user, message, alert): # type: (UserProfile, Message, str) -> None self.assertEqual(user.id, self.user_profile.id) self.assertEqual(set(message.tokens), set(self.tokens)) mock_send.side_effect = test_send apn.send_apple_push_notification(self.user_profile, "test alert") self.assertEqual(mock_send.call_count, 1)
def remote_server_notify_push( request: HttpRequest, entity: Union[UserProfile, RemoteZulipServer], payload: Dict[str, Any] = REQ(argument_type="body"), ) -> HttpResponse: server = validate_entity(entity) user_id = payload["user_id"] gcm_payload = payload["gcm_payload"] apns_payload = payload["apns_payload"] gcm_options = payload.get("gcm_options", {}) android_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.GCM, server=server, )) apple_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.APNS, server=server, )) logger.info( "Sending mobile push notifications for remote user %s:%s: %s via FCM devices, %s via APNs devices", server.uuid, user_id, len(android_devices), len(apple_devices), ) send_android_push_notification(user_id, android_devices, gcm_payload, gcm_options, remote=server) send_apple_push_notification(user_id, apple_devices, apns_payload, remote=server) return json_success({ "total_android_devices": len(android_devices), "total_apple_devices": len(apple_devices) })
def send(self, devices=None, payload_data={}): # type: (Optional[List[PushDeviceToken]], Dict[str, Any]) -> None if devices is None: devices = self.devices() apn.send_apple_push_notification( self.user_profile.id, devices, payload_data)
def remote_server_notify_push( request: HttpRequest, entity: Union[UserProfile, RemoteZulipServer], payload: Dict[str, Any] = REQ(argument_type="body"), ) -> HttpResponse: server = validate_entity(entity) user_id = payload["user_id"] gcm_payload = payload["gcm_payload"] apns_payload = payload["apns_payload"] gcm_options = payload.get("gcm_options", {}) android_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.GCM, server=server, )) apple_devices = list( RemotePushDeviceToken.objects.filter( user_id=user_id, kind=RemotePushDeviceToken.APNS, server=server, )) logger.info( "Sending mobile push notifications for remote user %s:%s: %s via FCM devices, %s via APNs devices", server.uuid, user_id, len(android_devices), len(apple_devices), ) # Truncate incoming pushes to 200, due to APNs maximum message # sizes; see handle_remove_push_notification for the version of # this for notifications generated natively on the server. We # apply this to remote-server pushes in case they predate that # commit. def truncate_payload(payload: Dict[str, Any]) -> Dict[str, Any]: MAX_MESSAGE_IDS = 200 if payload and payload.get("event") == "remove" and payload.get( "zulip_message_ids"): ids = [int(id) for id in payload["zulip_message_ids"].split(",")] truncated_ids = list(sorted(ids))[-MAX_MESSAGE_IDS:] payload["zulip_message_ids"] = ",".join( str(id) for id in truncated_ids) return payload gcm_payload = truncate_payload(gcm_payload) send_android_push_notification(user_id, android_devices, gcm_payload, gcm_options, remote=server) if isinstance(apns_payload.get("custom"), dict) and isinstance( apns_payload["custom"].get("zulip"), dict): apns_payload["custom"]["zulip"] = truncate_payload( apns_payload["custom"]["zulip"]) send_apple_push_notification(user_id, apple_devices, apns_payload, remote=server) return json_success( request, data={ "total_android_devices": len(android_devices), "total_apple_devices": len(apple_devices), }, )
def test_connection_both_none(self, mock_push, mock_error): # type: (mock.MagicMock, mock.MagicMock) -> None apn.connection = None apn.dbx_connection = None apn.send_apple_push_notification(self.user_profile, "test alert")
def test_connection_single_none(self, mock_push, mock_info, mock_warn): # type: (mock.MagicMock, mock.MagicMock, mock.MagicMock) -> None apn.connection = None apn.send_apple_push_notification(self.user_profile, "test alert")