From 3694756e4e7ec1f3fa095e0e61526c83319c821b Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 14 Jan 2015 20:55:25 +0000 Subject: [PATCH] try to implement to_python and get_prep_value; run into awkward discrepancies between renderable and JSON-ish values --- wagtail/wagtailadmin/widgets.py | 4 ++-- wagtail/wagtailcore/fields.py | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/wagtail/wagtailadmin/widgets.py b/wagtail/wagtailadmin/widgets.py index b5889de7a..0f2fc7f85 100644 --- a/wagtail/wagtailadmin/widgets.py +++ b/wagtail/wagtailadmin/widgets.py @@ -62,7 +62,7 @@ class StreamWidget(widgets.Widget): self.block_def = block_def def render(self, name, value, attrs=None): - bound_block = self.block_def.bind(json.loads(value), prefix=name) + bound_block = self.block_def.bind(value, prefix=name) js_initializer = self.block_def.js_initializer() if js_initializer: js_snippet = """ @@ -82,4 +82,4 @@ class StreamWidget(widgets.Widget): return self.block_def.all_media() def value_from_datadict(self, data, files, name): - return json.dumps(self.block_def.value_from_datadict(data, files, name)) + return self.block_def.value_from_datadict(data, files, name) diff --git a/wagtail/wagtailcore/fields.py b/wagtail/wagtailcore/fields.py index a459d6071..82d6a4905 100644 --- a/wagtail/wagtailcore/fields.py +++ b/wagtail/wagtailcore/fields.py @@ -4,9 +4,11 @@ import json from django.db import models from django.forms import Textarea +from django.utils.six import with_metaclass from wagtail.wagtailcore.rich_text import DbWhitelister, expand_db_html from wagtail.utils.widgets import WidgetWithScript +from wagtail.wagtailadmin.blocks import StreamBlock # FIXME: wagtailcore shouldn't be depending on wagtailadmin class RichTextArea(WidgetWithScript, Textarea): @@ -38,12 +40,25 @@ class RichTextField(models.TextField): return super(RichTextField, self).formfield(**defaults) -class StreamField(models.TextField): +class StreamField(with_metaclass(models.SubfieldBase, models.TextField)): def __init__(self, block_types, **kwargs): self.block_types = block_types + self.stream_block = StreamBlock(block_types) super(StreamField, self).__init__(**kwargs) def deconstruct(self): name, path, args, kwargs = super(StreamField, self).deconstruct() kwargs['block_types'] = self.block_types return name, path, args, kwargs + + def to_python(self, value): + if value is None: + return [] + elif isinstance(value, list): + return value + else: # assume string + return self.stream_block.renderable(json.loads(value)) + + def get_prep_value(self, value): + return json.dumps(value) +