general: adjust media support in all widgets (#25113)

This commit is contained in:
Frédéric Péters 2018-07-06 12:50:51 +02:00
parent 34c5d97519
commit 6df1af66e9
5 changed files with 32 additions and 19 deletions

View File

@ -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',

View File

@ -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 <head>
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,

View File

@ -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('<br />'):
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("</textarea>"))
@ -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):
'<input type="hidden" name="%s$encoded" value="%s"></input>' % (
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('''<script>

View File

@ -423,6 +423,13 @@ class QommonTemplateResponse(object):
self.templates = templates
self.context = context
def add_media(self):
if 'form' in self.context:
# run add_media on all widgets so we get them in the page <head>
for widget in self.context['form'].get_all_widgets():
if hasattr(widget, 'add_media'):
widget.add_media()
class TemplateError(Exception):
def __init__(self, msg, params=()):

View File

@ -56,6 +56,7 @@ class Backoffice(compat.TemplateWithFallbackView):
get_request().response.filter = {'admin_ezt': True}
body = get_publisher().try_publish(get_request())
if isinstance(body, template.QommonTemplateResponse):
body.add_media()
body = template.render(body.templates, body.context)
get_publisher().session_manager.finish_successful_request()
self.quixote_response = get_request().response