web/lib/django/contrib/messages/storage/user_messages.py
changeset 29 cc9b7e14412b
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
       
     1 """
       
     2 Storages used to assist in the deprecation of contrib.auth User messages.
       
     3 
       
     4 """
       
     5 from django.contrib.messages import constants
       
     6 from django.contrib.messages.storage.base import BaseStorage, Message
       
     7 from django.contrib.auth.models import User
       
     8 from django.contrib.messages.storage.fallback import FallbackStorage
       
     9 
       
    10 
       
    11 class UserMessagesStorage(BaseStorage):
       
    12     """
       
    13     Retrieves messages from the User, using the legacy user.message_set API.
       
    14 
       
    15     This storage is "read-only" insofar as it can only retrieve and delete
       
    16     messages, not store them.
       
    17     """
       
    18     session_key = '_messages'
       
    19 
       
    20     def _get_messages_queryset(self):
       
    21         """
       
    22         Returns the QuerySet containing all user messages (or ``None`` if
       
    23         request.user is not a contrib.auth User).
       
    24         """
       
    25         user = getattr(self.request, 'user', None)
       
    26         if isinstance(user, User):
       
    27             return user._message_set.all()
       
    28 
       
    29     def add(self, *args, **kwargs):
       
    30         raise NotImplementedError('This message storage is read-only.')
       
    31 
       
    32     def _get(self, *args, **kwargs):
       
    33         """
       
    34         Retrieves a list of messages assigned to the User.  This backend never
       
    35         stores anything, so all_retrieved is assumed to be False.
       
    36         """
       
    37         queryset = self._get_messages_queryset()
       
    38         if queryset is None:
       
    39             # This is a read-only and optional storage, so to ensure other
       
    40             # storages will also be read if used with FallbackStorage an empty
       
    41             # list is returned rather than None.
       
    42             return [], False
       
    43         messages = []
       
    44         for user_message in queryset:
       
    45             messages.append(Message(constants.INFO, user_message.message))
       
    46         return messages, False
       
    47 
       
    48     def _store(self, messages, *args, **kwargs):
       
    49         """
       
    50         Removes any messages assigned to the User and returns the list of
       
    51         messages (since no messages are stored in this read-only storage).
       
    52         """
       
    53         queryset = self._get_messages_queryset()
       
    54         if queryset is not None:
       
    55             queryset.delete()
       
    56         return messages
       
    57 
       
    58 
       
    59 class LegacyFallbackStorage(FallbackStorage):
       
    60     """
       
    61     Works like ``FallbackStorage`` but also handles retrieving (and clearing)
       
    62     contrib.auth User messages.
       
    63     """
       
    64     storage_classes = (UserMessagesStorage,) + FallbackStorage.storage_classes