zilencer: Improve json error when plan doesn't allow push notifs.

This allows the self-hosted server to explicitly test for that exception
and catch and log it nicely.

(cherry picked from commit 5b03932d5c)
This commit is contained in:
Mateusz Mandera 2024-02-06 23:02:01 +01:00 committed by Tim Abbott
parent 3d8b9af76d
commit 0a1905ea8d
3 changed files with 23 additions and 5 deletions

View File

@ -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):

View File

@ -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

View File

@ -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(