diff --git a/wagtail/wagtailcore/blocks/field_block.py b/wagtail/wagtailcore/blocks/field_block.py index d01141d46..4b65f770e 100644 --- a/wagtail/wagtailcore/blocks/field_block.py +++ b/wagtail/wagtailcore/blocks/field_block.py @@ -1,6 +1,7 @@ from __future__ import absolute_import, unicode_literals import datetime +import six from django import forms from django.db.models.fields import BLANK_CHOICE_DASH @@ -282,8 +283,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 six.text_type(value) + + def value_for_form(self, value): + # need to explicitly mark as unsafe, or it'll output unescaped HTML in the textarea + return six.text_type(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 e51d5b8ec..b47f279d2 100644 --- a/wagtail/wagtailcore/tests/test_blocks.py +++ b/wagtail/wagtailcore/tests/test_blocks.py @@ -1,9 +1,13 @@ +# -*- coding: utf-8 -* +from __future__ import unicode_literals + import unittest 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, SafeData from wagtail.wagtailcore import blocks from wagtail.wagtailcore.rich_text import RichText @@ -308,6 +312,78 @@ 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.assertIsInstance(default_value, SafeData) + + def test_get_default_with_none(self): + default_value = blocks.RawHTMLBlock(default=None).get_default() + self.assertEqual(default_value, '') + self.assertIsInstance(default_value, SafeData) + + def test_get_default_with_empty_string(self): + default_value = blocks.RawHTMLBlock(default='').get_default() + self.assertEqual(default_value, '') + self.assertIsInstance(default_value, SafeData) + + def test_get_default_with_nonempty_string(self): + default_value = blocks.RawHTMLBlock(default='BÖÖM').get_default() + self.assertEqual(default_value, 'BÖÖM') + self.assertIsInstance(default_value, SafeData) + + def test_serialize(self): + block = blocks.RawHTMLBlock() + result = block.get_prep_value(mark_safe('BÖÖM')) + self.assertEqual(result, 'BÖÖM') + self.assertNotIsInstance(result, SafeData) + + def test_deserialize(self): + block = blocks.RawHTMLBlock() + result = block.to_python('BÖÖM') + self.assertEqual(result, 'BÖÖM') + self.assertIsInstance(result, SafeData) + + def test_render(self): + block = blocks.RawHTMLBlock() + result = block.render(mark_safe('BÖÖM')) + self.assertEqual(result, 'BÖÖM') + self.assertIsInstance(result, SafeData) + + def test_render_form(self): + block = blocks.RawHTMLBlock() + result = block.render_form(mark_safe('BÖÖM'), prefix='rawhtml') + self.assertIn('