Skip to content

Commit 2e2a51d

Browse files
committed
Improve error web push treatments
1 parent 16d43c2 commit 2e2a51d

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

push_notifications/models.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,11 @@ def get_queryset(self):
242242

243243
class WebPushDeviceQuerySet(models.query.QuerySet):
244244
def send_message(self, message, **kwargs):
245+
from .webpush import webpush_send_bulk_message
245246
devices = self.filter(active=True).order_by("application_id").distinct()
246-
res = []
247-
for device in devices:
248-
res.append(device.send_message(message))
249-
250-
return res
247+
ret = []
248+
ret.append(webpush_send_bulk_message(devices, message, **kwargs))
249+
return ret
251250

252251

253252
class WebPushDevice(Device):

push_notifications/webpush.py

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from .conf import get_manager
66
from .exceptions import WebPushError
77

8+
from .models import WebPushDevice
9+
810

911
def get_subscription_info(application_id, uri, browser, auth, p256dh):
1012
if uri.startswith("https://"):
@@ -26,12 +28,43 @@ def get_subscription_info(application_id, uri, browser, auth, p256dh):
2628
}
2729

2830

29-
def webpush_send_message(device, message, **kwargs):
31+
def webpush_send_bulk_message(devices, message, **kwargs):
32+
results = {
33+
"success": 0,
34+
"failure": 0,
35+
"results": []}
36+
exception_message = ''
37+
for device in devices:
38+
try:
39+
webpush_send_message(device, message, results=results, **kwargs)
40+
except WebPushError as e:
41+
if exception_message != '':
42+
exception_message += '\n\n'
43+
exception_message += f'{e} device pk: {device.pk}'
44+
45+
ids_to_disable = []
46+
for result in results["results"]:
47+
if "error" in result:
48+
ids_to_disable.append(result["original_registration_id"])
49+
WebPushDevice.objects.filter(registration_id__in=ids_to_disable).update(active=False)
50+
51+
if exception_message:
52+
raise WebPushError(exception_message)
53+
54+
return results
55+
56+
57+
def webpush_send_message(device, message, results=None, **kwargs):
58+
bulk = results is not None
59+
if not bulk:
60+
results = {
61+
"success": 0,
62+
"failure": 0,
63+
"results": []}
3064
subscription_info = get_subscription_info(
3165
device.application_id, device.registration_id,
3266
device.browser, device.auth, device.p256dh)
3367
try:
34-
results = {"results": [{"original_registration_id": device.registration_id}]}
3568
response = webpush(
3669
subscription_info=subscription_info,
3770
data=message,
@@ -40,16 +73,23 @@ def webpush_send_message(device, message, **kwargs):
4073
**kwargs
4174
)
4275
if response.ok:
43-
results["success"] = 1
76+
results["success"] += 1
77+
results["results"].append({'original_registration_id': device.registration_id})
4478
else:
45-
results["failure"] = 1
46-
results["results"][0]["error"] = response.content
79+
results["failure"] += 1
80+
results["results"].append({'error': response.content,
81+
'original_registration_id': device.registration_id})
4782
return results
4883
except WebPushException as e:
49-
if e.response is not None and e.response.status_code in [404, 410]:
50-
results["failure"] = 1
51-
results["results"][0]["error"] = e.message
52-
device.active = False
53-
device.save()
84+
exception_message = str(e)
85+
if e.response is not None and e.response.status_code in [400, 404, 410]:
86+
results["failure"] += 1
87+
results["results"].append(
88+
{'error': exception_message,
89+
'original_registration_id': device.registration_id})
90+
if not bulk:
91+
device.active = False
92+
device.save(update_fields=('active',))
5493
return results
55-
raise WebPushError(e.message)
94+
raise WebPushError(exception_message)
95+

0 commit comments

Comments
 (0)