From ce590531bed11fdb34cbde23fb7e34202d5e5cdf Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Mon, 1 Jun 2015 18:18:56 +0100 Subject: [PATCH 1/4] Make RawHTMLBlock consistently use SafeText as its native value --- wagtail/wagtailcore/blocks/field_block.py | 19 +++++- wagtail/wagtailcore/tests/test_blocks.py | 72 +++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/wagtail/wagtailcore/blocks/field_block.py b/wagtail/wagtailcore/blocks/field_block.py index ddc740a21..4e953702b 100644 --- a/wagtail/wagtailcore/blocks/field_block.py +++ b/wagtail/wagtailcore/blocks/field_block.py @@ -261,8 +261,23 @@ class RawHTMLBlock(FieldBlock): widget=forms.Textarea) super(RawHTMLBlock, self).__init__(**kwargs) - def render_basic(self, value): - return mark_safe(value) # if it isn't safe, that's the site admin's problem for allowing raw HTML blocks in the first place... + def get_default(self): + return mark_safe(self.meta.default or '') + + def to_python(self, value): + return mark_safe(value) + + def get_prep_value(self, value): + # explicitly convert to a plain string, just in case we're using some serialisation method + # that doesn't cope with SafeText values correctly + return str(value) + + def value_for_form(self, value): + # need to explicitly mark as unsafe, or it'll output unescaped HTML in the textarea + return str(value) + + def value_from_form(self, value): + return mark_safe(value) class Meta: icon = 'code' diff --git a/wagtail/wagtailcore/tests/test_blocks.py b/wagtail/wagtailcore/tests/test_blocks.py index a4d38ce2e..7f4524d95 100644 --- a/wagtail/wagtailcore/tests/test_blocks.py +++ b/wagtail/wagtailcore/tests/test_blocks.py @@ -4,6 +4,7 @@ from django import forms from django.forms.utils import ErrorList from django.core.exceptions import ValidationError from django.test import TestCase +from django.utils.safestring import mark_safe, SafeText from wagtail.wagtailcore import blocks from wagtail.wagtailcore.models import Page @@ -267,6 +268,77 @@ class TestChoiceBlock(unittest.TestCase): ) +class TestRawHTMLBlock(unittest.TestCase): + def test_get_default_with_fallback_value(self): + default_value = blocks.RawHTMLBlock().get_default() + self.assertEqual(default_value, '') + self.assertTrue(isinstance(default_value, SafeText)) + + def test_get_default_with_none(self): + default_value = blocks.RawHTMLBlock(default=None).get_default() + self.assertEqual(default_value, '') + self.assertTrue(isinstance(default_value, SafeText)) + + def test_get_default_with_empty_string(self): + default_value = blocks.RawHTMLBlock(default='').get_default() + self.assertEqual(default_value, '') + self.assertTrue(isinstance(default_value, SafeText)) + + def test_get_default_with_nonempty_string(self): + default_value = blocks.RawHTMLBlock(default='BOOM').get_default() + self.assertEqual(default_value, 'BOOM') + self.assertTrue(isinstance(default_value, SafeText)) + + def test_serialize(self): + block = blocks.RawHTMLBlock() + result = block.get_prep_value(mark_safe('BOOM')) + self.assertEqual(result, 'BOOM') + + def test_deserialize(self): + block = blocks.RawHTMLBlock() + result = block.to_python('BOOM') + self.assertEqual(result, 'BOOM') + self.assertTrue(isinstance(result, SafeText)) + + def test_render(self): + block = blocks.RawHTMLBlock() + result = block.render(mark_safe('BOOM')) + self.assertEqual(result, 'BOOM') + self.assertTrue(isinstance(result, SafeText)) + + def test_render_form(self): + block = blocks.RawHTMLBlock() + result = block.render_form(mark_safe('BOOM'), prefix='rawhtml') + self.assertIn('