def checkbox_edit_renderer(widget, data): tag = data.tag value = fetch_value(widget, data) input_attrs = { 'type': 'checkbox', 'value': value, 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'disabled': bool(widget.attrs.get('disabled')) and 'disabled' or None, } if widget.attrs['checked'] is not None: if widget.attrs['checked']: input_attrs['checked'] = 'checked' else: input_attrs['checked'] = value and 'checked' or None if widget.attrs['format'] == 'bool': input_attrs['value'] = '' checkbox = tag('input', **input_attrs) input_attrs = { 'type': 'hidden', 'value': 'checkboxexists', 'name_': "%s-exists" % widget.dottedpath, 'id': cssid(widget, 'checkboxexists'), } exists_marker = tag('input', **input_attrs) return checkbox + exists_marker
def label_renderer(widget, data): tag = data.tag label_text = widget.attrs.get('label', widget.__name__) label_attrs = { 'class_': cssclasses(widget, data) } if data.mode == 'edit': for_path = widget.attrs['for'] if for_path: for_widget = widget.root for name in for_path.split('.'): for_widget = for_widget[name] label_attrs['for_'] = cssid(for_widget, 'input') else: label_attrs['for_'] = cssid(widget, 'input') help = u'' if widget.attrs['help']: help_attrs = {'class_': widget.attrs['help_class']} help = tag('div', widget.attrs['help'], **help_attrs) pos = widget.attrs['position'] rendered = data.rendered is not UNSET and data.rendered or u'' if pos == 'inner': return tag('label', label_text, help, rendered, **label_attrs) elif pos == 'after': return rendered + tag('label', label_text, help, **label_attrs) return tag('label', label_text, help, **label_attrs) + rendered
def select_renderer(widget, data): tag = data.tag value = fetch_value(widget, data) if value is None: value = [] if isinstance(value, basestring) or not hasattr(value, '__iter__'): value = [value] if widget.attrs['format'] == 'block': optiontags = [] for key, term in vocabulary(widget.attrs.get('vocabulary', [])): attrs = { 'selected': (key in value) and 'selected' or None, 'value': key, 'id': cssid(widget, 'input', key), } optiontags.append(tag('option', term, **attrs)) select_attrs = { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'multiple': widget.attrs['multivalued'] and 'multiple' or None, } return tag('select', *optiontags, **select_attrs) else: tags = [] for key, term in vocabulary(widget.attrs.get('vocabulary', [])): if widget.attrs['multivalued']: tagtype = 'checkbox' else: tagtype = 'radio' attrs = { 'type': tagtype, 'value': key, 'checked': (key in value) and 'checked' or None, 'name_': widget.dottedpath, 'id': cssid(widget, 'input', key), 'class_': cssclasses(widget, data), } input = tag('input', **attrs) text = tag('span', term) tags.append(tag('div', input, text, **{'id': cssid(widget, 'radio', key)})) attrs = { 'type': 'hidden', 'value': 'exists', 'name_': "%s-exists" % widget.dottedpath, 'id': cssid(widget, 'exists'), } exists_marker = tag('input', **attrs) return exists_marker + u''.join(tags)
def textarea_renderer(widget, data): """Render text area. Properties: ``wrap`` Wrap property of textarea element. ``cols`` Number of characters. ``rows`` Number of lines. ``readonly`` Flag wether textarea is readonly. """ tag = data.tag area_attrs = { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'wrap': widget.attrs['wrap'], 'cols': widget.attrs['cols'], 'rows': widget.attrs['rows'], 'readonly': widget.attrs['readonly'] and 'readonly', 'placeholder': widget.attrs.get('placeholder'), } value = fetch_value(widget, data) if not value: value = '' return tag('textarea', value, **area_attrs)
def input_generic_renderer(widget, data): """Generic HTML ``input`` tag render. Properties: ``type`` Type of this input tag. ``size`` Size of input tag. ``disabled`` Bool evaluating value, if evaluates to True, set disabled="disabled" on input tag. """ tag = data.tag input_attrs = { 'type': widget.attrs['type'], 'value': fetch_value(widget, data), 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'size': widget.attrs.get('size'), 'disabled': bool(widget.attrs.get('disabled')) and 'disabled' or None, 'placeholder': widget.attrs.get('placeholder'), } return tag('input', **input_attrs)
def field_renderer(widget, data): tag = data.tag div_attrs = { 'id': cssid(widget, 'field'), 'class_': cssclasses(widget, data) } if widget.attrs['witherror'] and data.errors: div_attrs['class_'] += u' %s' % widget.attrs['witherror'] return tag('div', data.rendered, **div_attrs)
def select_exists_marker(widget, data): tag = data.tag attrs = { 'type': 'hidden', 'value': 'exists', 'name_': "%s-exists" % widget.dottedpath, 'id': cssid(widget, 'exists'), } return tag('input', **attrs)
def submit_renderer(widget, data): tag = data.tag input_attrs = { 'name': widget.attrs['action'] and 'action.%s' % widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': widget.attrs.get('class'), 'type': 'submit', 'value': widget.attrs.get('label', widget.__name__), } return tag('input', **input_attrs)
def input_file_renderer(widget, data): tag = data.tag input_attrs = { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'type': 'file', 'value': '', } if widget.attrs.get('accept'): input_attrs['accept'] = widget.attrs['accept'] return tag('input', **input_attrs)
def textarea_attributes(widget, data): return { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'wrap': widget.attrs['wrap'], 'cols': widget.attrs['cols'], 'rows': widget.attrs['rows'], 'readonly': widget.attrs['readonly'] and 'readonly', 'placeholder': widget.attrs.get('placeholder') or None, 'autofocus': widget.attrs.get('autofocus') and 'autofocus' or None, 'required': widget.attrs.get('required') and 'required' or None, }
def select_display_renderer(widget, data): value = fetch_value(widget, data) if not widget.attrs['multivalued'] or not value: return generic_display_renderer(widget, data) attrs = { 'id': cssid(widget, 'display'), 'class_': 'display-%s' % widget.attrs['class'] or 'generic' } content = u'' vocab = dict(vocabulary(widget.attrs.get('vocabulary', []))) for key in value: content += data.tag('li', vocab[key]) return data.tag('ul', content, **attrs)
def file_options_renderer(widget, data): if data.value in [None, UNSET, '']: return data.rendered tag = data.tag if data.request: value = [data.request.get('%s-action' % widget.dottedpath, 'keep')] else: value = ['keep'] tags = [] for key, term in vocabulary(widget.attrs.get('vocabulary', [])): attrs = { 'type': 'radio', 'value': key, 'checked': (key in value) and 'checked' or None, 'name_': '%s-action' % widget.dottedpath, 'id': cssid(widget, 'input', key), 'class_': cssclasses(widget, data), } input = tag('input', **attrs) text = tag('span', term) tags.append(tag('div', input, text, **{'id': cssid(widget, 'radio', key)})) return data.rendered + u''.join(tags)
def checkbox_display_renderer(widget, data): """Generic display renderer to render a value. """ value = fetch_value(widget, data) if widget.attrs['format'] == 'string' and bool(value): content = value else: vocab = dict(vocabulary(widget.attrs.get('vocabulary', []))) content = vocab[bool(value)] attrs = { 'id': cssid(widget, 'display'), 'class_': 'display-%s' % widget.attrs['class'] or 'generic' } return data.tag('div', content, **attrs)
def label_renderer(widget, data): tag = data.tag label_text = widget.attrs.get('label', widget.__name__) label_attrs = {'class_': cssclasses(widget, data)} if data.mode == 'edit': for_path = widget.attrs['for'] if for_path: for_widget = widget.root for name in for_path.split('.'): for_widget = for_widget[name] label_attrs['for_'] = cssid(for_widget, 'input') else: label_attrs['for_'] = cssid(widget, 'input') help = u'' if widget.attrs['help']: help_attrs = {'class_': widget.attrs['help_class']} help = tag('div', widget.attrs['help'], **help_attrs) pos = widget.attrs['position'] rendered = data.rendered is not UNSET and data.rendered or u'' if pos == 'inner': return tag('label', label_text, help, rendered, **label_attrs) elif pos == 'after': return rendered + tag('label', label_text, help, **label_attrs) return tag('label', label_text, help, **label_attrs) + rendered
def generic_display_renderer(widget, data): """Generic display renderer to render a value. """ if callable(widget.attrs['template']): content = widget.attrs['template'](widget, data) else: value = fetch_value(widget, data) if value is None: value = u'' content = widget.attrs['template'] % value attrs = { 'id': cssid(widget, 'display'), 'class_': 'display-%s' % widget.attrs['class'] or 'generic' } return data.tag('div', content, **attrs)
def input_file_renderer(widget, data): tag = data.tag input_attrs = { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'type': 'file', 'value': '', 'placeholder': widget.attrs.get('placeholder') or None, 'autofocus': widget.attrs.get('autofocus') and 'autofocus' or None, 'required': widget.attrs.get('required') and 'required' or None, } if widget.attrs.get('accept'): input_attrs['accept'] = widget.attrs['accept'] return tag('input', **input_attrs)
def input_proxy_renderer(widget, data): """Render hidden input ignoring ``widget.dottedpath``, just using widget name. """ tag = data.tag value = data.value if data.request is not UNSET: if data.request.get(widget.__name__): value = data.request.get(widget.__name__) input_attrs = { 'type': 'hidden', 'value': value, 'name_': widget.__name__, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), } return tag('input', **input_attrs)
def label_renderer(widget, data): tag = data.tag label_text = widget.attrs.get('label', widget.__name__) label_attrs = { 'for_': cssid(widget, 'input'), 'class_': cssclasses(widget, data) } help = u'' if widget.attrs['help']: help_attrs = {'class_': widget.attrs['help_class']} help = tag('div', widget.attrs['help'], help_attrs) pos = widget.attrs['position'] if pos == 'inner': return tag('label', label_text, help, data.rendered, **label_attrs) elif pos == 'after': return data.rendered + tag('label', label_text, help, **label_attrs) return tag('label', label_text, help, **label_attrs) + data.rendered
def password_edit_renderer(widget, data): """Render password widget. """ tag = data.tag value = _pwd_value(widget, data) input_attrs = { 'type': 'password', 'value': value, 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'size': widget.attrs.get('size'), 'placeholder': widget.attrs.get('placeholder') or None, 'autofocus': widget.attrs.get('autofocus') and 'autofocus' or None, 'disabled': widget.attrs.get('disabled'), } input_attrs['required'] = \ widget.attrs.get('required') and 'required' or None return tag('input', **input_attrs)
def input_generic_renderer(widget, data): """Generic HTML ``input`` tag render. """ input_attrs = { 'type': widget.attrs['type'], 'value': fetch_value(widget, data), 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'size': widget.attrs.get('size'), 'placeholder': widget.attrs.get('placeholder') or None, 'autofocus': widget.attrs.get('autofocus') and 'autofocus' or None, 'disabled': bool(widget.attrs.get('disabled')) and 'disabled' or None, 'autocomplete': widget.attrs.get('autocomplete'), } input_attrs['required'] = \ widget.attrs.get('required') and 'required' or None if widget.attrs['type'] in ['range', 'number']: input_attrs['min'] = widget.attrs.get('min') or None input_attrs['max'] = widget.attrs.get('min') or None input_attrs['step'] = widget.attrs.get('step') or None return data.tag('input', **input_attrs)
def password_renderer(widget, data): """Render password widget. The password is never rendered to markup, instead ``yafowil.common.PASSWORD_NOCHANGE_VALUE`` is set as ``value`` property on dom element. See ``yafowil.common.password_extractor`` for details on password extraction. Properties: ``size`` Maximum size of password. ``disabled`` Bool evaluating value, if evaluates to True, set disabled="disabled" on password input tag. """ tag = data.tag def pwd_value(widget, data): if data.extracted is not UNSET: return data.extracted if data.value is not UNSET \ and data.value is not None: return PASSWORD_NOCHANGE_VALUE return widget.attrs['default'] value = pwd_value(widget, data) input_attrs = { 'type': 'password', 'value': value, 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'size': widget.attrs.get('size'), 'disabled': widget.attrs.get('disabled'), 'placeholder': widget.attrs.get('placeholder'), } return tag('input', **input_attrs)
def select_edit_renderer(widget, data): tag = data.tag value = fetch_value(widget, data) if isinstance(value, basestring) or not hasattr(value, '__iter__'): value = [value] if not widget.attrs['multivalued'] and len(value) > 1: raise ValueError(u"Multiple values for single selection.") disabled = widget.attrs.get('disabled', False) if widget.attrs['format'] == 'block': optiontags = [] for key, term in vocabulary(widget.attrs.get('vocabulary', [])): attrs = { 'selected': (key in value) and 'selected' or None, 'value': key, 'id': cssid(widget, 'input', key), } if disabled and disabled is not True and key in disabled: attrs['disabled'] = 'disabled' optiontags.append(tag('option', term, **attrs)) select_attrs = { 'name_': widget.dottedpath, 'id': cssid(widget, 'input'), 'class_': cssclasses(widget, data), 'multiple': widget.attrs['multivalued'] and 'multiple' or None, 'placeholder': widget.attrs.get('placeholder') or None, 'autofocus': widget.attrs.get('autofocus') and 'autofocus' or None, 'required': widget.attrs.get('required') and 'required' or None, } if disabled is True: select_attrs['disabled'] = 'disabled' rendered = tag('select', *optiontags, **select_attrs) if widget.attrs['multivalued']: attrs = { 'type': 'hidden', 'value': 'exists', 'name_': "%s-exists" % widget.dottedpath, 'id': cssid(widget, 'exists'), } rendered = select_exists_marker(widget, data) + rendered return rendered else: tags = [] label_pos = widget.attrs['listing_label_position'] listing_tag = widget.attrs['listing_tag'] item_tag = listing_tag == 'div' and 'div' or 'li' if widget.attrs['multivalued']: tagtype = 'checkbox' else: tagtype = 'radio' for key, term in vocabulary(widget.attrs.get('vocabulary', [])): attrs = { 'type': tagtype, 'value': key, 'checked': (key in value) and 'checked' or None, 'name_': widget.dottedpath, 'id': cssid(widget, 'input', key), 'class_': cssclasses(widget, data), } if (disabled and disabled is not True and key in disabled) \ or disabled is True: attrs['disabled'] = 'disabled' input = tag('input', **attrs) if label_pos == 'inner': item = tag('label', term, input, for_=attrs['id']) elif label_pos == 'after': item = input + tag('label', term, for_=attrs['id']) else: item = tag('label', term, for_=attrs['id']) + input tags.append(tag(item_tag, item, **{'id': cssid(widget, tagtype, key)})) return select_exists_marker(widget, data) + \ tag(listing_tag, *tags, **{'id': cssid(widget, tagtype, 'wrapper')})