diff --git a/docs/reference/index.rst b/docs/reference/index.rst index e9c9edd123..61102f1374 100644 --- a/docs/reference/index.rst +++ b/docs/reference/index.rst @@ -9,4 +9,5 @@ Reference contrib/index management_commands hooks + signals project_template diff --git a/docs/reference/signals.rst b/docs/reference/signals.rst new file mode 100644 index 0000000000..ae6e08c305 --- /dev/null +++ b/docs/reference/signals.rst @@ -0,0 +1,88 @@ +.. _signals: + +Signals +======= + +Wagtail's `PageRevision <./pages/model_reference#pagerevision>`__ and +`Page <./pages/model_reference#page>`__ implement +`Signals `__ from ``django.dispatch``. +Signals are useful for creating side-effects from page publish/unpublish events. + +Primarily, these are used by the `Frontend Cache <./contrib/frontendcache>`__ contrib module +and the `Wagtail API <./contrib/api/index>`__. You could also use signals to send +publish notifications to a messaging service, or ``POST`` messages to another +app that's consuming the API, such as a static site generator. + + +page_published +-------------- + +This signal is emitted from a ``PageRevision`` when a revision is set to `published`. + +:sender: The page ``class`` +:instance: The specific ``Page`` instance. +:revision: The ``PageRevision`` that was published +:kwargs: Any other arguments passed to ``page_published.send()``. + +To listen to a signal, implment ``page_published.connect(receiver, sender, **kwargs)``. Here's a simple +example showing how you might notify your team when something is published: + +.. code-block:: python + + from wagtailcore.signals import page_published + import urllib + import urllib2 + + + # Let everyone know when a new page is published + def send_to_slack(sender, **kwargs) + instance = kwargs['instance'] + url = 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' + values = { + "text" : "%s was published by %s " % (instance.title, instance.owner.username), + "channel": "#publish-notifications", + "username": "the squid of content", + "icon_emoji": ":octopus:" + } + + data = urllib.urlencode(values) + req = urllib2.Request(url, data) + response = urllib2.urlopen(req) + + # Register a receiver + page_published.connect(send_to_slack) + + +Receiving specific model events +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Sometimes you're not interested in receiving signals for every model, or you want +to handle signals for specific models in different ways. For instance, you may +wish to do something when a new blog post is published: + +.. code-block:: python + + from wagtailcore.signals import page_published + from mysite.models import BlogPostPage + + # Do something clever for each model type + def receiver(model, **kwargs): + # Do something with blog posts + pass + + # Register listeners for each page model class + page_published.connect(receiver, sender=BlogPostPage) + +Wagtail provides access to a list of registered page types at ``wagtail.wagtailcore.models.PAGE_MODEL_CLASSES``. + +Read the `Django documentation `__ for more information about specifying senders. + + +page_unpublished +---------------- + +This signal is emitted from a ``Page`` when the page is unpublished. + +:sender: The page ``class`` +:instance: The specific ``Page`` instance. +:kwargs: Any other arguments passed to ``page_unpublished.send()`` \ No newline at end of file