diff -r b758351d191f -r cc9b7e14412b web/lib/django/contrib/messages/storage/user_messages.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/messages/storage/user_messages.py Tue May 25 02:43:45 2010 +0200 @@ -0,0 +1,64 @@ +""" +Storages used to assist in the deprecation of contrib.auth User messages. + +""" +from django.contrib.messages import constants +from django.contrib.messages.storage.base import BaseStorage, Message +from django.contrib.auth.models import User +from django.contrib.messages.storage.fallback import FallbackStorage + + +class UserMessagesStorage(BaseStorage): + """ + Retrieves messages from the User, using the legacy user.message_set API. + + This storage is "read-only" insofar as it can only retrieve and delete + messages, not store them. + """ + session_key = '_messages' + + def _get_messages_queryset(self): + """ + Returns the QuerySet containing all user messages (or ``None`` if + request.user is not a contrib.auth User). + """ + user = getattr(self.request, 'user', None) + if isinstance(user, User): + return user._message_set.all() + + def add(self, *args, **kwargs): + raise NotImplementedError('This message storage is read-only.') + + def _get(self, *args, **kwargs): + """ + Retrieves a list of messages assigned to the User. This backend never + stores anything, so all_retrieved is assumed to be False. + """ + queryset = self._get_messages_queryset() + if queryset is None: + # This is a read-only and optional storage, so to ensure other + # storages will also be read if used with FallbackStorage an empty + # list is returned rather than None. + return [], False + messages = [] + for user_message in queryset: + messages.append(Message(constants.INFO, user_message.message)) + return messages, False + + def _store(self, messages, *args, **kwargs): + """ + Removes any messages assigned to the User and returns the list of + messages (since no messages are stored in this read-only storage). + """ + queryset = self._get_messages_queryset() + if queryset is not None: + queryset.delete() + return messages + + +class LegacyFallbackStorage(FallbackStorage): + """ + Works like ``FallbackStorage`` but also handles retrieving (and clearing) + contrib.auth User messages. + """ + storage_classes = (UserMessagesStorage,) + FallbackStorage.storage_classes