def __call__(self): """Render the current value """ if self._renderedValueSet(): value = self._data else: value = self.context.default if value == self.context.missing_value: value = self._translate( _("SourceDisplayWidget-missing", default="Nothing")) else: terms = getMultiAdapter((self.source, self.request), zope.browser.interfaces.ITerms) try: term = terms.getTerm(value) except LookupError: value = self._translate( _("SourceDisplayWidget-invalid", default="Invalid value")) else: value = self.renderTermForDisplay(term) return value
def __call__(self): """Render the current value """ if self._renderedValueSet(): value = self._data else: value = self.context.default if value == self.context.missing_value: value = self._translate(_("SourceDisplayWidget-missing", default="Nothing")) else: terms = getMultiAdapter((self.source, self.request), zope.browser.interfaces.ITerms) try: term = terms.getTerm(value) except LookupError: value = self._translate(_("SourceDisplayWidget-invalid", default="Invalid value")) else: value = self.renderTermForDisplay(term) return value
def __call__(self): result = ['<div class="value">'] value = self._value() field = self.context term = None if value == field.missing_value: result.append(' <div class="row">') result.append(' <div class="label">') result.append(u' ' + self._translate( _("SourceDisplayWidget-label", default="Selected"))) result.append(' </div>') result.append(' <div class="field">') result.append(u' ' + self._translate( _("SourceDisplayWidget-missing", default="Nothing"))) result.append(' </div>') result.append(' </div>') else: try: term = self.terms.getTerm(value) except LookupError: result.append(u' ' + self._translate( _("SourceDisplayWidget-missing", default="Nothing Valid"))) else: result.append(' <div class="row">') result.append(' <div class="label">') result.append(u' ' + self._translate( _("SourceDisplayWidget-label", default="Selected"))) result.append(' </div>') result.append(' <div class="field">') result.append(u' ' + self.renderTermForDisplay(term)) result.append(' </div>') result.append(' </div>') result.append( ' <input type="hidden" name="%s" value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token))) result.append( ' <input type="hidden" name="%s.displayed" value="y" />' % self.name) result.append(' <div class="queries">') for name, queryview in self.queryviews: result.append(' <div class="query">') result.append(' <div class="queryinput">') result.append(queryview.render(name)) result.append(' </div> <!-- queryinput -->') qresults = queryview.results(name) if qresults: result.append(' <div class="queryresults">\n%s' % self._renderResults(qresults, name)) result.append(' </div> <!-- queryresults -->') result.append(' </div> <!-- query -->') result.append(' </div> <!-- queries -->') result.append('</div> <!-- value -->') return '\n'.join(result)
class SequenceDisplayWidget(DisplayWidget): _missingValueMessage = _("sequence-value-not-provided", u"(no value available)") _emptySequenceMessage = _("sequence-value-is-empty", u"(no values)") tag = "ol" itemTag = "li" cssClass = "sequenceWidget" extra = "" def __init__(self, context, field, request, subwidget=None): super(SequenceDisplayWidget, self).__init__(context, request) self.subwidget = subwidget def __call__(self): # get the data to display: if self._renderedValueSet(): data = self._data else: data = self.context.get(self.context.context) # deal with special cases: if data == self.context.missing_value: return translate(self._missingValueMessage, self.request) data = list(data) if not data: return translate(self._emptySequenceMessage, self.request) parts = [] for i, item in enumerate(data): widget = self._getWidget(i) widget.setRenderedValue(item) s = widget() if self.itemTag: s = "<%s>%s</%s>" % (self.itemTag, s, self.itemTag) parts.append(s) contents = "\n".join(parts) if self.tag: contents = "\n%s\n" % contents contents = renderElement(self.tag, cssClass=self.cssClass, extra=self.extra, contents=contents) return contents def _getWidget(self, i): field = self.context.value_type if self.subwidget is not None: widget = self.subwidget(field, self.request) else: widget = component.getMultiAdapter( (field, self.request), IDisplayWidget) widget.setPrefix('%s.%d.' % (self.name, i)) return widget
def handle_edit_action(self, action, data): if form.applyChanges(self.context, self.form_fields, data, self.adapters): zope.event.notify( zope.lifecycleevent.ObjectModifiedEvent(self.context)) # TODO: Needs locale support. See also Five.form.EditView. self.status = _("Updated on ${date_time}", mapping={'date_time': str(datetime.utcnow())}) else: self.status = _('No changes')
class BooleanDisplayWidget(DisplayWidget): _msg_true = _("True") _msg_false = _("False") def __call__(self): if self._renderedValueSet(): value = self._data else: value = self.context.default if value: return self._msg_true else: return self._msg_false
def addButtonLabel(self): button_label = _('Add %s') button_label = translate(button_label, context=self.request, default=button_label) title = self.context.title or self.context.__name__ title = translate(title, context=self.request, default=title) return button_label % title
def _toFieldValue(self, input): value = super(Bytes, self)._toFieldValue(input) if type(value) is unicode: try: value = value.encode('ascii') except UnicodeError, v: raise ConversionError(_("Invalid textual data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return int(input) except ValueError as v: raise ConversionError(_("Invalid integer data"), v)
def _toFieldValue(self, input): value = super(Bytes, self)._toFieldValue(input) if isinstance(value, unicode): try: value = value.encode('ascii') except UnicodeError as v: raise ConversionError(_("Invalid textual data"), v) return value
def _toFieldValue(self, input): if input is None or input == '': return self.context.missing_value try: seek = input.seek read = input.read except AttributeError, e: raise ConversionError(_('Form input is not a file object'), e)
def _toFieldValue(self, input): if input: try: return self.convertTokensToValues([input])[0] except (InvalidValue, TypeError) as e: raise ConversionError(_("Invalid value"), e) else: return self.context.missing_value
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return int(input) except ValueError, v: raise ConversionError(_("Invalid integer data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return decimal.Decimal(input) except decimal.InvalidOperation, v: raise ConversionError(_("Invalid decimal data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return decimal.Decimal(input) except decimal.InvalidOperation as v: raise ConversionError(_("Invalid decimal data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return float(input) except ValueError as v: raise ConversionError(_("Invalid floating point data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: return float(input) except ValueError, v: raise ConversionError(_("Invalid floating point data"), v)
def _toFieldValue(self, value): value = super(TextAreaWidget, self)._toFieldValue(value) if value: try: value = unicode(value) except ValueError, v: raise ConversionError(_("Invalid unicode data"), v) else: value = value.replace("\r\n", "\n")
def _toFieldValue(self, input): """See SimpleInputWidget""" if input is None: input = [] elif not isinstance(input, list): input = [input] try: values = self.convertTokensToValues(input) except InvalidValue, e: raise ConversionError(_("Invalid value"), e)
def handle_edit_action(self, action, data): if applyChanges(self.context, self.form_fields, data, self.adapters): zope.event.notify( zope.app.event.objectevent.ObjectModifiedEvent(self.context)) formatter = self.request.locale.dates.getFormatter( 'dateTime', 'medium') try: time_zone = idatetime.ITZInfo(self.request) except TypeError: time_zone = pytz.UTC status = _("Updated on ${date_time}", mapping={ 'date_time': formatter.format(datetime.datetime.now(time_zone)) }) self.status = status else: self.status = _('No changes')
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: formatter = self.request.locale.dates.getFormatter( self._category, (self.displayStyle or None)) return formatter.parse(input) except (DateTimeParseError, ValueError) as v: raise ConversionError(_("Invalid datetime data"), "%s (%r)" % (v, input))
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: formatter = self.request.locale.dates.getFormatter( self._category, (self.displayStyle or None)) return formatter.parse(input) except (DateTimeParseError, ValueError), v: raise ConversionError(_("Invalid datetime data"), "%s (%r)" % (v, input))
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: # TODO: Currently datetimes return in local (server) # time zone if no time zone information was given. # Maybe offset-naive datetimes should be returned in # this case? (DV) return parseDatetimetz(input) except (DateTimeError, ValueError, IndexError), v: raise ConversionError(_("Invalid datetime data"), v)
def _toFieldValue(self, input): if input == self._missing: return self.context.missing_value else: try: # TODO: Currently datetimes return in local (server) # time zone if no time zone information was given. # Maybe offset-naive datetimes should be returned in # this case? (DV) return parseDatetimetz(input) except (DateTimeError, ValueError, IndexError) as v: raise ConversionError(_("Invalid datetime data"), v)
def _toFieldValue(self, input): if self.convert_missing_value and input == self._missing: value = self.context.missing_value else: # We convert everything to unicode. This might seem a bit crude, # but anything contained in a TextWidget should be representable # as a string. Note that you always have the choice of overriding # the method. try: value = unicode(input) except ValueError, v: raise ConversionError(_("Invalid text data"), v)
def handle_edit_action(self, action, data): if applyChanges(self.context, self.form_fields, data, self.adapters): zope.event.notify( zope.app.event.objectevent.ObjectModifiedEvent(self.context)) formatter = self.request.locale.dates.getFormatter( 'dateTime', 'medium') try: time_zone = idatetime.ITZInfo(self.request) except TypeError: time_zone = pytz.UTC status = _("Updated on ${date_time}", mapping={'date_time': formatter.format( datetime.datetime.now(time_zone) ) } ) self.status = status else: self.status = _('No changes')
def __call__(self): result = ['<div class="value">'] value = self._value() if value: for v in value: try: term = self.terms.getTerm(v) except LookupError: continue # skip else: result.append( ' <input type="checkbox" name="%s.checked:list"' ' value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token)) ) result.append(' ' + self.renderTermForDisplay(term)) result.append( ' <input type="hidden" name="%s:list" value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token))) result.append(' <br />') result.append( ' <input type="submit" name="%s.remove" value="%s" />' % (self.name, self._translate(_("MultipleSourceInputWidget-remove", default="Remove"))) ) result.append(' <br />') result.append(' <input type="hidden" name="%s.displayed" value="y" />' % self.name) result.append(' <div class="queries">') for name, queryview in self.queryviews: result.append(' <div class="query">') result.append(' <div class="queryinput">') result.append(queryview.render(name)) result.append(' </div> <!-- queryinput -->') qresults = queryview.results(name) if qresults: result.append(' <div class="queryresults">\n%s' % self._renderResults(qresults, name)) result.append(' </div> <!-- queryresults -->') result.append(' </div> <!-- query -->') result.append(' </div> <!-- queries -->') result.append('</div> <!-- value -->') return '\n'.join(result)
def __call__(self): result = ['<div class="value">'] value = self._value() if value: for v in value: try: term = self.terms.getTerm(v) except LookupError: continue # skip else: result.append( ' <input type="checkbox" name="%s.checked:list"' ' value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token))) result.append(' ' + self.renderTermForDisplay(term)) result.append( ' <input type="hidden" name="%s:list" value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token))) result.append(' <br />') result.append( ' <input type="submit" name="%s.remove" value="%s" />' % (self.name, self._translate( _("MultipleSourceInputWidget-remove", default="Remove")))) result.append(' <br />') result.append( ' <input type="hidden" name="%s.displayed" value="y" />' % self.name) result.append(' <div class="queries">') for name, queryview in self.queryviews: result.append(' <div class="query">') result.append(' <div class="queryinput">') result.append(queryview.render(name)) result.append(' </div> <!-- queryinput -->') qresults = queryview.results(name) if qresults: result.append(' <div class="queryresults">\n%s' % self._renderResults(qresults, name)) result.append(' </div> <!-- queryresults -->') result.append(' </div> <!-- query -->') result.append(' </div> <!-- queries -->') result.append('</div> <!-- value -->') return '\n'.join(result)
def _renderResults(self, results, name): terms = [] apply = self._translate( _("SourceListInputWidget-apply", default="Apply")) for value in results: term = self.terms.getTerm(value) terms.append((self._translate(term.title), term.token)) terms.sort() return ('<select name="%s.selection:list" multiple>\n' '%s\n' '</select>\n' '<input type="submit" name="%s.apply" value="%s" />' % (name, '\n'.join([('<option value="%s">%s</option>' % (token, title)) for (title, token) in terms]), name, apply))
def _toFieldValue(self, input): if input is None or input == '': return self.context.missing_value try: seek = input.seek read = input.read except AttributeError as e: raise ConversionError(_('Form input is not a file object'), e) else: seek(0) data = read() if data or getattr(input, 'filename', ''): return data else: return self.context.missing_value
class ItemDisplayWidget(SingleDataHelper, ItemsWidgetBase): """Simple single-selection display that can be used in many cases.""" def __init__(self, *args, **kw): ItemsWidgetBase.__init__(self, *args, **kw) self.required = False _messageNoValue = _("item-missing-single-value-for-display", "") def __call__(self): """See IBrowserWidget.""" value = self._getFormValue() if value is None or value == u'': return self.translate(self._messageNoValue) else: term = self.vocabulary.getTerm(value) return self.textForValue(term)
class EditFormBase(FiveFormlibMixin, form.EditFormBase): # Overrides formlib.form.EditFormBase.handle_edit_action, to remove # dependecy on request.locale @form.action(_("Apply"), condition=form.haveInputWidgets) def handle_edit_action(self, action, data): if form.applyChanges(self.context, self.form_fields, data, self.adapters): zope.event.notify( zope.lifecycleevent.ObjectModifiedEvent(self.context)) # TODO: Needs locale support. See also Five.form.EditView. self.status = _("Updated on ${date_time}", mapping={'date_time': str(datetime.utcnow())}) else: self.status = _('No changes')
class SelectWidget(ItemsEditWidgetBase): """Provide a selection list for the item.""" _messageNoValue = _("vocabulary-missing-single-value-for-edit", "(nothing selected)") def renderValue(self, value): rendered_items = self.renderItems(value) contents = "\n%s\n" %"\n".join(rendered_items) return renderElement('select', name=self.name, id=self.name, contents=contents, size=self.size, extra=self.extra) def renderItems(self, value): return self.renderItemsWithValues([value])
def _renderResults(self, results, name): terms = [] apply = self._translate(_("SourceListInputWidget-apply", default="Apply")) for value in results: term = self.terms.getTerm(value) terms.append((self._translate(term.title), term.token)) terms.sort() return ( '<select name="%s.selection:list" multiple>\n' '%s\n' '</select>\n' '<input type="submit" name="%s.apply" value="%s" />' % (name, '\n'.join([('<option value="%s">%s</option>' % (token, title)) for (title, token) in terms]), name, apply) )
class RadioWidget(SelectWidget): """Radio widget for single item choices. This widget can be used when the number of selections is going to be small. """ orientation = "vertical" _messageNoValue = _("vocabulary-missing-single-value-for-edit", "(nothing selected)") def renderItem(self, index, text, value, name, cssClass): """Render an item of the list.""" return self._renderItem(index, text, value, name, cssClass) def renderSelectedItem(self, index, text, value, name, cssClass): """Render a selected item of the list.""" return self._renderItem(index, text, value, name, cssClass, checked=True) def _renderItem(self, index, text, value, name, cssClass, checked=False): kw = {} if checked: kw['checked'] = 'checked' id = '%s.%s' % (name, index) elem = renderElement(u'input', value=value, name=name, id=id, cssClass=cssClass, type='radio', **kw) return renderElement(u'label', contents='%s %s' % (elem, text), **{'for': id}) def renderValue(self, value): rendered_items = self.renderItems(value) if self.orientation == 'horizontal': return " ".join(rendered_items) else: return "<br />".join(rendered_items)
def _toFieldValue(self, input): """See SimpleInputWidget""" if input is None: input = [] elif not isinstance(input, list): input = [input] try: values = self.convertTokensToValues(input) except InvalidValue as e: raise ConversionError(_("Invalid value"), e) # All AbstractCollection fields have a `_type` attribute specifying # the type of collection. Use it to generate the correct type, # otherwise return a list. TODO: this breaks encapsulation. if hasattr(self.context, '_type'): _type = self.context._type if isinstance(_type, tuple): _type = _type[0] return _type(values) else: return values
def __call__(self): if self._renderedValueSet(): seq = self._data else: seq = self.context.default terms = getMultiAdapter((self.source, self.request), zope.browser.interfaces.ITerms) result = [] for value in seq: try: term = terms.getTerm(value) except LookupError: value = self._translate( _("SourceDisplayWidget-invalid", default="Invalid value")) else: value = self.renderTermForDisplay(term) result.append(value) return '<br />\n'.join(result)
def __call__(self): if self._renderedValueSet(): seq = self._data else: seq = self.context.default terms = getMultiAdapter((self.source, self.request), zope.browser.interfaces.ITerms) result = [] for value in seq: try: term = terms.getTerm(value) except LookupError: value = self._translate(_("SourceDisplayWidget-invalid", default="Invalid value")) else: value = self.renderTermForDisplay(term) result.append(value) return '<br />\n'.join(result)
class ItemsMultiDisplayWidget(MultiDataHelper, ItemsWidgetBase): """Displays a sequence of items.""" def __init__(self, *args, **kw): ItemsWidgetBase.__init__(self, *args, **kw) self.required = False _messageNoValue = _("vocabulary-missing-multiple-value-for-display", "") itemTag = 'li' tag = 'ol' def __call__(self): """See IBrowserWidget.""" value = self._getFormValue() if value: rendered_items = self.renderItems(value) return renderElement(self.tag, id=self.name, cssClass=self.cssClass, contents="\n".join(rendered_items), extra=self.extra) else: return self.translate(self._messageNoValue) def renderItems(self, value): """Render items of sequence.""" items = [] cssClass = self.cssClass or '' if cssClass: cssClass += "-item" tag = self.itemTag for item in value: term = self.vocabulary.getTerm(item) items.append(renderElement( tag, cssClass=cssClass, contents=escape(self.textForValue(term)))) return items
class ItemsMultiEditWidgetBase(MultiDataHelper, ItemsEditWidgetBase): """Items widget supporting multiple selections.""" _messageNoValue = _("vocabulary-missing-multiple-value-for-edit", "(nothing selected)") _displayItemForMissingValue = False def renderItems(self, value): if value == self.context.missing_value: values = [] else: values = list(value) return self.renderItemsWithValues(values) def renderValue(self, value): # All we really add here is the ':list' in the name argument # and mutliple='multiple' to renderElement(). rendered_items = self.renderItems(value) return renderElement(self.tag, name=self.name + ':list', id=self.name, multiple='multiple', size=self.size, contents="\n".join(rendered_items), extra=self.extra) def hidden(self): items = [] for item in self._getFormValue(): items.append( renderElement(u'input', type='hidden', name=self.name+':list', id=self.name, value=self.vocabulary.getTerm(item).token, cssClass=self.cssClass, extra=self.extra)) return '\n'.join(items)
def update(self): self.setUpWidgets() self.form_reset = False data = {} errors, action = handleSubmit(self.actions, data, self.validate) # the following part will make sure that previous error not # get overriden by new errors. This is usefull for subforms. (ri) if self.errors is None: self.errors = errors else: if errors is not None: self.errors += tuple(errors) if errors: self.status = _('There were errors') result = action.failure(data, errors) elif errors is not None: self.form_reset = True result = action.success(data) else: result = None self.form_result = result
def BooleanSelectWidget(field, request, true=_('on'), false=_('off')): vocabulary = SimpleVocabulary.fromItems( ((true, True), (false, False)) ) widget = SelectWidget(field, vocabulary, request) widget.size = 2 widget.required = False return widget def BooleanDropdownWidget(field, request, true=_('on'), false=_('off')): vocabulary = SimpleVocabulary.fromItems( ((true, True), (false, False)) ) widget = DropdownWidget(field, vocabulary, request) widget.required = False return widget _msg_true = _("True") _msg_false = _("False") class BooleanDisplayWidget(DisplayWidget): def __call__(self): if self._renderedValueSet(): value = self._data else: value = self.context.default if value: return _msg_true else: return _msg_false
def __call__(self): result = ['<div class="value">'] value = self._value() field = self.context term = None if value == field.missing_value: result.append(' <div class="row">') result.append(' <div class="label">') result.append(u' ' + self._translate(_("SourceDisplayWidget-label", default="Selected")) ) result.append(' </div>') result.append(' <div class="field">') result.append(u' ' + self._translate(_("SourceDisplayWidget-missing", default="Nothing")) ) result.append(' </div>') result.append(' </div>') else: try: term = self.terms.getTerm(value) except LookupError: result.append(u' ' + self._translate(_("SourceDisplayWidget-missing", default="Nothing Valid")) ) else: result.append(' <div class="row">') result.append(' <div class="label">') result.append(u' ' + self._translate(_("SourceDisplayWidget-label", default="Selected")) ) result.append(' </div>') result.append(' <div class="field">') result.append(u' ' + self.renderTermForDisplay(term)) result.append(' </div>') result.append(' </div>') result.append( ' <input type="hidden" name="%s" value=%s />' % (self.name, xml.sax.saxutils.quoteattr(term.token))) result.append(' <input type="hidden" name="%s.displayed" value="y" />' % self.name) result.append(' <div class="queries">') for name, queryview in self.queryviews: result.append(' <div class="query">') result.append(' <div class="queryinput">') result.append(queryview.render(name)) result.append(' </div> <!-- queryinput -->') qresults = queryview.results(name) if qresults: result.append(' <div class="queryresults">\n%s' % self._renderResults(qresults, name)) result.append(' </div> <!-- queryresults -->') result.append(' </div> <!-- query -->') result.append(' </div> <!-- queries -->') result.append('</div> <!-- value -->') return '\n'.join(result)
def BooleanRadioWidget(field, request, true=_('on'), false=_('off')): vocabulary = SimpleVocabulary.fromItems( ((true, True), (false, False)) ) widget = RadioWidget(field, vocabulary, request) widget.required = False return widget
def _toFieldValue(self, input): if input: try: return self.convertTokensToValues([input])[0] except InvalidValue, e: raise ConversionError(_("Invalid value"), e)