diff --git a/zerver/lib/exceptions.py b/zerver/lib/exceptions.py index 32ca5c79ef..b6c7f5e970 100644 --- a/zerver/lib/exceptions.py +++ b/zerver/lib/exceptions.py @@ -51,6 +51,7 @@ class ErrorCode(Enum): STREAM_WILDCARD_MENTION_NOT_ALLOWED = auto() REMOTE_BILLING_UNAUTHENTICATED_USER = auto() REMOTE_REALM_SERVER_MISMATCH_ERROR = auto() + PUSH_NOTIFICATIONS_DISALLOWED = auto() class JsonableError(Exception): diff --git a/zerver/tests/test_push_notifications.py b/zerver/tests/test_push_notifications.py index 52904779cc..87b107b56d 100644 --- a/zerver/tests/test_push_notifications.py +++ b/zerver/tests/test_push_notifications.py @@ -827,8 +827,11 @@ class PushBouncerNotificationTest(BouncerTestCase): payload, content_type="application/json", ) - self.assert_json_error(result, "Your plan doesn't allow sending push notifications.") - self.assertEqual(orjson.loads(result.content)["code"], "BAD_REQUEST") + self.assert_json_error( + result, + "Your plan doesn't allow sending push notifications. Reason provided by the server: Missing data", + ) + self.assertEqual(orjson.loads(result.content)["code"], "PUSH_NOTIFICATIONS_DISALLOWED") human_counts = { str(UserProfile.ROLE_REALM_ADMINISTRATOR): 1, @@ -852,8 +855,11 @@ class PushBouncerNotificationTest(BouncerTestCase): payload, content_type="application/json", ) - self.assert_json_error(result, "Your plan doesn't allow sending push notifications.") - self.assertEqual(orjson.loads(result.content)["code"], "BAD_REQUEST") + self.assert_json_error( + result, + "Your plan doesn't allow sending push notifications. Reason provided by the server: No plan many users", + ) + self.assertEqual(orjson.loads(result.content)["code"], "PUSH_NOTIFICATIONS_DISALLOWED") # Check that sponsored realms are allowed to send push notifications. remote_server.plan_type = RemoteRealm.PLAN_TYPE_COMMUNITY diff --git a/zilencer/views.py b/zilencer/views.py index b5d4395db8..1d66613d89 100644 --- a/zilencer/views.py +++ b/zilencer/views.py @@ -432,6 +432,16 @@ class OldZulipServerError(JsonableError): self._msg: str = msg +class PushNotificationsDisallowedError(JsonableError): + code = ErrorCode.PUSH_NOTIFICATIONS_DISALLOWED + + def __init__(self, reason: str) -> None: + msg = _( + "Your plan doesn't allow sending push notifications. Reason provided by the server: {reason}" + ).format(reason=reason) + super().__init__(msg) + + @has_request_variables def remote_server_notify_push( request: HttpRequest, @@ -462,7 +472,8 @@ def remote_server_notify_push( if server.last_api_feature_level is None: raise OldZulipServerError(_("Your plan doesn't allow sending push notifications.")) else: - raise JsonableError(_("Your plan doesn't allow sending push notifications.")) + reason = push_status.message + raise PushNotificationsDisallowedError(reason=reason) android_devices = list( RemotePushDeviceToken.objects.filter(