From c6108543c7b75d050cc2ed3db563816a8019972b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 6 Jul 2018 12:50:51 +0200 Subject: [PATCH] general: adjust media support in all widgets (#25113) --- tests/test_form_pages.py | 2 ++ wcs/compat.py | 6 +----- wcs/qommon/form.py | 35 +++++++++++++++++++++-------------- wcs/qommon/template.py | 7 +++++++ wcs/views.py | 1 + 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 8d92733d..32c27ad3 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -3530,6 +3530,7 @@ def test_form_autocomplete_variadic_url(pub): resp = resp.form.submit('submit') # next # test javascript will be used to compute the full URL assert 'options.wcs_base_url' in resp.body + assert 'jquery-ui.min.js' in resp.body # test going forward (will error out), check it's still a variadic URL (#9786) resp.form['f1'] = 'Foo' @@ -3618,6 +3619,7 @@ def test_form_jsonp_item_field(http_requests, pub): resp = get_app(pub).get('/test/') assert 'url: "http://remote.example.net/jsonp"' in resp.body + assert 'select2.min.js' in resp.body formdef.fields = [ fields.ItemField(id='1', label='string', type='item', diff --git a/wcs/compat.py b/wcs/compat.py index 9d8a7a18..3930b155 100644 --- a/wcs/compat.py +++ b/wcs/compat.py @@ -174,11 +174,7 @@ class CompatWcsPublisher(WcsPublisher): template_response) def render_template(self, request, response, template_response): - if 'form' in template_response.context: - # run add_media on all widgets so we get them in the page - for widget in template_response.context['form'].get_all_widgets(): - if hasattr(widget, 'add_media'): - widget.add_media() + template_response.add_media() context = template.get_decorate_vars( template_response.context.get('body'), response, diff --git a/wcs/qommon/form.py b/wcs/qommon/form.py index 9dd73bdf..44859dda 100644 --- a/wcs/qommon/form.py +++ b/wcs/qommon/form.py @@ -945,6 +945,9 @@ class DateWidget(StringWidget): self.error = _('invalid date; date must be on or before %s') % strftime( misc.date_format(), datetime.datetime(*self.maximum_date[:6])) + def add_media(self): + self.prepare_javascript() + @classmethod def prepare_javascript(cls): get_response().add_javascript([ @@ -962,8 +965,6 @@ class DateWidget(StringWidget): if self.attrs.get('readonly'): return StringWidget.render_content(self) - self.prepare_javascript() - date_format = self.get_format_string().replace('%Y', 'yyyy').replace( '%m', 'mm').replace('%d', 'dd').replace('%H', 'hh').replace( '%M', 'ii').replace('%S', 'ss') @@ -1252,9 +1253,10 @@ class WidgetList(quixote.form.widget.WidgetList): element_kwargs=element_kwargs, add_element_label=add_element_label, **kwargs) + def add_media(self): + get_response().add_javascript(['jquery.js', 'widget_list.js']) def render(self): - get_response().add_javascript(['jquery.js', 'widget_list.js']) r = TemplateIO(html=True) if self.attrs: r += htmltag('div', **self.attrs) @@ -1334,10 +1336,12 @@ class TagsWidget(StringWidget): if self.value is not None: self.value = [x.strip() for x in self.value.split(',') if x.strip()] - def render_content(self): - r = TemplateIO(html=True) + def add_media(self): get_response().add_javascript(['jquery.js', 'jquery.autocomplete.js']) get_response().add_css_include('../js/jquery.autocomplete.css') + + def render_content(self): + r = TemplateIO(html=True) id = 'tags-%s' % randbytes(8) if self.value: value = ', '.join(self.value) + ', ' @@ -1371,12 +1375,12 @@ class WysiwygTextWidget(TextWidget): if self.value.endswith('
'): self.value = self.value[:-6] - def render_content(self): + def add_media(self): get_response().add_javascript(['jquery.js', 'ckeditor/ckeditor.js', 'qommon.wysiwyg.js', 'ckeditor/adapters/jquery.js']) + def render_content(self): attrs = self.attrs.copy() - return (htmltag('textarea', name=self.name, **attrs) + htmlescape(self.value or '') + htmltext("")) @@ -1763,6 +1767,10 @@ class JsonpSingleSelectWidget(Widget): Widget.__init__(self, name, value=value, **kwargs) self.url = url + def add_media(self): + get_response().add_javascript(['jquery.js', 'select2.js']) + get_response().add_css_include('../js/select2/select2.css') + def render_content(self): if self.value is None: value = None @@ -1782,9 +1790,6 @@ class JsonpSingleSelectWidget(Widget): r += htmltag('input', xml_end=True, type="hidden", name=self.name + '_display', **attrs) initial_display_value = attrs.get('value') - get_response().add_javascript(['jquery.js', 'select2.js']) - get_response().add_css_include('../js/select2/select2.css') - # init select2 widget allowclear = "" if not self.required: @@ -1914,9 +1919,10 @@ class AutocompleteStringWidget(WcsExtraStringWidget): if kwargs.get('url'): self.url = kwargs.get('url') - def render_content(self): + def add_media(self): get_response().add_javascript(['jquery.js', 'jquery-ui.js']) + def render_content(self): if Template.is_template_string(self.url): vars = get_publisher().substitutions.get_context_variables() # skip variables that were not set (None) @@ -2004,9 +2010,8 @@ class ColourWidget(SingleSelectWidget): SelectWidget.__init__(self, options=colours, *args, **kwargs) self.attrs['class'] = 'colour-picker' - def render_content(self): + def add_media(self): get_response().add_javascript(['jquery.js', 'jquery.colourpicker.js']) - return SingleSelectWidget.render_content(self) def _parse(self, request): SingleSelectWidget._parse(self, request) @@ -2059,10 +2064,12 @@ class PasswordEntryWidget(CompositeWidget): '' % ( fake_value, self.name, encoded_value))) + def add_media(self): + get_response().add_javascript(['jquery.js', 'jquery.passstrength.js']) + def render_content(self): if self.attrs.get('readonly') or not self.strength_indicator: return CompositeWidget.render_content(self) - get_response().add_javascript(['jquery.js', 'jquery.passstrength.js']) r = TemplateIO(html=True) r += CompositeWidget.render_content(self) r += htmltext('''