Handle Mandrill sync event webhooks

Fixes #108
This commit is contained in:
medmunds
2016-02-03 19:29:26 -08:00
parent 5d4440ef5d
commit 79eaac42c4
4 changed files with 49 additions and 4 deletions

View File

@@ -101,3 +101,22 @@ class DjrillWebhookViewTests(TestCase):
}) })
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(self.signal_received_count, 1) self.assertEqual(self.signal_received_count, 1)
def test_webhook_sync_event(self):
# Mandrill sync events use a different format from other events
# https://mandrill.zendesk.com/hc/en-us/articles/205583297-Sync-Event-Webhook-format
self.signal_received_count = 0
test_event = {"type": "whitelist", "action": "add"}
def my_callback(sender, event_type, data, **kwargs):
self.signal_received_count += 1
self.assertEqual(event_type, 'whitelist_add') # synthesized event_type
self.assertEqual(data, test_event)
webhook_event.connect(my_callback)
response = self.client.post('/webhook/?secret=abc123', {
'mandrill_events': json.dumps([test_event])
})
self.assertEqual(response.status_code, 200)
self.assertEqual(self.signal_received_count, 1)

View File

@@ -79,6 +79,21 @@ class DjrillWebhookView(DjrillWebhookSecretMixin, DjrillWebhookSignatureMixin, V
for event in data: for event in data:
webhook_event.send( webhook_event.send(
sender=None, event_type=event['event'], data=event) sender=None, event_type=self.get_event_type(event), data=event)
return HttpResponse() return HttpResponse()
def get_event_type(self, event):
try:
# Message event: https://mandrill.zendesk.com/hc/en-us/articles/205583307
# Inbound event: https://mandrill.zendesk.com/hc/en-us/articles/205583207
event_type = event['event']
except KeyError:
try:
# Sync event: https://mandrill.zendesk.com/hc/en-us/articles/205583297
# Synthesize an event_type like "whitelist_add" or "blacklist_change"
event_type = "%s_%s" % (event['type'], event['action'])
except KeyError:
# Unknown future event format
event_type = None
return event_type

View File

@@ -15,6 +15,8 @@ Djrill 2.x
Version 2.1 (in development): Version 2.1 (in development):
* Handle Mandrill rejection whitelist/blacklist sync event webhooks
Version 2.0: Version 2.0:

View File

@@ -138,6 +138,15 @@ Examples:
data['msg']['subject'] data['msg']['subject']
) )
@receiver(webhook_event)
def handle_whitelist_sync(sender, event_type, data, **kwargs):
if event_type == 'whitelist_add' or event_type == 'whitelist_remove':
print "Rejection whitelist update: %s email %s (%s)" % (
data['action'],
data['reject']['email'],
data['reject']['reason']
)
Note that your webhook_event signal handlers will be called for all Mandrill Note that your webhook_event signal handlers will be called for all Mandrill
webhook callbacks, so you should always check the `event_type` param as shown webhook callbacks, so you should always check the `event_type` param as shown
@@ -147,11 +156,11 @@ Mandrill batches up multiple events into a single webhook call.
Djrill will invoke your signal handler once for each event in the batch. Djrill will invoke your signal handler once for each event in the batch.
The available fields in the `data` param are described in Mandrill's documentation: The available fields in the `data` param are described in Mandrill's documentation:
`sent-message webhooks`_ and `inbound webhooks`_. `sent-message webhooks`_, `inbound webhooks`_, and `whitelist/blacklist sync webooks`_.
.. _Django signal: https://docs.djangoproject.com/en/stable/topics/signals/ .. _Django signal: https://docs.djangoproject.com/en/stable/topics/signals/
.. _inbound webhooks: .. _inbound webhooks:
http://help.mandrill.com/entries/22092308-What-is-the-format-of-inbound-email-webhooks- http://help.mandrill.com/entries/22092308-What-is-the-format-of-inbound-email-webhooks-
.. _sent-message webhooks: http://help.mandrill.com/entries/21738186-Introduction-to-Webhooks .. _sent-message webhooks: http://help.mandrill.com/entries/21738186-Introduction-to-Webhooks
.. _whitelist/blacklist sync webooks:
https://mandrill.zendesk.com/hc/en-us/articles/205583297-Sync-Event-Webhook-format