diff options
author | Luke Plant <L.Plant.98@cantab.net> | 2009-12-09 16:57:23 +0000 |
---|---|---|
committer | Luke Plant <L.Plant.98@cantab.net> | 2009-12-09 16:57:23 +0000 |
commit | 25020ddb05543fff1c37d77b49bd937fd2bbb170 (patch) | |
tree | b156768f680819c54a73a2926b81d5d84d0e2205 /django/contrib/messages/api.py | |
parent | eeb10d5f2c5375ec28b7761f9ea0fd4f1d2e4bd1 (diff) | |
download | django-25020ddb05543fff1c37d77b49bd937fd2bbb170.tar.gz |
Fixed #4604 - Configurable message passing system, supporting anonymous users
This deprecates User.message_set in favour of a configurable messaging
system, with backends provided for cookie storage, session storage and
backward compatibility.
Many thanks to Tobias McNulty for the bulk of the work here, with
contributions from Chris Beaven (SmileyChris) and lots of code review from
Russell Keith-Magee, and input from many others. Also credit to the authors
of various messaging systems for Django whose ideas may have been pinched
:-)
git-svn-id: http://code.djangoproject.com/svn/django/trunk@11804 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/contrib/messages/api.py')
-rw-r--r-- | django/contrib/messages/api.py | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/django/contrib/messages/api.py b/django/contrib/messages/api.py new file mode 100644 index 0000000000..4164f2785b --- /dev/null +++ b/django/contrib/messages/api.py @@ -0,0 +1,84 @@ +from django.contrib.messages import constants +from django.utils.functional import lazy, memoize + +__all__ = ( + 'add_message', 'get_messages', + 'debug', 'info', 'success', 'warning', 'error', +) + + +class MessageFailure(Exception): + pass + + +def add_message(request, level, message, extra_tags='', fail_silently=False): + """ + Attempts to add a message to the request using the 'messages' app, falling + back to the user's message_set if MessageMiddleware hasn't been enabled. + """ + if hasattr(request, '_messages'): + return request._messages.add(level, message, extra_tags) + if hasattr(request, 'user') and request.user.is_authenticated(): + return request.user.message_set.create(message=message) + if not fail_silently: + raise MessageFailure('Without the django.contrib.messages ' + 'middleware, messages can only be added to ' + 'authenticated users.') + + +def get_messages(request): + """ + Returns the message storage on the request if it exists, otherwise returns + user.message_set.all() as the old auth context processor did. + """ + if hasattr(request, '_messages'): + return request._messages + + def get_user(): + if hasattr(request, 'user'): + return request.user + else: + from django.contrib.auth.models import AnonymousUser + return AnonymousUser() + + return lazy(memoize(get_user().get_and_delete_messages, {}, 0), list)() + + +def debug(request, message, extra_tags='', fail_silently=False): + """ + Adds a message with the ``DEBUG`` level. + """ + add_message(request, constants.DEBUG, message, extra_tags=extra_tags, + fail_silently=fail_silently) + + +def info(request, message, extra_tags='', fail_silently=False): + """ + Adds a message with the ``INFO`` level. + """ + add_message(request, constants.INFO, message, extra_tags=extra_tags, + fail_silently=fail_silently) + + +def success(request, message, extra_tags='', fail_silently=False): + """ + Adds a message with the ``SUCCESS`` level. + """ + add_message(request, constants.SUCCESS, message, extra_tags=extra_tags, + fail_silently=fail_silently) + + +def warning(request, message, extra_tags='', fail_silently=False): + """ + Adds a message with the ``WARNING`` level. + """ + add_message(request, constants.WARNING, message, extra_tags=extra_tags, + fail_silently=fail_silently) + + +def error(request, message, extra_tags='', fail_silently=False): + """ + Adds a message with the ``ERROR`` level. + """ + add_message(request, constants.ERROR, message, extra_tags=extra_tags, + fail_silently=fail_silently) |