Question

The question here is whether something like this already exists or, if not, whether there's a better way to achieve it than what I describe below.

I need to allow an arbitrary Principal (User, Group, Site Admin) to add Event Sinks (like email addresses, Webhook URLs, etc.) to the system (through the web interface) and, for each one, specify which kinds of <Event Source, Event Type> should be sent to it. Since I'm doing this for ReviewBoard, I'll give a concrete example with a hypothetical implementation:

  1. John creates a new event_sink (a webhook), identified by postbin1;
  2. John specifies that postbin1 will receive events of type publish on ReviewRequests (a class-level subscription -- the source_id is unspecified);
  3. When a new review_request is created, the Event Manager, lists (through a JOIN with subscriptions) all event_sinks interested in ReviewRequests and creates a (instance-level) subscription binding them as a listener to their particular event_type (the name of a django signal) of interest and to the specific review_request;
  4. When that review_request gets published, the Event Manager (who listens to the publish signal) lists all event_sinks interested in that review_request instance and the publish signal and dispatches the signal parameters to their sink method.
  5. The Webhook event_sink marshals the data however pleases it and POSTs it to its URL.

This is the schema I thought of: alt text http://bayimg.com/image/aadgoaacd.jpg

I'm about to start implementing this myself, but I just want to make sure I'm not reinventing the wheel. Couldn't find anything on Google. Ready-to-use package names, half-way package names that will help me, and/or criticism to my DIY approach are all welcome.

Was it helpful?

Solution

django-notification by James Tauber gets you a good chunk of the way there. I would love to see that app mature if you're willing to work off of that codebase it would be great.

OTHER TIPS

I once built something very similar, but as a small, REST app (in TurboGears).

Never quite got the performance and reliability up to where I could use it for anything serious. And it was designed before webhooks started to take root, so I'd probably take that into consideration now.

As I'm also working in Django now, I'll be curious to see what you come up with. I think your design is about right, and this kind of event dispatcher is very useful and worth working on.

Isn't this a case for pub/sub? Maybe something like that

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top