65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
"""
|
|
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
|