def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] allowed_format = ['%d', '%m', '%Y'] surrounded_div = kwargs.pop('surrounded_div', None) css_class = kwargs.get('class', None) for date_format in field.format.split(): if date_format in allowed_format: choices = self.FORMAT_CHOICES[date_format] id_suffix = date_format.replace('%', '-') id_current = field_id + id_suffix if css_class is not None: # pragma: no cover select_class = "{} {}".format( css_class, self.FORMAT_CLASSES[date_format] ) else: select_class = self.FORMAT_CLASSES[date_format] kwargs['class'] = select_class try: del kwargs['placeholder'] except KeyError: pass if surrounded_div is not None: html.append('<div class="%s">' % surrounded_div) html.append('<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: current_value = int(field.data.strftime(date_format)) else: current_value = None for value, label in choices: selected = (value == current_value) # Defaults to blank if value == 1 or value == 1930: html.append( Select.render_option("None", " ", selected) ) html.append(Select.render_option(value, label, selected)) html.append('</select>') if surrounded_div is not None: html.append("</div>") html.append(' ') return HTMLString(''.join(html))
def __call__(self, field, **kwargs): # noqa: C901 field_id = kwargs.pop('id', field.id) html = [] allowed_format = ['%d', '%m', '%Y'] surrounded_div = kwargs.pop('surrounded_div', None) css_class = kwargs.get('class', None) for date_format in field.format.split(): if date_format in allowed_format: choices = self.FORMAT_CHOICES[date_format] id_suffix = date_format.replace('%', '-') id_current = field_id + id_suffix if css_class is not None: # pragma: no cover select_class = "{} {}".format( css_class, self.FORMAT_CLASSES[date_format] ) else: select_class = self.FORMAT_CLASSES[date_format] kwargs['class'] = select_class try: del kwargs['placeholder'] except KeyError: pass if surrounded_div is not None: html.append('<div class="%s">' % surrounded_div) html.append('<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: current_value = int(field.data.strftime(date_format)) else: current_value = None for value, label in choices: selected = (value == current_value) # Defaults to blank if value == 1 or value == 1930: html.append( Select.render_option("None", " ", selected) ) html.append(Select.render_option(value, label, selected)) html.append('</select>') if surrounded_div is not None: html.append("</div>") html.append(' ') return HTMLString(''.join(html))
def test_select(self, select_dummy_field): setattr(select_dummy_field, "name", "f") assert ( Select()(select_dummy_field) == '<select id="" name="f"><option selected value="foo">lfoo</option>' '<option value="bar">lbar</option></select>') assert (Select(multiple=True)(select_dummy_field) == '<select id="" multiple name="f"><option selected value="foo">' 'lfoo</option><option value="bar">lbar</option></select>')
def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] allowed_formats = ['%d', '%m', '%Y', '%H', '%M', '%S'] for format in field.format.split(): if format in allowed_formats: choices = self.FORMAT_CHOICES[format] id_suffix = format.replace('%', '-') id_current = field_id + id_suffix kwargs['class'] = self.FORMAT_CLASSES[format] try: del kwargs['placeholder'] except: pass html.append( '<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: current_value = int(field.data.strftime(format)) else: current_value = int(datetime.now().strftime(format)) for value, label in choices: selected = (value == current_value) html.append(Select.render_option(value, label, selected)) html.append('</select>') else: html.append(format) html.append( '<input type="hidden" value="{0}" {1}></input>'.format( format, html_params(name=field.name, id=id_current, **kwargs))) html.append(' ') return HTMLString(''.join(html))
def test_render_option(self): # value, label, selected assert (Select.render_option( "bar", "foo", False) == '<option value="bar">foo</option>') assert (Select.render_option( True, "foo", True) == '<option selected value="True">foo</option>') assert ( Select.render_option("bar", '<i class="bar"></i>foo', False) == '<option value="bar"><i class="bar"></i>foo</option>' ) assert (Select.render_option( "bar", Markup('<i class="bar"></i>foo'), False) == '<option value="bar"><i class="bar"></i>foo</option>')
def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] allowed_formats = ['%d', '%m', '%Y', '%H', '%M', '%S'] for format in field.format.split(): if format in allowed_formats: choices = self.FORMAT_CHOICES[format] id_suffix = format.replace('%', '-') id_current = field_id + id_suffix kwargs['class'] = self.FORMAT_CLASSES[format] try: del kwargs['placeholder'] except: pass html.append('<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: current_value = int(field.data.strftime(format)) else: current_value = int(datetime.now().strftime(format)) for value, label in choices: selected = (value == current_value) html.append(Select.render_option(value, label, selected)) html.append('</select>') else: html.append(format) html.append('<input type="hidden" value="{0}" {1}></input>'.format(format, html_params(name=field.name, id=id_current, **kwargs))) html.append(' ') return HTMLString(''.join(html))
class IndicoEnumSelectField(SelectFieldBase): """Select field backed by a :class:`TitledEnum`""" widget = Select() def __init__(self, label=None, validators=None, enum=None, sorted=False, only=None, skip=None, none=None, titles=None, **kwargs): super(IndicoEnumSelectField, self).__init__(label, validators, **kwargs) self.enum = enum self.sorted = sorted self.only = only self.skip = skip or set() self.none = none self.titles = titles def iter_choices(self): items = (x for x in self.enum if x not in self.skip and (self.only is None or x in self.only)) if self.sorted: items = sorted(items, key=attrgetter('title')) if self.none is not None: yield ('', self.none, self.data is None) for item in items: title = item.title if self.titles is None else self.titles[item] yield (item.name, title, item == self.data) def process_formdata(self, valuelist): if valuelist: if not valuelist[0] and self.none is not None: self.data = None else: try: self.data = self.enum[valuelist[0]] except KeyError: raise ValueError(self.gettext('Not a valid choice'))
def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] allowed_format = ['%d', '%m', '%Y', '%H', '%I', '%M', '%p'] # Handle custom year ranges startyear = 2010 endyear = 2020 if 'startyear' in field.description: startyear = int(field.description['startyear']) if 'endyear' in field.description: endyear = int(field.description['endyear']) self.FORMAT_CHOICES['%Y'] = [(x, str(x)) for x in range(endyear, startyear, -1)] html.append('<div class="form-inline">') for format in field.format.split(): if (format in allowed_format): choices = self.FORMAT_CHOICES.get(format, [(None, 'Invalid Format')]) id_suffix = format.replace('%', '-') id_current = field_id + id_suffix kwargs['class'] = self.FORMAT_CLASSES.get( 'format', 'form-control') # kwargs['class'] = 'form-control' kwargs['style'] = self.FORMAT_STYLES.get(format, '') try: del kwargs['placeholder'] except: pass html.append( '<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: try: current_value = int(field.data.strftime(format)) except: current_value = field.data.strftime(format) else: current_value = None for value, label in choices: selected = (value == current_value) html.append(Select.render_option(value, label, selected)) html.append('</select>') else: html.append(format) html.append( '<input type="hidden" value="' + format + '" %s></input>' % html_params(name=field.name, id=id_current, **kwargs)) html.append(' ') html.append('</div>') return HTMLString(''.join(html))
def test_render_option(self): # value, label, selected assert ( Select.render_option("bar", "foo", False) == '<option value="bar">foo</option>' ) assert ( Select.render_option(True, "foo", True) == '<option selected value="True">foo</option>' ) assert ( Select.render_option("bar", '<i class="bar"></i>foo', False) == '<option value="bar"><i class="bar"></i>foo</option>' ) assert ( Select.render_option("bar", Markup('<i class="bar"></i>foo'), False) == '<option value="bar"><i class="bar"></i>foo</option>' )
def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] allowed_format = ['%d', '%m', '%Y', '%H', '%I', '%M', '%p'] # Handle custom year ranges startyear = 2010 endyear = 2020 if 'startyear' in field.description: startyear = int(field.description['startyear']) if 'endyear' in field.description: endyear = int(field.description['endyear']) self.FORMAT_CHOICES['%Y'] = [(x, str(x)) for x in range(endyear, startyear, -1)] html.append('<div class="form-inline">') for format in field.format.split(): if (format in allowed_format): choices = self.FORMAT_CHOICES.get(format, [(None, 'Invalid Format')]) id_suffix = format.replace('%', '-') id_current = field_id + id_suffix kwargs['class'] = self.FORMAT_CLASSES.get('format', 'form-control') # kwargs['class'] = 'form-control' kwargs['style'] = self.FORMAT_STYLES.get(format, '') try: del kwargs['placeholder'] except: pass html.append('<select %s>' % html_params(name=field.name, id=id_current, **kwargs)) if field.data: try: current_value = int(field.data.strftime(format)) except: current_value = field.data.strftime(format) else: current_value = None for value, label in choices: selected = (value == current_value) html.append(Select.render_option(value, label, selected)) html.append('</select>') else: html.append(format) html.append('<input type="hidden" value="'+format+'" %s></input>' % html_params(name=field.name, id=id_current, **kwargs)) html.append(' ') html.append('</div>') return HTMLString(''.join(html))
def __call__(self, field, **kwargs): field_id = kwargs.pop('id', field.id) html = [] for format in field.format.split(): choices = self.FORMAT_CHOICES[format] id_suffix = format.replace('%', '-') params = dict(kwargs, name=field.name, id=field_id + id_suffix) html.append('<select %s>' % html_params()) if field.data: current_value = int(field.data.strftime(format)) else: current_value = None for value, label in choices: selected = (value == current_value) html.append(Select.render_option(value, label, selected)) html.append('</select>') return HTMLString(''.join(html))