Support warning messages in SelfHandlingForm

Sometimes we need to show a prominent message at the top of a form to
warn the user about something. One example is trying to snapshot an
in-use volume.

Change-Id: I073fe6bd049eb90b7a6ed45abfad96ebda3510eb
Related-Bug: #1202929
This commit is contained in:
Kieran Spear 2013-12-13 10:17:26 +11:00
parent efdae3ce35
commit 493d85d2e7
3 changed files with 50 additions and 0 deletions

View File

@ -45,6 +45,13 @@ class SelfHandlingForm(SelfHandlingMixin, forms.Form):
"""
self._errors[NON_FIELD_ERRORS] = self.error_class([message])
def set_warning(self, message):
"""Sets a warning on the form.
Unlike NON_FIELD_ERRORS, this doesn't fail form validation.
"""
self.warnings = self.error_class([message])
class DateForm(forms.Form):
"""A simple form for selecting a range of time."""

View File

@ -1,6 +1,11 @@
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% if form.warnings %}
<div class="alert alert-message alert-warning">
{{ form.warnings }}
</div>
{% endif %}
{% if form.non_field_errors %}
<div class="alert alert-message alert-error">
{{ form.non_field_errors }}

View File

@ -13,6 +13,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from django import shortcuts
from horizon import forms
from horizon.test import helpers as test
@ -62,3 +64,39 @@ class FormMixinTests(test.TestCase):
view = self._prepare_view(forms.views.ModalFormView, {})
self.assertEqual(view.get_template_names(), view.template_name)
class TestForm(forms.SelfHandlingForm):
name = forms.CharField(max_length="255")
def handle(self, request, data):
return True
class FormErrorTests(test.TestCase):
template = 'horizon/common/_form_fields.html'
def setUp(self):
super(FormErrorTests, self).setUp()
self.form = TestForm(self.request)
def _render_form(self):
return shortcuts.render(self.request, self.template,
{'form': self.form})
def test_set_warning(self):
warning_text = 'WARNING 29380'
self.form.set_warning(warning_text)
self.assertEqual([warning_text], self.form.warnings)
resp = self._render_form()
self.assertIn(warning_text, resp.content)
def test_api_error(self):
error_text = 'ERROR 12938'
self.form.full_clean()
self.form.api_error(error_text)
self.assertEqual([error_text], self.form.non_field_errors())
resp = self._render_form()
self.assertIn(error_text, resp.content)