From f7e6fcc7b59df4586f1325994ba5b7b5ca911643 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Wed, 11 Feb 2015 16:04:14 +0000 Subject: [PATCH] move wagtailadmin.widgets.StreamWidget to wagtailadmin.blocks.BlockWidget This keeps all block-API related code in one module, and reflects the fact that BlockWidget is not inherently tied to StreamBlock in particular. --- wagtail/wagtailadmin/blocks.py | 36 ++++++++++++++++++++++++++- wagtail/wagtailadmin/edit_handlers.py | 3 ++- wagtail/wagtailadmin/widgets.py | 29 --------------------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/wagtail/wagtailadmin/blocks.py b/wagtail/wagtailadmin/blocks.py index feb8946fd..b060d3a19 100644 --- a/wagtail/wagtailadmin/blocks.py +++ b/wagtail/wagtailadmin/blocks.py @@ -14,7 +14,7 @@ from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.deconstruct import deconstructible from django.utils.functional import cached_property from django.template.loader import render_to_string -from django.forms import Media, CharField, ModelChoiceField +from django.forms import Media, CharField, ModelChoiceField, Widget from django.forms.utils import ErrorList import six @@ -869,3 +869,37 @@ class StreamValue(collections.Sequence): def __str__(self): return self.stream_block.render(self) + + +# ======================== +# django.forms integration +# ======================== + +class BlockWidget(Widget): + """Wraps a block object as a widget so that it can be incorporated into a Django form""" + def __init__(self, block_def, attrs=None): + super(BlockWidget, self).__init__(attrs=attrs) + self.block_def = block_def + + def render(self, name, value, attrs=None): + bound_block = self.block_def.bind(value, prefix=name) + js_initializer = self.block_def.js_initializer() + if js_initializer: + js_snippet = """ + + """ % (js_initializer, name) + else: + js_snippet = '' + return mark_safe(bound_block.render_form() + js_snippet) + + @property + def media(self): + return self.block_def.all_media() + + def value_from_datadict(self, data, files, name): + return self.block_def.value_from_datadict(data, files, name) diff --git a/wagtail/wagtailadmin/edit_handlers.py b/wagtail/wagtailadmin/edit_handlers.py index ec25e785e..2422d557d 100644 --- a/wagtail/wagtailadmin/edit_handlers.py +++ b/wagtail/wagtailadmin/edit_handlers.py @@ -20,6 +20,7 @@ from django.utils.translation import ugettext_lazy from taggit.managers import TaggableManager from wagtail.wagtailadmin import widgets +from wagtail.wagtailadmin.blocks import BlockWidget from wagtail.wagtailcore.models import Page from wagtail.wagtailcore.utils import camelcase_to_underscore, resolve_model_string from wagtail.utils.deprecation import RemovedInWagtail11Warning @@ -723,7 +724,7 @@ class BaseStreamFieldPanel(BaseFieldPanel): @classmethod def widget_overrides(cls): - return {cls.field_name: widgets.StreamWidget(block_def=cls.block_def)} + return {cls.field_name: BlockWidget(block_def=cls.block_def)} @classmethod def html_declarations(cls): diff --git a/wagtail/wagtailadmin/widgets.py b/wagtail/wagtailadmin/widgets.py index 5c283b26e..3309acb6e 100644 --- a/wagtail/wagtailadmin/widgets.py +++ b/wagtail/wagtailadmin/widgets.py @@ -121,32 +121,3 @@ class AdminPageChooser(AdminChooser): app=content_type.app_label, model=content_type.model)), parent=json.dumps(parent.id if parent else None)) - - -class StreamWidget(widgets.Widget): - def __init__(self, block_def, attrs=None): - super(StreamWidget, self).__init__(attrs=attrs) - self.block_def = block_def - - def render(self, name, value, attrs=None): - bound_block = self.block_def.bind(value, prefix=name) - js_initializer = self.block_def.js_initializer() - if js_initializer: - js_snippet = """ - - """ % (js_initializer, name) - else: - js_snippet = '' - return mark_safe(bound_block.render_form() + js_snippet) - - @property - def media(self): - return self.block_def.all_media() - - def value_from_datadict(self, data, files, name): - return self.block_def.value_from_datadict(data, files, name)