2015-04-21 01:53:28 +00:00
`` django-notifications `` Documentation
=======================================
2012-07-22 13:14:44 +00:00
2015-03-29 07:00:59 +00:00
|build-status| |coveralls|
2015-03-29 05:07:51 +00:00
2015-04-21 01:53:28 +00:00
`django-notifications <https://github.com/django-notifications/django-notifications> `_ is a GitHub notification alike app for Django, it was derived from `django-activity-stream <https://github.com/justquick/django-activity-stream> `_
2012-07-22 13:14:44 +00:00
2015-04-21 02:37:24 +00:00
The major difference between `` django-notifications `` and `` django-activity-stream `` :
* `` django-notifications `` is for building something like Github "Notifications"
* While `` django-activity-stream `` is for building Github "News Feed"
2012-07-22 13:14:44 +00:00
Notifications are actually actions events, which are categorized by four main components.
* `` Actor `` . The object that performed the activity.
* `` Verb `` . The verb phrase that identifies the action of the activity.
* `` Action Object `` . *(Optional)* The object linked to the action itself.
* `` Target `` . *(Optional)* The object to which the activity was performed.
`` Actor `` , `` Action Object `` and `` Target `` are `` GenericForeignKeys `` to any arbitrary Django object.
An action is a description of an action that was performed (`` Verb `` ) at some instant in time by some `` Actor `` on some optional `` Target `` that results in an `` Action Object `` getting created/updated/deleted.
For example: `justquick <https://github.com/justquick/> `_ `` (actor) `` *closed* `` (verb) `` `issue 2 <https://github.com/justquick/django-activity-stream/issues/2> `_ `` (object) `` on `activity-stream <https://github.com/justquick/django-activity-stream/> `_ `` (target) `` 12 hours ago
Nomenclature of this specification is based on the Activity Streams Spec: `<http://activitystrea.ms/specs/atom/1.0/>`_
Installation
============
2012-10-24 23:10:39 +00:00
Installation is easy using `` pip `` and will install all required libraries.
2012-07-22 13:14:44 +00:00
::
2012-10-25 04:46:06 +00:00
$ pip install django-notifications-hq
2012-07-22 13:14:44 +00:00
or get it from source
::
2015-04-21 01:53:28 +00:00
$ git clone https://github.com/django-notifications/django-notifications
2012-07-22 13:14:44 +00:00
$ cd django-notifications
$ python setup.py install
2012-10-24 23:10:39 +00:00
Note that `django-model-utils <http://pypi.python.org/pypi/django-model-utils> `_ will be installed: this is required for the pass-through QuerySet manager.
2012-07-22 13:14:44 +00:00
Then to add the Django Notifications to your project add the app `` notifications `` to your `` INSTALLED_APPS `` and urlconf.
The app should go somewhere after all the apps that are going to be generating notifications like `` django.contrib.auth `` ::
INSTALLED_APPS = (
'django.contrib.auth',
...
'notifications',
...
)
Add the notifications urls to your urlconf::
2015-03-29 07:00:59 +00:00
2012-10-24 23:10:39 +00:00
import notifications
2015-03-29 07:00:59 +00:00
2012-07-22 13:14:44 +00:00
urlpatterns = patterns('',
...
2014-03-29 08:04:28 +00:00
url('^inbox/notifications/', include(notifications.urls)),
2012-07-22 13:14:44 +00:00
...
)
2012-10-24 23:10:39 +00:00
The method of installing these urls, importing rather than using `` 'notifications.urls' `` , is required to ensure that the urls are installed in the `` notifications `` namespace.
2012-10-24 00:10:02 +00:00
2015-02-24 11:25:50 +00:00
How to migrate schema
2014-05-08 12:46:40 +00:00
=========================================
2015-02-24 11:25:50 +00:00
For Django 1.4~1.6
------------------
2014-05-08 12:46:40 +00:00
`django-south` support is shipped with `django-notifications` .
2012-10-25 04:56:00 +00:00
2015-02-24 11:25:50 +00:00
#. Install latest version (>=1.0) `django-south <http://pypi.python.org/pypi/South/> `_
2014-05-08 12:46:40 +00:00
#. Execute `` manage.py migrate notifications `` to migrate `django-notifications` schema
2012-10-25 04:56:00 +00:00
2015-04-22 10:16:22 +00:00
Note: If you use a `custom user model <https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#auth-custom-user> `_ in your application, you may want to check `reverse dependencies <http://south.aeracode.org/wiki/Dependencies> `_ of South to run your migrations in the correct order.
2015-04-22 10:14:40 +00:00
2015-02-24 11:25:50 +00:00
For Django 1.7
--------------
Django 1.7 has built-in support for migrations. No need to install `django-south` .
#. Execute `` manage.py migrate notifications ``
2012-07-22 13:14:44 +00:00
Generating Notifications
=========================
Generating notifications is probably best done in a separate signal.
::
from django.db.models.signals import post_save
from notifications import notify
from myapp.models import MyModel
def my_handler(sender, instance, created, **kwargs):
notify.send(instance, verb='was saved')
post_save.connect(my_handler, sender=MyModel)
2013-03-06 01:57:17 +00:00
To generate an notification anywhere in your code, simply import the notify signal and send it with your actor, recipient, verb, and target.
2012-07-22 13:14:44 +00:00
::
from notifications import notify
2014-01-31 14:37:49 +00:00
notify.send(user, recipient=user, verb='you reached level 10')
2015-03-29 07:00:59 +00:00
2013-03-06 01:26:49 +00:00
notify.send(comment.user, recipient=user, verb=u'replied', action_object=comment,
description=comment.comment, target=comment.content_object)
2015-03-29 07:00:59 +00:00
2013-03-06 01:26:49 +00:00
notify.send(follow_instance.user, recipient=follow_instance.follow_object, verb=u'has followed you',
2015-04-26 11:23:40 +00:00
action_object=instance, description=u'', target=follow_instance.follow_object, level='success')
2012-07-22 13:14:44 +00:00
2012-10-23 23:06:39 +00:00
Extra data
----------
You can attach arbitrary data to your notifications by doing the following:
2015-04-11 03:51:33 +00:00
* Add to your settings.py: `` NOTIFICATIONS_USE_JSONFIELD=True ``
2012-10-23 23:06:39 +00:00
2015-04-11 05:28:52 +00:00
Then, any extra arguments you pass to `` notify.send(...) `` will be attached to the `` .data `` attribute of the notification object.
These will be serialised using the JSONField's serialiser, so you may need to take that into account: using only objects that will be serialised is a good idea.
Soft delete
-----------
By default, `` delete/(?P<slug>\d+)/ `` deletes specified notification record from DB.
You can change this behaviour to "mark `` Notification.deleted `` field as `` True `` " by:
* Add to your settings.py: `` NOTIFICATIONS_SOFT_DELETE=True ``
With this option, QuerySet methods `` unread `` and `` read `` contain one more filter: `` deleted=False `` .
Meanwhile, QuerySet methods `` deleted `` , `` active `` , `` mark_all_as_deleted `` , `` mark_all_as_active `` are turned on.
See more details in QuerySet methods section.
2012-10-23 23:06:39 +00:00
2012-07-22 13:14:44 +00:00
API
====
2012-10-24 23:10:39 +00:00
QuerySet methods
2014-05-07 02:46:48 +00:00
-----------------
2012-10-24 23:10:39 +00:00
Using `` django-model-utils `` , we get the ability to add queryset methods to not only the manager, but to all querysets that will be used, including related objects. This enables us to do things like::
Notification.objects.unread()
2015-03-29 07:00:59 +00:00
2012-10-24 23:10:39 +00:00
which returns all unread notifications. To do this for a single user, we can do::
user = User.objects.get(pk=pk)
user.notifications.unread()
There are some other QuerySet methods, too.
`` qs.unread() ``
~~~~~~~~~~~~~~~
Return all of the unread notifications, filtering the current queryset.
2015-04-11 05:28:52 +00:00
When `` NOTIFICATIONS_SOFT_DELETE=True `` , this filter contains `` deleted=False `` .
2012-10-24 23:10:39 +00:00
`` qs.read() ``
~~~~~~~~~~~~~~~
Return all of the read notifications, filtering the current queryset.
2015-04-11 05:28:52 +00:00
When `` NOTIFICATIONS_SOFT_DELETE=True `` , this filter contains `` deleted=False `` .
2012-10-24 23:10:39 +00:00
`` qs.mark_all_as_read() `` | `` qs.mark_all_as_read(recipient) ``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mark all of the unread notifications in the queryset (optionally also filtered by `` recipient `` ) as read.
`` qs.mark_all_as_unread() `` | `` qs.mark_all_as_unread(recipient) ``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mark all of the read notifications in the queryset (optionally also filtered by `` recipient `` ) as unread.
2015-04-11 05:28:52 +00:00
`` qs.deleted() ``
~~~~~~~~~~~~~~~~
Return all notifications that have `` deleted=True `` , filtering the current queryset.
Must be used with `` NOTIFICATIONS_SOFT_DELETE=True `` .
`` qs.active() ``
~~~~~~~~~~~~~~~
Return all notifications that have `` deleted=False `` , filtering the current queryset.
Must be used with `` NOTIFICATIONS_SOFT_DELETE=True `` .
`` qs.mark_all_as_deleted() `` | `` qs.mark_all_as_deleted(recipient) ``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mark all notifications in the queryset (optionally also filtered by `` recipient `` ) as `` deleted=True `` .
Must be used with `` NOTIFICATIONS_SOFT_DELETE=True `` .
`` qs.mark_all_as_active() `` | `` qs.mark_all_as_active(recipient) ``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mark all notifications in the queryset (optionally also filtered by `` recipient `` ) as `` deleted=False `` .
Must be used with `` NOTIFICATIONS_SOFT_DELETE=True `` .
2012-10-24 23:10:39 +00:00
Model methods
-------------
`` obj.timesince([datetime]) ``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A wrapper for Django's `` timesince `` function.
2012-07-22 13:14:44 +00:00
2012-10-24 23:10:39 +00:00
`` obj.mark_as_read() ``
~~~~~~~~~~~~~~~~~~~~~~
2012-07-22 13:14:44 +00:00
2012-10-24 23:10:39 +00:00
Mark the current object as read.
2012-07-22 13:14:44 +00:00
2012-10-24 23:10:39 +00:00
Template tags
-------------
2012-07-22 13:14:44 +00:00
2013-02-28 08:29:30 +00:00
Put `{% load notifications_tags %}` in the template before you actually use notification tags.
2012-07-22 13:14:44 +00:00
2012-10-24 23:10:39 +00:00
`` notifications_unread ``
~~~~~~~~~~~~~~~~~~~~~~~~
2012-07-22 13:14:44 +00:00
::
{% notifications_unread %}
Give the number of unread notifications for a user, or nothing (an empty string) for an anonymous user.
Storing the count in a variable for further processing is advised, such as::
{% notifications_unread as unread_count %}
...
{% if unread_count %}
You have <strong>{{ unread_count }}</strong> unread notifications.
{% endif %}
2015-07-20 09:51:00 +00:00
Live-updater API
================
To ensure users always have the most up-to-date notfications, `django-notifications` includes a simple javascript API
for updating specific fields within a django template.
There are two possible API calls that can be made:
2015-07-20 10:10:33 +00:00
1. `` api/unread_count/ `` that returns a javascript object with 1 key: `` unread_count `` eg::
2015-07-20 09:51:00 +00:00
{"unread_count":1}
2015-07-20 10:10:33 +00:00
#. `` api/unread_list/ `` that returns a javascript object with 2 keys: `unread_count` and `unread_list` eg::
{
"unread_count":1,
"unread_list":[--list of json representations of notifications--]
}
Representations of notifications are based on the django method: `` model_to_dict ``
2015-07-20 09:51:00 +00:00
How to use:
2015-07-20 10:10:33 +00:00
-----------
1. Put `` {% load notifications_tags %} `` in the template before you actually use notification tags.
2. In the area where you are loading javascript resources add the following tags in the order below::
2015-07-20 09:51:00 +00:00
<script src="{% static 'notifications/notify.js' %}" type="text/javascript"></script>
{% register_notify_callbacks callbacks='fill_notification_list,fill_notification_badge' %}
2015-07-20 10:10:33 +00:00
`` register_notify_callbacks `` takes the following arguments:
1. `` badge_id `` (default `` live_notify_badge `` ) - The `id` attribute of the element to show the unread count, that will be periodically updated.
#. `` menu_id `` (default `` live_notify_list `` ) - The `id` attribute of the element to insert a list of unread items, that will be periodically updated.
#. `` refresh_period `` (default `` 15 `` ) - How often to fetch unread items from the server (integer in seconds).
#. `` callbacks `` (default `` <empty string> `` ) - A comma-separated list of javascript functions to call each period.
#. `` api_url_name `` (default `` list `` ) - The name of the API to call (this can be either `` list `` or `` count `` ).
3. To insert a live-updating unread count, use the following template::
2015-07-20 09:51:00 +00:00
{% live_notify_badge %}
2015-07-20 10:10:33 +00:00
`` live_notify_badge `` takes the following arguments:
1. `` badge_id `` (default `` live_notify_badge `` ) - The `` id `` attribute for the `` <span> `` element that will be created to show the unread count.
#. `` classes `` (default `` <empty string> `` ) - A string used to populate the `` class `` attribute of the above element.
4. To insert a live-updating unread count, use the following template::
2015-07-20 09:51:00 +00:00
{% live_notify_list %}
2015-07-20 10:10:33 +00:00
`` live_notify_list `` takes the following arguments:
1. `` list_id `` (default `` live_notify_list `` ) - The `` id `` attribute for the `` <ul> `` element that will be created to insert the list of notifications into.
#. `` classes `` (default `` <empty string> `` ) - A string used to populate the `` class `` attribute of the above element.
2015-07-20 09:51:00 +00:00
Using the live-updater with bootstrap
2015-07-20 10:10:33 +00:00
-------------------------------------
2015-07-20 09:51:00 +00:00
The Live-updater can be incorporated into bootstrap with minimal code.
2015-07-20 10:10:33 +00:00
To create a live-updating bootstrap badge containing the unread count, simply use the template tag::
2015-07-20 09:51:00 +00:00
{% live_notify_badge classes="badge" %}
2015-07-20 10:10:33 +00:00
To create a live-updating bootstrap dropdown menu containing a selection of recent unread notifications, simply use the template tag::
2015-07-20 09:51:00 +00:00
{% live_notify_list classes="dropdown-menu" %}
2015-07-20 10:10:33 +00:00
2015-07-20 09:51:00 +00:00
Customising the display of notifications using javascript callbacks
2015-07-20 10:10:33 +00:00
-------------------------------------------------------------------
2015-07-20 09:51:00 +00:00
While the live notifier for unread counts should suit most use cases, users may wish to alter how
unread notifications are shown.
2015-07-20 10:10:33 +00:00
The `` callbacks `` argument of the `` register_notify_callbacks `` dictates which javascript functions are called when
2015-07-20 09:51:00 +00:00
the unread api call is made.
2015-07-20 10:10:33 +00:00
To add a custom javascript callback, simply add this to the list, like so::
2015-07-20 09:51:00 +00:00
{% register_notify_callbacks callbacks='fill_notification_badge,my_special_notification_callback' %}
The above would cause the callback to update the unread count badge, and would call the custom function `my_special_notification_callback` .
All callback functions are passed a single argument by convention called `data` , which contains the entire result from the API.
2015-07-20 10:10:33 +00:00
For example, the below function would get the recent list of unread messages and log them to the console::
2015-07-20 09:51:00 +00:00
function my_special_notification_callback(data) {
for (var i=0; i < data.unread_list.length; i++) {
msg = data.unread_list[i];
console.log(msg);
}
}
2015-04-21 01:53:28 +00:00
`` django-notifications `` Team
==============================
Core contributors (in alphabetical order):
- `Samuel Spencer <https://github.com/LegoStormtroopr> `_
- `Yang Yubo <https://github.com/yangyubo> `_
2015-04-21 02:39:58 +00:00
- `Zhongyuan Zhang <https://github.com/zhang-z> `_
2015-04-21 01:53:28 +00:00
2015-03-29 05:07:51 +00:00
.. |build-status| image :: https://travis-ci.org/django-notifications/django-notifications.svg
:target: https://travis-ci.org/django-notifications/django-notifications
.. |coveralls| image :: https://coveralls.io/repos/django-notifications/django-notifications/badge.png?branch=master
:alt: Code coverage on coveralls
:scale: 100%
:target: https://coveralls.io/r/django-notifications/django-notifications?branch=master