5
5
from .conf import get_manager
6
6
from .exceptions import WebPushError
7
7
8
+ from .models import WebPushDevice
9
+
8
10
9
11
def get_subscription_info (application_id , uri , browser , auth , p256dh ):
10
12
if uri .startswith ("https://" ):
@@ -26,12 +28,43 @@ def get_subscription_info(application_id, uri, browser, auth, p256dh):
26
28
}
27
29
28
30
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" : []}
30
64
subscription_info = get_subscription_info (
31
65
device .application_id , device .registration_id ,
32
66
device .browser , device .auth , device .p256dh )
33
67
try :
34
- results = {"results" : [{"original_registration_id" : device .registration_id }]}
35
68
response = webpush (
36
69
subscription_info = subscription_info ,
37
70
data = message ,
@@ -40,16 +73,23 @@ def webpush_send_message(device, message, **kwargs):
40
73
** kwargs
41
74
)
42
75
if response .ok :
43
- results ["success" ] = 1
76
+ results ["success" ] += 1
77
+ results ["results" ].append ({'original_registration_id' : device .registration_id })
44
78
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 })
47
82
return results
48
83
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' ,))
54
93
return results
55
- raise WebPushError (e .message )
94
+ raise WebPushError (exception_message )
95
+
0 commit comments