From d87127655f540747e7dc83badc015ea520b880f5 Mon Sep 17 00:00:00 2001 From: Sjoerd Langkemper Date: Thu, 7 Nov 2013 16:50:51 +0100 Subject: [PATCH] Fixed #21421 -- Added level_tag attribute on messages. Exposing the level name (e.g. "info") makes it possible to prepend something to the class name. For example, Twitter Bootstrap has an alert-info class. This class can now be added to the message using `class="alert-{{ message.level_tag }}". Because the level_tag was on the end of the `tags` property, it could not be used in this fashion when extra_tags were given. --- django/contrib/messages/storage/base.py | 14 +++++++------ django/contrib/messages/tests/base.py | 9 +++++++++ docs/ref/contrib/messages.txt | 26 +++++++++++++++++++++++++ docs/releases/1.7.txt | 4 ++++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/django/contrib/messages/storage/base.py b/django/contrib/messages/storage/base.py index f682a9bbc3..43dd3dbdd2 100644 --- a/django/contrib/messages/storage/base.py +++ b/django/contrib/messages/storage/base.py @@ -40,18 +40,20 @@ class Message(object): return force_text(self.message) def _get_tags(self): - label_tag = force_text(LEVEL_TAGS.get(self.level, ''), - strings_only=True) extra_tags = force_text(self.extra_tags, strings_only=True) - if extra_tags and label_tag: - return ' '.join([extra_tags, label_tag]) + if extra_tags and self.level_tag: + return ' '.join([extra_tags, self.level_tag]) elif extra_tags: return extra_tags - elif label_tag: - return label_tag + elif self.level_tag: + return self.level_tag return '' tags = property(_get_tags) + @property + def level_tag(self): + return force_text(LEVEL_TAGS.get(self.level, ''), strings_only=True) + class BaseStorage(object): """ diff --git a/django/contrib/messages/tests/base.py b/django/contrib/messages/tests/base.py index cae2e09412..1b1a9c0048 100644 --- a/django/contrib/messages/tests/base.py +++ b/django/contrib/messages/tests/base.py @@ -361,6 +361,15 @@ class BaseTests(object): ['info', '', 'extra-tag debug', 'warning', 'error', 'success']) + def test_level_tag(self): + storage = self.get_storage() + storage.level = 0 + add_level_messages(storage) + tags = [msg.level_tag for msg in storage] + self.assertEqual(tags, + ['info', '', 'debug', 'warning', 'error', + 'success']) + @override_settings_tags(MESSAGE_TAGS={ constants.INFO: 'info', constants.DEBUG: '', diff --git a/docs/ref/contrib/messages.txt b/docs/ref/contrib/messages.txt index caf51d26cc..690b73d195 100644 --- a/docs/ref/contrib/messages.txt +++ b/docs/ref/contrib/messages.txt @@ -212,6 +212,32 @@ is a mapping of the message level names to their numeric value:: {% endif %} +The ``Message`` class +--------------------- + +.. class:: storage.base.Message + + When you loop over the list of messages in a template, what you get are + instances of the ``Message`` class. It's quite a simple object, with only a + few attributes: + + * ``message``: The actual text of the message. + + * ``level``: An integer describing the type of the message (see the + `message levels`_ section above). + + * ``tags``: A string combining all the message's tags (``extra_tags`` and + ``level_tag``) separated by spaces. + + * ``extra_tags``: A string containing custom tags for this message, + separated by spaces. It's empty by default. + + .. versionadded:: 1.7 + + * ``level_tag``: The string representation of the level. By default, it's + the lowercase version of the name of the associated constant, but this + can be changed if you need by using the :setting:`MESSAGE_TAGS` setting. + Creating custom message levels ------------------------------ diff --git a/docs/releases/1.7.txt b/docs/releases/1.7.txt index d703f44e4b..7b527ce7fb 100644 --- a/docs/releases/1.7.txt +++ b/docs/releases/1.7.txt @@ -221,6 +221,10 @@ Minor features * The :ref:`messages context processor ` now adds a dictionary of default levels under the name ``DEFAULT_MESSAGE_LEVELS``. +* :class:`~django.contrib.messages.storage.base.Message` objects now have a + ``level_tag`` attribute that contains the string representation of the + message level. + :mod:`django.contrib.redirects` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^