Source code for notifier.shortcuts

###############################################################################
## Imports
###############################################################################
# Python
from collections import Iterable

# Django
from django.contrib.auth.models import Group, Permission, User
from django.db.models.query import QuerySet

# User
from notifier.models import Notification, Backend, UserPrefs


###############################################################################
## Code
###############################################################################
[docs]def create_notification(name, display_name=None, permissions=None, backends=None, public=True): """ Arguments :name: notification name, unique (string) :display_name: notification display name, can be non-unique (string) :permissions: list of permission names or objects :backends: list of backend names or objects :public: (boolean) Returns Notification object """ if not display_name: display_name = name if backends: backends = _get_backend_queryset(backends) else: backends = Backend.objects.filter(enabled=True) if permissions: permissions = _get_permission_queryset(permissions) else: permissions = [] try: n = Notification.objects.get(name=name) except Notification.DoesNotExist: n = Notification.objects.create(name=name, display_name=display_name, public=public) n.permissions.add(*permissions) n.backends.add(*backends) else: n.name = name n.display_name = display_name n.public = public n.permissions = permissions n.backends = backends n.save() return n
[docs]def send_notification(name, users, context=None): """ Arguments :name: notification name (string) :users: user object or list of user objects :context: additional context for notification templates (dict) Returns None """ notification = Notification.objects.get(name=name) return notification.send(users, context)
[docs]def update_preferences(name, user, prefs_dict): """ Arguments :name: notification name (string) :user: user or group object :prefs_dict: dict with backend obj or name as key with a boolean value. e.g. {'email': True, 'sms': False}, {email_backend_obj: True, sms_backend_obj: False} Returns dict with backend names that were created or updated. values that do not require change are skipped e.g. {'email': 'created', 'sms': updated} """ notification = Notification.objects.get(name=name) if isinstance(user, User): return notification.update_user_prefs(user, prefs_dict) elif isinstance(user, Group): return notification.update_group_prefs(user, prefs_dict)
[docs]def clear_preferences(users): """ Arguments :users: user object or list of user object Returns None """ return UserPrefs.objects.remove_user_prefs(users)
def _get_permission_queryset(permissions): if (permissions and not isinstance(permissions, QuerySet)): if isinstance(permissions, Permission): permissions = [permissions] else: if isinstance(permissions, basestring): permissions = [permissions] elif isinstance(permissions, Iterable): if not all(isinstance(x, basestring) for x in permissions): raise TypeError else: raise TypeError permissions = Permission.objects.filter(codename__in=permissions) return permissions def _get_backend_queryset(backends): if (backends and not isinstance(backends, QuerySet)): if isinstance(backends, Backend): backends = [backends] else: if isinstance(backends, basestring): backends = [backends] elif isinstance(backends, Iterable): if not all(isinstance(x, basestring) for x in backends): raise TypeError else: raise TypeError backends = Backend.objects.filter(name__in=backends) return backends