|
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 |