def __call__(self, field, **kwargs): rendered = [] rendered.append('<table class="%s">' % kwargs.pop('table_class', 'table')) rendered.append('<thead>') rendered.append('<tr>') rendered.append('<th>%s</th>' % field.label) for value, label in field.choices: rendered.append('<th>%s</th>' % label) rendered.append('</th>') rendered.append('</thead>') rendered.append('<tbody>') for name, title in field.fields: rendered.append('<tr>') rendered.append('<td>%s</td>' % title) selected = field.data.get(name) for value, label in field.choices: params = {'type': 'radio', 'name': name, 'value': value} if text_type(selected) == text_type(value): params['checked'] = True rendered.append('<td><input %s/></td>' % wtforms.widgets.html_params(**params)) rendered.append('</tr>') rendered.append('</tbody>') rendered.append('</table>') return Markup('\n'.join(rendered))
def html_params(**kwargs): """ This is Verbatim from WTForms BUT "aria_" is handled like "data_" Generate HTML attribute syntax from inputted keyword arguments. The output value is sorted by the passed keys, to provide consistent output each time this function is called with the same parameters. Because of the frequent use of the normally reserved keywords `class` and `for`, suffixing these with an underscore will allow them to be used. In order to facilitate the use of ``data-`` attributes, the first underscore behind the ``data``-element is replaced with a hyphen. >>> html_params(data_any_attribute='something') 'data-any_attribute="something"' In addition, the values ``True`` and ``False`` are special: * ``attr=True`` generates the HTML compact output of a boolean attribute, e.g. ``checked=True`` will generate simply ``checked`` * ``attr=False`` will be ignored and generate no output. >>> html_params(name='text1', id='f', class_='text') 'class="text" id="f" name="text1"' >>> html_params(checked=True, readonly=False, name="text1", abc="hello") 'abc="hello" checked name="text1"' """ params = [] for k, v in sorted(iteritems(kwargs)): if k in ('class_', 'class__', 'for_'): k = k[:-1] elif k.startswith('data_') or k.startswith('aria_') : k = k.replace('_', '-', 1) if v is True: params.append(k) elif v is False: pass else: params.append('%s="%s"' % (text_type(k), escape(text_type(v), quote=True))) return ' '.join(params)
def __call__(self, field, class_='', row_class='row', **kwargs): """ There are Bootstrap 3 specific improvements for row wrapping. """ html = [] hidden = '' arguments = self.defaults arguments.update(kwargs) classes = arguments.get('classes', {}) for i, subfield in enumerate(field): if subfield.type == 'HiddenField': hidden += text_type(subfield) else: wrapper_class = classes.get(i, '') html.append('%s<div class="%s">%s</div>' % ( hidden, wrapper_class, text_type(subfield( class_=class_, placeholder=subfield.label.text)))) hidden = '' if hidden: html.append(hidden) return HTMLString('<div class="%s">' % (row_class, ) + ''.join(html) + '</div>')
def __call__(self, field, **kwargs): html = [] kwargs.setdefault('id', field.id) with_div = True expended = False exp_text = 'style=display:none' if expended else '' if with_div: html.append('<div>') html.append('<span %s>' % widgets.html_params(**kwargs)) hidden = '' html.append('<span class="range-span">') for subfield in field: if subfield.type == 'HiddenField': hidden += text_type(subfield) else: html.append('<div class="range-div">%s%s</div>' % (hidden, text_type(subfield))) hidden = '' html.append('</span>') html.append('<button type="button" class="btn btn-default btn-sm" id="%s-toggle-button" name="%s-toggle-button" style="font-size: 16px;">' % (field.name, field.name)) html.append(' <span></span>') html.append('</button>') html.append('</span>') if with_div: html.append('</div>') if hidden: html.append(hidden) return widgets.HTMLString(''.join(html))
def html_params(**kwargs): """ Generate HTML attribute syntax from inputted keyword arguments. The output value is sorted by the passed keys, to provide consistent output each time this function is called with the same parameters. Because of the frequent use of the normally reserved keywords `class` and `for`, suffixing these with an underscore will allow them to be used. In addition, the values ``True`` and ``False`` are special: * ``attr=True`` generates the HTML compact output of a boolean attribute, e.g. ``checked=True`` will generate simply ``checked`` * ``attr=`False`` will be ignored and generate no output. >>> html_params(name='text1', id='f', class_='text') 'class="text" id="f" name="text1"' >>> html_params(checked=True, readonly=False, name="text1", abc="hello") 'abc="hello" checked name="text1"' """ params = [] for k, v in sorted(iteritems(kwargs)): if k in ('class_', 'class__', 'for_'): k = k[:-1] if v is True: params.append(k) elif v is False: pass else: params.append('%s="%s"' % (text_type(k), escape(text_type(v), quote=True))) return ' '.join(params)
def render_option(cls, value, label, selected, **kwargs): if value is True: # Handle the special case of a 'True' value. value = text_type(value) options = dict(kwargs, value=value) if selected: options['selected'] = True return HTMLString('<option %s>%s</option>' % (html_params(**options), escape(text_type(label), quote=False)))
def __init__(self, enum_class, enums, label=None, validators=None, default=None, **kwargs): self._enum_class = enum_class self._enums = enums # Column(Enum(enum.Enum)) case if enum_class is not None: labels = [text_type(enum_class.__members__[enum_member].value) for enum_member in enums] def coerce(value): if value is None: return None elif isinstance(value, enum_class): return value else: return enum_class.__members__[value] # Column(Enum(*enums)) case else: labels = enums def coerce(value): if value is None: return None return text_type(value) choices = list(zip(enums, labels)) super(EnumField, self).__init__(label=label, validators=validators, default=default, coerce=coerce, choices=choices, **kwargs)
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) kwargs.setdefault('rows', self.rows) return HTMLString('<textarea %(html_params)s>%(value)s</textarea>' % { 'html_params': html_params(name=field.name, **kwargs), 'value': escape(text_type(field._value())), })
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) kwargs['class'] = 'wysiwyg' return HTMLString('<textarea %s>%s</textarea>' % ( html_params(name=field.name, **kwargs), escape(text_type(field._value()), quote=False) ))
def _value(self): if self.raw_data: return self.raw_data[0] elif self.data is not None: return text_type(self.data) else: return ''
def __call__(self, field, **kwargs): html = [] kwargs.setdefault('id', field.id) html.append(u'<div %s>' % html_params(**kwargs)) hidden = u'' for subfield in field: if subfield.type == 'HiddenField': hidden += text_type(subfield) else: html.append(u'<div><span>%s</span>%s%s</div>' % ( text_type(subfield.label), hidden, text_type(subfield))) hidden = u'' html.append(u'</div>') if hidden: html.append(hidden) return HTMLString(u''.join(html))
def test_second_book(self): authors = set(text_type(x.key.id()) for x in fill_authors(Author)) authors.add('__None') form = model_form(second_ndb_module.SecondBook) keys = set() for key, b, c in form().author.iter_choices(): keys.add(key)
def _get_object_list(self): if self._object_list is None: objs = self.query_func() self._object_list = list( (text_type(self.get_pk_func(obj)), obj) for obj in objs ) return self._object_list
def test(self): form = self.F() self.assertEqual(form.a.data, 'a') self.assertEqual(form.b.data, None) self.assertEqual(form.validate(), False) self.assertEqual( form.a(), ( """<ul id="a">""" """<li><input checked id="a-0" name="a" type="radio" value="a"> <label for="a-0">hello</label></li>""" """<li><input id="a-1" name="a" type="radio" value="b"> <label for="a-1">bye</label></li></ul>""" ) ) self.assertEqual( form.b(), ( """<ul id="b">""" """<li><input id="b-0" name="b" type="radio" value="1"> <label for="b-0">Item 1</label></li>""" """<li><input id="b-1" name="b" type="radio" value="2"> <label for="b-1">Item 2</label></li></ul>""" ) ) self.assertEqual( [text_type(x) for x in form.a], ['<input checked id="a-0" name="a" type="radio" value="a">', '<input id="a-1" name="a" type="radio" value="b">'] )
def render_option(cls, value, label, selected, disabled=False, **kwargs): options = dict(kwargs, value=value) if selected: options["selected"] = True if disabled: options["disabled"] = True return HTMLString("<option %s>%s</option>" % (html_params(**options), escape(text_type(label))))
def _get_pk_from_identity(obj): """Copied / pasted, and fixed, from WTForms_sqlalchemy due to issue w/ SQLAlchemy >= 1.2.""" from sqlalchemy.orm.util import identity_key cls, key = identity_key(instance=obj)[0:2] return ":".join(text_type(x) for x in key)
def _get_object_list(self): if self._object_list is None: query = (self.query if self.query is not None else self.query_factory()) get_pk = self.get_pk self._object_list = list( (text_type(get_pk(obj)), obj) for obj in query) return self._object_list
def __call__(self, field, **kwargs): html = [] kwargs.setdefault('id', field.id) html.append('<div %s>' % html_params(**kwargs)) hidden = '' for subfield in field: if subfield.type == 'HiddenField': hidden += text_type(subfield) else: html.append( '<div><span>%s</span>%s%s</div>' % (text_type(subfield.label), hidden, text_type(subfield))) hidden = '' html.append('</div>') if hidden: html.append(hidden) return HTMLString(''.join(html))
def render_option(cls, value, label, selected, **kwargs): options = dict(kwargs, value=value) options['type'] = 'checkbox' if selected: options['checked'] = True return HTMLString( '<div class="checkbox"><label><input %s> %s</label></div>' % (html_params(**options), escape(text_type(label))))
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) if 'required' not in kwargs and 'required' in getattr( field, 'flags', []): kwargs['required'] = True return HTMLString('<textarea %s>%s</textarea>' % (html_params(name=field.name, **kwargs), escape(text_type(field._value()), quote=False)))
def __call__(self, field, **kwargs): return HTMLString( '<script %s>%s</script><script>var um = UM.getEditor("%s");</script>' % ( self.html_params(name=field.name, **kwargs), text_type(field._value()), field.name, ))
def __call__(self, field, **kwargs): return HTMLString( '<script %s>%s</script><script>var um = UM.getEditor("%s");</script>' % ( self.html_params(name=field.name, **kwargs), text_type(field._value()), field.name, ) )
def _get_object_list(self): if self._object_list is None: query = self.query or self.query_factory() get_pk = self.get_pk self._object_list = list( (text_type(get_pk(obj)), obj) for obj in query ) return self._object_list
def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) kwargs.setdefault("data-dojo-type", self.dojo_type) return HTMLString("<textarea %s %s>%s</textarea>" % ( html_params(name=field.name, **kwargs), get_validation_str(field), escape(text_type(field._value())), ))
def __call__(self, field, **kwargs): html = [] if self.with_table_tag: kwargs.setdefault('id', field.id) html.append('<table %s>' % html_params(**kwargs)) hidden = '' for subfield in field: if subfield.type == 'HiddenField': hidden += text_type(subfield) else: html.append('<tr><th>%s</th><td>%s%s</td></tr>' % (text_type(subfield.label), hidden, text_type(subfield))) hidden = '' if self.with_table_tag: html.append('</table>') if hidden: html.append(hidden) return HTMLString(''.join(html))
def __call__(self, field, **kwargs): html = [] if self.with_table_tag: kwargs.setdefault('id', field.id) html.append('<table %s>' % html_params(**kwargs)) hidden = '' for subfield in field: if subfield.type in ('HiddenField', 'CSRFTokenField'): hidden += text_type(subfield) else: html.append('<tr><th>%s</th><td>%s%s</td></tr>' % (text_type(subfield.label), hidden, text_type(subfield))) hidden = '' if self.with_table_tag: html.append('</table>') if hidden: html.append(hidden) return Markup(''.join(html))
def _value(self): if self.raw_data: return self.raw_data[0] elif self.data is not None: if self.places is not None: if hasattr(self.data, 'quantize'): exp = decimal.Decimal('.1') ** self.places quantized = self.data.quantize(exp, rounding=self.rounding) return text_type(quantized) else: # If for some reason, data is a float or int, then format # as we would for floats using string formatting. format = '%%0.%df' % self.places return format % self.data else: return text_type(self.data) else: return ''
def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) if "required" not in kwargs and "required" in getattr( field, "flags", []): kwargs["required"] = True return HTMLString("<textarea %s>%s</textarea>" % ( html_params(name=field.name, **kwargs), escape(text_type(field._value()), quote=False), ))
def test_book(self): authors = set(text_type(x.key.id()) for x in fill_authors(Author)) authors.add('__None') form = model_form(Book) keys = set() for key, b, c in form().author.iter_choices(): keys.add(key) self.assertEqual(authors, keys)
def __call__(self, field, **kwargs): """Render button.""" kwargs.setdefault('id', field.id) kwargs.setdefault('type', self.input_type) kwargs.setdefault('value', "y") return HTMLString( '<button %s>%s%s</button>' % (html_params(name=field.name, **kwargs), "<i class=\"%s\"></i> " % self._icon if self._icon else "", text_type(field.label.text)))
def __call__(self, field, **kwargs): html = [] if self.with_section_tag: kwargs.setdefault('id', field.id) html.append('<section class="col-md-6" %s>' % html_params(**kwargs)) hidden = '' _params = html_params(**kwargs) for subfield in field: if subfield.type == 'CSRFTokenField': html.append('<div style="display:none" %s>%s</div>' % (_params,text_type(subfield(class_="form-control")))) else: html.append('<div class="col-md-2" %s>%s</div>' % (_params,text_type(subfield(class_="form-control")))) hidden = '' if self.with_section_tag: html.append('</section>') if hidden: html.append(hidden) return HTMLString(''.join(html))
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) kwargs.setdefault('type', 'text/plain') kwargs.setdefault('style', 'width:99%;height:360px;') kwargs['class'] = '' return HTMLString( '<script %s>%s</script><script>var um = UM.getEditor("%s");</script>' % (html_params(name=field.name, **kwargs), text_type( field._value()), field.name))
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) html='' html+='<div class=\"btn-toolbar m-b-sm btn-editor\" data-role=\"editor-toolbar\"data-target=\"#editor\"><div class=\"btn-group\"><a class=\"btn btn-default btn-sm dropdown-toggle\" data-toggle=\"dropdown\" title=\"Font\"><i class=\"fa fa-font\"></i><b class=\"caret\"></b></a><ul class=\"dropdown-menu\"></ul></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm dropdown-toggle\" data-toggle=\"dropdown\" title=\"Font Size\"><i class=\"fa fa-text-height\"></i> <b class=\"caret\"></b></a><ul class=\"dropdown-menu\"><li><a data-edit=\"fontSize 5\"><font size=\"5\"> Huge</font></a></li><li><a data-edit=\"fontSize 3\"><font size=\"3\"> Normal</font></a></li><li><a data-edit=\"fontSize 1\"><font size=\"1\"> Small</font></a></li></ul></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm\" data-edit=\"bold\" title=\"Bold (Ctrl/Cmd+B)\"><i class=\"fa fa-bold\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"italic\" title=\"Italic (Ctrl/Cmd+I)\"><i class=\"fa fa-italic\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"strikethrough\" title=\"Strikethrough\"><i class=\"fa fa-strikethrough\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"underline\" title=\"Underline (Ctrl/Cmd+U)\"><i class=\"fa fa-underline\"></i></a></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm\" data-edit=\"insertunorderedlist\" title=\"Bullet list\"><i class=\"fa fa-list-ul\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"insertorderedlist\" title=\"Number list\"><i class=\"fa fa-list-ol\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"outdent\" title=\"Reduce indent (Shift+Tab)\"><i class=\"fa fa-dedent\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"indent\" title=\"Indent (Tab)\"><i class=\"fa fa-indent\"></i></a></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm\" data-edit=\"justifyleft\" title=\"Align Left (Ctrl/Cmd+L)\"><i class=\"fa fa-align-left\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"justifycenter\" title=\"Center (Ctrl/Cmd+E)\"><i class=\"fa fa-align-center\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"justifyright\" title=\"Align Right (Ctrl/Cmd+R)\"><i class=\"fa fa-align-right\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"justifyfull\" title=\"Justify (Ctrl/Cmd+J)\"><i class=\"fa fa-align-justify\"></i></a></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm dropdown-toggle\" data-toggle=\"dropdown\" title=\"Hyperlink\"><i class=\"fa fa-link\"></i></a><div class=\"dropdown-menu\"><div class=\"input-group m-l-xs m-r-xs\"><input class=\"form-control input-sm\" placeholder=\"URL\" type=\"text\" data-edit=\"createLink\" /><div class=\"input-group-btn\"><button class=\"btn btn-default btn-sm\" type=\"button\"> Add</button></div></div></div><a class=\"btn btn-default btn-sm\" data-edit=\"unlink\" title=\"Remove Hyperlink\"><i class=\"fa fa-cut\"></i></a></div><div class=\"btn-group hide\"><a class=\"btn btn-default btn-sm\" title=\"Insert picture (or just drag & drop)\" id=\"pictureBtn\"><i class=\"fa fa-picture-o\"></i></a><input type=\"file\" data-role=\"magic-overlay\" data-target=\"#pictureBtn\" data-edit=\"insertImage\" /></div><div class=\"btn-group\"><a class=\"btn btn-default btn-sm\" data-edit=\"undo\" title=\"Undo (Ctrl/Cmd+Z)\"><i class=\"fa fa-undo\"></i></a><a class=\"btn btn-default btn-sm\" data-edit=\"redo\" title=\"Redo (Ctrl/Cmd+Y)\"><i class=\"fa fa-repeat\"></i></a></div></div>' html+='<textarea class=\"hide flask-wysiwyg\" data-editor=\"editor\" %s>%s</textarea>' html+='<div id=\"editor\" style=\"overflow:scroll;height:150px;max-height:150px\" class="bootstrap-wysiwyg form-control" >%s</div>' return HTMLString(html % (html_params(name=field.name, **kwargs), escape(text_type(field._value())),escape(text_type(field._value()))))
def render_option(cls, value, label, selected, **kwargs): if value is True: # Handle the special case of a 'True' value. value = text_type(value) options = dict(kwargs, value=value) if selected: options['selected'] = True return HTMLString('<option %s>%s</option>' % (html_params(**options), escape_html(label, quote=False)))
def __call__(self, field, **kwargs): data = kwargs.get('data', '') if data: del kwargs['data'] kwargs.setdefault('id', field.id) return HTMLString('<textarea %s>%s</textarea>' % ( html_params(name=field.name, **kwargs), escape(text_type(data), quote=False) ))
def test_iterable_options(self): form = self.F() first_option = list(form.a)[0] self.assertTrue(isinstance(first_option, form.a._Option)) self.assertEqual(list(text_type(x) for x in form.a), ['<option selected value="a">hello</option>', '<option value="btest">bye</option>']) self.assertTrue(isinstance(first_option.widget, widgets.Option)) self.assertTrue(isinstance(list(form.b)[0].widget, widgets.TextInput)) self.assertEqual(first_option(disabled=True), '<option disabled selected value="a">hello</option>')
def test_no_data(self): form = self.F() form.author.query = Author.query().order(Author.name) assert not form.validate() ichoices = list(form.author.iter_choices()) self.assertEqual(len(ichoices), len(self.authors)) for author, (key, label, selected) in zip(self.authors, ichoices): self.assertEqual(key, text_type(author.key.id()))
def _value(self): if not isinstance(self.data, str): tag_names = [] if self.data: for tag in self.data: tag_names.append(tag.name) return text_type(','.join(tag_names)) if tag_names is not None else '' else: return super(TagInputField, self)._value()
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) html='' html+='<div class=\"btn-toolbar\" data-role=\"editor-toolbar\" data-target=\"#editor\">' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn dropdown-toggle\" data-toggle=\"dropdown\" title=\"Font\"><i class=\"icon-font\"></i><b class=\"caret\"></b></a>' html+=' <ul class=\"dropdown-menu\">' html+=' </ul>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn dropdown-toggle\" data-toggle=\"dropdown\" title=\"Font Size\"><i class=\"icon-text-height\"></i> <b class=\"caret\"></b></a>' html+=' <ul class=\"dropdown-menu\">' html+=' <li><a data-edit=\"fontSize 5\"><font size=\"5\">Huge</font></a></li>' html+=' <li><a data-edit=\"fontSize 3\"><font size=\"3\">Normal</font></a></li>' html+=' <li><a data-edit=\"fontSize 1\"><font size=\"1\">Small</font></a></li>' html+=' </ul>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn\" data-edit=\"bold\" title=\"Bold (Ctrl/Cmd+B)\"><i class=\"icon-bold\"></i></a>' html+=' <a class=\"btn\" data-edit=\"italic\" title=\"Italic (Ctrl/Cmd+I)\"><i class=\"icon-italic\"></i></a>' html+=' <a class=\"btn\" data-edit=\"strikethrough\" title=\"Strikethrough\"><i class=\"icon-strikethrough\"></i></a>' html+=' <a class=\"btn\" data-edit=\"underline\" title=\"Underline (Ctrl/Cmd+U)\"><i class=\"icon-underline\"></i></a>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn\" data-edit=\"insertunorderedlist\" title=\"Bullet list\"><i class=\"icon-list-ul\"></i></a>' html+=' <a class=\"btn\" data-edit=\"insertorderedlist\" title=\"Number list\"><i class=\"icon-list-ol\"></i></a>' html+=' <a class=\"btn\" data-edit=\"outdent\" title=\"Reduce indent (Shift+Tab)\"><i class=\"icon-indent-left\"></i></a>' html+=' <a class=\"btn\" data-edit=\"indent\" title=\"Indent (Tab)\"><i class=\"icon-indent-right\"></i></a>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn\" data-edit=\"justifyleft\" title=\"Align Left (Ctrl/Cmd+L)\"><i class=\"icon-align-left\"></i></a>' html+=' <a class=\"btn\" data-edit=\"justifycenter\" title=\"Center (Ctrl/Cmd+E)\"><i class=\"icon-align-center\"></i></a>' html+=' <a class=\"btn\" data-edit=\"justifyright\" title=\"Align Right (Ctrl/Cmd+R)\"><i class=\"icon-align-right\"></i></a>' html+=' <a class=\"btn\" data-edit=\"justifyfull\" title=\"Justify (Ctrl/Cmd+J)\"><i class=\"icon-align-justify\"></i></a>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn dropdown-toggle\" data-toggle=\"dropdown\" title=\"Hyperlink\"><i class=\"icon-link\"></i></a>' html+=' <div class=\"dropdown-menu input-append\">' html+=' <input class=\"span2\" placeholder=\"URL\" type=\"text\" data-edit=\"createLink\"/>' html+=' <button class=\"btn\" type=\"button\">Add</button>' html+=' </div>' html+=' <a class=\"btn\" data-edit=\"unlink\" title=\"Remove Hyperlink\"><i class=\"icon-cut\"></i></a>' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn\" title=\"Insert picture (or just drag & drop)\" id=\"pictureBtn\"><i class=\"icon-picture\"></i></a>' html+=' <input type=\"file\" data-role=\"magic-overlay\" data-target=\"#pictureBtn\" data-edit=\"insertImage\" />' html+=' </div>' html+=' <div class=\"btn-group\">' html+=' <a class=\"btn\" data-edit=\"undo\" title=\"Undo (Ctrl/Cmd+Z)\"><i class=\"icon-undo\"></i></a>' html+=' <a class=\"btn\" data-edit=\"redo\" title=\"Redo (Ctrl/Cmd+Y)\"><i class=\"icon-repeat\"></i></a>' html+=' </div>' html+=' <input type=\"text\" data-edit=\"inserttext\" id=\"voiceBtn\" x-webkit-speech=\"\">' html+=' </div> ' html+=' <div id=\"editor\" %s>%s</div> ' return HTMLString(html % (html_params(name=field.name, **kwargs), escape(text_type(field._value()))))
def _value(self): try: js = json.JSONDecoder( object_pairs_hook=collections.OrderedDict).decode(self.data) return json.dumps(js, indent=4, separators=(',', ': '), ensure_ascii=False) except: return text_type(self.data) if self.data is not None else ''
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) params = kwargs params['name'] = field.name return HTMLString('<textarea %s>%s</textarea>' % ( html_params(params), escape(text_type(field._value()), quote=False) ))
def render_option(cls, value, label, selected, **kwargs): if value is True: # Handle the special case of a 'True' value. value = text_type(value) options = dict(kwargs, value=value) if selected: options["selected"] = True return Markup("<option %s>%s</option>" % (html_params(**options), escape(label)))
def __call__(self, field, **kwargs): """Render button.""" kwargs.setdefault('id', field.id) kwargs.setdefault('type', self.input_type) kwargs.setdefault('value', "y") return HTMLString('<button %s>%s%s</button>' % ( html_params(name=field.name, **kwargs), "<i class=\"%s\"></i> " % self._icon if self._icon else "", text_type(field.label.text) ))
def render_option(cls, value, label, selected, disabled, **kwargs): if value is True: # Handle the special case of a 'True' value. value = compat.text_type(value) options = dict(kwargs, value=value) if selected: options['selected'] = True if disabled: options['disabled'] = True return widgets.HTMLString('<option %s>%s</option>' % (widgets.html_params(**options), compat.text_type(label)))
def _value(self): if not isinstance(self.data, str): tag_names = [] if self.data: for tag in self.data: tag_names.append(tag.name) return text_type( ','.join(tag_names)) if tag_names is not None else '' else: return super(TagInputField, self)._value()
def __call__(self, field, **kwargs): html = [] if self.with_table_tag: kwargs.setdefault("id", field.id) html.append("<table %s>" % html_params(**kwargs)) hidden = "" for subfield in field: if subfield.type in ("HiddenField", "CSRFTokenField"): hidden += text_type(subfield) else: html.append( "<tr><th>%s</th><td>%s%s</td></tr>" % (text_type(subfield.label), hidden, text_type(subfield))) hidden = "" if self.with_table_tag: html.append("</table>") if hidden: html.append(hidden) return Markup("".join(html))
def __call__(self, field, **kwargs): html = [] if self.with_table_tag: kwargs.setdefault("id", field.id) html.append("<table %s>" % html_params(**kwargs)) hidden = "" for subfield in field: if subfield.type in ("HiddenField", "CSRFTokenField"): hidden += text_type(subfield) else: html.append( "<tr><th>%s</th><td>%s%s</td></tr>" % (text_type(subfield.label), hidden, text_type(subfield)) ) hidden = "" if self.with_table_tag: html.append("</table>") if hidden: html.append(hidden) return Markup("".join(html))
def test_iterable_options(self): form = self.F() first_option = list(form.a)[0] self.assertTrue(isinstance(first_option, form.a._Option)) self.assertEqual( list(text_type(x) for x in form.a), ['<option selected value="a">hello</option>', '<option value="btest">bye</option>'] ) self.assertTrue(isinstance(first_option.widget, widgets.Option)) self.assertTrue(isinstance(list(form.b)[0].widget, widgets.TextInput)) self.assertEqual(first_option(disabled=True), '<option disabled selected value="a">hello</option>')
def render_option(cls, value, label, selected, **kwargs): if value is True: # Handle the special case of a 'True' value. value = text_type(value) options = dict(kwargs, value=value) if selected: options["selected"] = True return Markup( "<option %s>%s</option>" % (html_params(**options), escape(label)) )
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) field_as_string = text_type(field._value()) try: pretty_printed_string = json.dumps( json.loads(field_as_string), indent=4, sort_keys=True) except ValueError: pretty_printed_string = field_as_string return HTMLString('<textarea %s>%s</textarea>' % ( html_params(name=field.name, **kwargs), escape(pretty_printed_string, quote=False) ))
def html_params(**kwargs): """ Generate HTML parameters from inputted keyword arguments. The output value is sorted by the passed keys, to provide consistent output each time this function is called with the same parameters. Because of the frequent use of the normally reserved keywords `class` and `for`, suffixing these with an underscore will allow them to be used. >>> html_params(name='text1', id='f', class_='text') == 'class="text" id="f" name="text1"' True """ params = [] for k,v in sorted(iteritems(kwargs)): if k in ('class_', 'class__', 'for_'): k = k[:-1] if v is True: params.append(k) else: params.append('%s="%s"' % (text_type(k), escape(text_type(v), quote=True))) return ' '.join(params)
def test_any_of(self): self.assertEqual(AnyOf(['a', 'b', 'c'])(self.form, DummyField('b')), None) self.assertRaises(ValueError, AnyOf(['a', 'b', 'c']), self.form, DummyField(None)) # Anyof in 1.0.1 failed on numbers for formatting the error with a TypeError check_num = AnyOf([1, 2, 3]) self.assertEqual(check_num(self.form, DummyField(2)), None) self.assertRaises(ValueError, check_num, self.form, DummyField(4)) # Test values_formatter formatter = lambda values: '::'.join(text_type(x) for x in reversed(values)) checker = AnyOf([7, 8, 9], message='test %(values)s', values_formatter=formatter) self.assertEqual(grab_error_message(checker, self.form, DummyField(4)), 'test 9::8::7')
def __call__(self, field, class_='', row_class='row', **kwargs): """There are Bootstrap 3 specific improvements for row wrapping.""" html = [] hidden = '' arguments = self.defaults arguments.update(kwargs) classes = arguments.get('classes', {}) for i, subfield in enumerate(field): if subfield.type == 'HiddenField': hidden += text_type(subfield) else: wrapper_class = classes.get(i, '') html.append('%s<div class="%s">%s</div>' % (hidden, wrapper_class, text_type( subfield(class_=class_, placeholder=subfield.label.text)))) hidden = '' if hidden: html.append(hidden) return HTMLString('<div class="%s">' % (row_class, ) + ''.join(html) + '</div>')
def test_any_of_values_formatter(dummy_form, dummy_field, grab_error_message): """ Test AnyOf values_formatter formating of error message """ formatter = lambda values: '::'.join( text_type(x) for x in reversed(values)) checker = AnyOf([7, 8, 9], message='test %(values)s', values_formatter=formatter) dummy_field.data = 4 expected = 'test 9::8::7' with pytest.raises(ValidationError): assert grab_error_message(checker(dummy_form, dummy_field)) == expected
def html_params(**kwargs): """ Generate HTML attribute syntax from inputted keyword arguments. The output value is sorted by the passed keys, to provide consistent output each time this function is called with the same parameters. Because of the frequent use of the normally reserved keywords `class` and `for`, suffixing these with an underscore will allow them to be used. In order to facilitate the use of ``data-`` attributes, the first underscore behind the ``data``-element is replaced with a hyphen. >>> html_params(data_any_attribute='something') 'data-any_attribute="something"' In addition, the values ``True`` and ``False`` are special: * ``attr=True`` generates the HTML compact output of a boolean attribute, e.g. ``checked=True`` will generate simply ``checked`` * ``attr=False`` will be ignored and generate no output. >>> html_params(name='text1', id='f', class_='text') 'class="text" id="f" name="text1"' >>> html_params(checked=True, readonly=False, name="text1", abc="hello") 'abc="hello" checked name="text1"' """ params = [] for k, v in sorted(iteritems(kwargs)): if k in ('class_', 'class__', 'for_'): k = k[:-1] elif k.startswith('data_'): k = k.replace('_', '-') if v is True: params.append(k) elif v is False: pass else: params.append('%s="%s"' % (text_type(k), escape(text_type(v), quote=True))) return ' '.join(params)
def __call__(self, field, **kwargs): kwargs.setdefault('id', field.id) html = ''' <div id="{el_id}" style="height:100px;">{contents}</div> <textarea id="{el_id}_ace" name="{form_name}" style="display:none;visibility:hidden;"> </textarea> '''.format( el_id=kwargs.get('id', field.id), contents=escape(text_type(field._value())), form_name=field.id, ) return wtforms.widgets.core.HTMLString(html)
def test(self): expected = """<label for="test">Caption</label>""" label = Label('test', 'Caption') self.assertEqual(label(), expected) self.assertEqual(str(label), expected) self.assertEqual(text_type(label), expected) self.assertEqual(label.__html__(), expected) self.assertEqual(label().__html__(), expected) self.assertEqual(label('hello'), """<label for="test">hello</label>""") self.assertEqual(TextField('hi').bind(Form(), 'a').label.text, 'hi') if PYTHON_VERSION < (3, ): self.assertEqual(repr(label), "Label(u'test', u'Caption')") else: self.assertEqual(repr(label), "Label('test', 'Caption')")