示例#1
0
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()
示例#2
0
文件: views.py 项目: phansen01/zulip
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()
示例#3
0
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)
示例#5
0
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)
示例#7
0
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")