diff --git a/django/contrib/messages/api.py b/django/contrib/messages/api.py
index 4164f27..7159737 100644
|
a
|
b
|
|
| 1 | 1 | from django.contrib.messages import constants |
| | 2 | from django.contrib.messages.storage import default_storage |
| 2 | 3 | from django.utils.functional import lazy, memoize |
| 3 | 4 | |
| 4 | 5 | __all__ = ( |
| … |
… |
def get_messages(request):
|
| 44 | 45 | return lazy(memoize(get_user().get_and_delete_messages, {}, 0), list)() |
| 45 | 46 | |
| 46 | 47 | |
| | 48 | def get_level(request): |
| | 49 | """ |
| | 50 | Returns the minimum level of messages to be recorded. |
| | 51 | |
| | 52 | The default level is the ``MESSAGE_LEVEL`` setting. If this is not found, |
| | 53 | the ``INFO`` level is used. |
| | 54 | """ |
| | 55 | if hasattr(request, '_messages'): |
| | 56 | storage = request._messages |
| | 57 | else: |
| | 58 | storage = default_storage(request) |
| | 59 | return storage.level |
| | 60 | |
| | 61 | |
| | 62 | def set_level(request, level): |
| | 63 | """ |
| | 64 | Sets the minimum level of messages to be recorded, returning ``True`` if |
| | 65 | the level was recorded successfully. |
| | 66 | |
| | 67 | If set to ``None``, the default level will be used (see the ``get_level`` |
| | 68 | method). |
| | 69 | """ |
| | 70 | if not hasattr(request, '_messages'): |
| | 71 | return False |
| | 72 | request._messages.level = level |
| | 73 | return True |
| | 74 | |
| | 75 | |
| 47 | 76 | def debug(request, message, extra_tags='', fail_silently=False): |
| 48 | 77 | """ |
| 49 | 78 | Adds a message with the ``DEBUG`` level. |
diff --git a/django/contrib/messages/tests/base.py b/django/contrib/messages/tests/base.py
index 6ca9185..d0edce9 100644
|
a
|
b
|
from django.test import TestCase
|
| 3 | 3 | from django.conf import settings |
| 4 | 4 | from django.utils.translation import ugettext_lazy |
| 5 | 5 | from django.contrib.messages import constants, utils |
| | 6 | from django.contrib.messages.api import MessageFailure, get_level, set_level |
| 6 | 7 | from django.contrib.messages.storage import default_storage, base |
| 7 | 8 | from django.contrib.messages.storage.base import Message |
| 8 | 9 | from django.core.urlresolvers import reverse |
| 9 | 10 | from django.contrib.auth.models import User |
| 10 | | from django.contrib.messages.api import MessageFailure |
| 11 | 11 | |
| 12 | 12 | |
| 13 | 13 | def add_level_messages(storage): |
| … |
… |
class BaseTest(TestCase):
|
| 41 | 41 | if hasattr(settings, setting): |
| 42 | 42 | self._remembered_settings[setting] = getattr(settings, setting) |
| 43 | 43 | delattr(settings._wrapped, setting) |
| 44 | | # backup these manually because we do not want them deleted |
| | 44 | # Backup these manually because we do not want them deleted. |
| 45 | 45 | self._middleware_classes = settings.MIDDLEWARE_CLASSES |
| 46 | 46 | self._template_context_processors = \ |
| 47 | 47 | settings.TEMPLATE_CONTEXT_PROCESSORS |
| 48 | 48 | self._installed_apps = settings.INSTALLED_APPS |
| | 49 | self._message_storage = settings.MESSAGE_STORAGE |
| | 50 | settings.MESSAGE_STORAGE = '%s.%s' % (self.storage_class.__module__, |
| | 51 | self.storage_class.__name__) |
| 49 | 52 | |
| 50 | 53 | def tearDown(self): |
| 51 | 54 | for setting in self.restore_settings: |
| 52 | 55 | self.restore_setting(setting) |
| 53 | | # restore these manually (see above) |
| | 56 | # Restore these manually (see above). |
| 54 | 57 | settings.MIDDLEWARE_CLASSES = self._middleware_classes |
| 55 | 58 | settings.TEMPLATE_CONTEXT_PROCESSORS = \ |
| 56 | 59 | self._template_context_processors |
| … |
… |
class BaseTest(TestCase):
|
| 319 | 322 | self.assert_(storage.added_new) |
| 320 | 323 | |
| 321 | 324 | def test_default_level(self): |
| | 325 | # get_level works even with no storage on the request. |
| | 326 | request = self.get_request() |
| | 327 | self.assertEqual(get_level(request), constants.INFO) |
| | 328 | |
| | 329 | # get_level returns the default level if it hasn't been set. |
| 322 | 330 | storage = self.get_storage() |
| | 331 | request._messages = storage |
| | 332 | self.assertEqual(get_level(request), constants.INFO) |
| | 333 | |
| | 334 | # Only messages of sufficient level get recorded. |
| 323 | 335 | add_level_messages(storage) |
| 324 | 336 | self.assertEqual(len(storage), 5) |
| 325 | 337 | |
| 326 | 338 | def test_low_level(self): |
| 327 | | storage = self.get_storage() |
| 328 | | storage.level = 5 |
| | 339 | request = self.get_request() |
| | 340 | storage = self.storage_class(request) |
| | 341 | request._messages = storage |
| | 342 | |
| | 343 | self.assert_(set_level(request, 5)) |
| | 344 | self.assertEqual(get_level(request), 5) |
| | 345 | |
| 329 | 346 | add_level_messages(storage) |
| 330 | 347 | self.assertEqual(len(storage), 6) |
| 331 | 348 | |
| 332 | 349 | def test_high_level(self): |
| 333 | | storage = self.get_storage() |
| 334 | | storage.level = 30 |
| | 350 | request = self.get_request() |
| | 351 | storage = self.storage_class(request) |
| | 352 | request._messages = storage |
| | 353 | |
| | 354 | self.assert_(set_level(request, 30)) |
| | 355 | self.assertEqual(get_level(request), 30) |
| | 356 | |
| 335 | 357 | add_level_messages(storage) |
| 336 | 358 | self.assertEqual(len(storage), 2) |
| 337 | 359 | |
| 338 | 360 | def test_settings_level(self): |
| | 361 | request = self.get_request() |
| | 362 | storage = self.storage_class(request) |
| | 363 | |
| 339 | 364 | settings.MESSAGE_LEVEL = 29 |
| 340 | | storage = self.get_storage() |
| | 365 | self.assertEqual(get_level(request), 29) |
| | 366 | |
| 341 | 367 | add_level_messages(storage) |
| 342 | 368 | self.assertEqual(len(storage), 3) |
| 343 | 369 | |
diff --git a/docs/ref/contrib/messages.txt b/docs/ref/contrib/messages.txt
index 7cfe4ae..554e70b 100644
|
a
|
b
|
Constant Purpose
|
| 137 | 137 | ``ERROR`` An action was **not** successful or some other failure occurred |
| 138 | 138 | =========== ======== |
| 139 | 139 | |
| 140 | | The `MESSAGE_LEVEL`_ setting can be used to change the minimum recorded |
| 141 | | level. Attempts to add messages of a level less than this will be ignored. |
| | 140 | The `MESSAGE_LEVEL`_ setting can be used to change the minimum recorded level |
| | 141 | (or it can be `changed per request`_). Attempts to add messages of a level less |
| | 142 | than this will be ignored. |
| | 143 | |
| | 144 | .. _`changed per request`: `Changing the minimum recorded level per-request`_ |
| 142 | 145 | |
| 143 | 146 | Message tags |
| 144 | 147 | ------------ |
| … |
… |
provide a mapping via the `MESSAGE_TAGS`_ setting.
|
| 245 | 248 | Changing the minimum recorded level per-request |
| 246 | 249 | ----------------------------------------------- |
| 247 | 250 | |
| 248 | | The minimum recorded level can be set per request by changing the ``level`` |
| 249 | | attribute of the messages storage instance:: |
| | 251 | The minimum recorded level can be set per request via the ``set_level`` |
| | 252 | method:: |
| 250 | 253 | |
| 251 | 254 | from django.contrib import messages |
| 252 | 255 | |
| 253 | 256 | # Change the messages level to ensure the debug message is added. |
| 254 | | messages.get_messages(request).level = messages.DEBUG |
| | 257 | messages.set_level(request, messages.DEBUG) |
| 255 | 258 | messages.debug(request, 'Test message...') |
| 256 | 259 | |
| 257 | 260 | # In another request, record only messages with a level of WARNING and higher |
| 258 | | messages.get_messages(request).level = messages.WARNING |
| | 261 | messages.set_level(request, messages.WARNING) |
| 259 | 262 | messages.success(request, 'Your profile was updated.') # ignored |
| 260 | 263 | messages.warning(request, 'Your account is about to expire.') # recorded |
| 261 | 264 | |
| 262 | 265 | # Set the messages level back to default. |
| 263 | | messages.get_messages(request).level = None |
| | 266 | messages.set_level(request, None) |
| | 267 | |
| | 268 | Similarly, the current effective level can be retrieved with ``get_level``:: |
| | 269 | |
| | 270 | from django.contrib import messages |
| | 271 | current_level = messages.get_level(request) |
| 264 | 272 | |
| 265 | 273 | For more information on how the minimum recorded level functions, see |
| 266 | 274 | `Message levels`_ above. |