def applyData(context, form_fields, data, adapters=None): if adapters is None: adapters = {} descriptions = {} for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter name = form_field.__name__ newvalue = data.get(name, form_field) # using form_field as marker if (newvalue is not form_field) and (field.get(adapter) != newvalue): descriptions.setdefault(interface, []).append(field.__name__) field.set(adapter, newvalue) return descriptions
def setup_widgets(self, widgets, session_key, chooser_schema, ignore_request=False): session = zope.session.interfaces.ISession(self.request) template = session[session_key].get('template') if not ignore_request and template: adapters = {} for widget in widgets: field = widget.context name = widget.context.__name__ form_field = self.context.form_fields[name] # Adapt context, if necessary interface = form_field.interface if interface == chooser_schema: value = template else: adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = template else: adapter = interface(template) adapters[interface] = adapter value = field.get(adapter) if value and value != field.default: widget.setRenderedValue(value)
def get_adapter(self, interface): try: adapter = self.adapters[interface] except KeyError: adapter = interface(self.context, None) self.adapters[interface] = adapter return adapter
def applyChanges(context, form_fields, data, adapters=None): if adapters is None: adapters = {} changed = False for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter name = form_field.__name__ newvalue = data.get(name, form_field) # using form_field as marker if (newvalue is not form_field) and (field.get(adapter) != newvalue): changed = True field.set(adapter, newvalue) return changed
def applyChanges(context, form_fields, data, adapters=None): """ apply changes """ if adapters is None: adapters = {} changed = [] for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter name = form_field.__name__ newvalue = data.get(name, form_field) # using form_field as marker if (newvalue is not form_field) and (field.get(adapter) != newvalue): changed.append(name) field.set(adapter, newvalue) return changed
def setUpEditWidgets(form_fields, form_prefix, context, request, adapters=None, for_display=False, ignore_request=False): if adapters is None: adapters = {} widgets = [] for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter if interface is not None: adapters[interface.__name__] = adapter field = field.bind(adapter) readonly = form_field.for_display readonly = readonly or (field.readonly and not form_field.for_input) readonly = readonly or ( (form_field.render_context & interfaces.DISPLAY_UNWRITEABLE) and not canWrite(adapter, field)) readonly = readonly or for_display if readonly: iface = IDisplayWidget else: iface = IInputWidget widget = _createWidget(form_field, field, request, iface) prefix = form_prefix if form_field.prefix: prefix = expandPrefix(prefix) + form_field.prefix widget.setPrefix(prefix) if ignore_request or readonly or not widget.hasInput(): # Get the value to render value = field.get(adapter) widget.setRenderedValue(value) widgets.append((not readonly, widget)) return Widgets(widgets, prefix=form_prefix)
def setUpEditWidgets(form_fields, form_prefix, context, request, adapters=None, for_display=False, ignore_request=False): if adapters is None: adapters = {} widgets = [] for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter if interface is not None: adapters[interface.__name__] = adapter field = field.bind(adapter) readonly = form_field.for_display readonly = readonly or (field.readonly and not form_field.for_input) readonly = readonly or ( (form_field.render_context & interfaces.DISPLAY_UNWRITEABLE) and not canWrite(adapter, field) ) readonly = readonly or for_display if readonly: iface = IDisplayWidget else: iface = IInputWidget widget = _createWidget(form_field, field, request, iface) prefix = form_prefix if form_field.prefix: prefix = expandPrefix(prefix) + form_field.prefix widget.setPrefix(prefix) if ignore_request or readonly or not widget.hasInput(): # Get the value to render value = field.get(adapter) widget.setRenderedValue(value) widgets.append((not readonly, widget)) return Widgets(widgets, prefix=form_prefix)
def apply_data(context, form_fields, data, adapters=None, update=False): """Save form data (``data`` dict) on a ``context`` object. This is a beefed up version of zope.formlib.form.applyChanges(). It allows you to specify whether values should be compared with the attributes on already existing objects or not, using the ``update`` parameter. Unlike zope.formlib.form.applyChanges(), it will return a dictionary of interfaces and their fields that were changed. This is necessary to appropriately send IObjectModifiedEvents. """ if adapters is None: adapters = {} changes = {} for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter name = form_field.__name__ newvalue = data.get(name, form_field) # using form_field as marker if update: if ((newvalue is not form_field) and (field.get(adapter) != newvalue)): field.set(adapter, newvalue) changes.setdefault(interface, []).append(name) else: if newvalue is not form_field: field.set(adapter, newvalue) changes.setdefault(interface, []).append(name) return changes
def apply_data(context, form_fields, data, adapters=None, update=False): """Save form data (``data`` dict) on a ``context`` object. This is a beefed up version of zope.formlib.form.applyChanges(). It allows you to specify whether values should be compared with the attributes on already existing objects or not, using the ``update`` parameter. Unlike zope.formlib.form.applyChanges(), it will return a dictionary of interfaces and their fields that were changed. This is necessary to appropriately send IObjectModifiedEvents. """ if adapters is None: adapters = {} changes = {} for form_field in form_fields: field = form_field.field # Adapt context, if necessary interface = field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter name = form_field.__name__ newvalue = data.get(name, form_field) # using form_field as marker if update: if ((newvalue is not form_field) and (field.get(adapter) != newvalue)): field.set(adapter, newvalue) changes.setdefault(interface, []).append(name) else: if newvalue is not form_field: field.set(adapter, newvalue) changes.setdefault(interface, []).append(name) return changes
def setUpWidgets(form_fields, form_prefix=None, context=None, request=None, form=None, data=(), adapters=None, ignore_request=False): if request is None: request = form.request if context is None and form is not None: context = form.context if form_prefix is None: form_prefix = form.prefix widgets = [] adapter = None for form_field in form_fields: field = form_field.field if form_field.render_context: if adapters is None: adapters = {} # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter if interface is not None: adapters[interface.__name__] = adapter field = field.bind(adapter) else: field = field.bind(context) readonly = form_field.for_display readonly = readonly or (field.readonly and not form_field.for_input) readonly = readonly or ( (form_field.render_context & interfaces.DISPLAY_UNWRITEABLE) and not canWrite(adapter, field) ) if form_field.custom_widget is not None: widget = form_field.custom_widget(field, request) else: if readonly: widget = component.getMultiAdapter((field, request), IDisplayWidget) else: widget = component.getMultiAdapter((field, request), IInputWidget) prefix = form_prefix if form_field.prefix: prefix = expandPrefix(prefix) + form_field.prefix widget.setPrefix(prefix) if ignore_request or readonly or not widget.hasInput(): # Get the value to render if form_field.__name__ in data: widget.setRenderedValue(data[form_field.__name__]) elif form_field.get_rendered is not None: widget.setRenderedValue(form_field.get_rendered(form)) elif form_field.render_context: widget.setRenderedValue(field.get(adapter)) else: widget.setRenderedValue(field.default) widgets.append((not readonly, widget)) return Widgets(widgets, prefix=form_prefix)
def setUpWidgets(form_fields, form_prefix=None, context=None, request=None, form=None, data=(), adapters=None, ignore_request=False): """Sets up widgets.""" if request is None: request = form.request if context is None and form is not None: context = form.context if form_prefix is None: form_prefix = form.prefix widgets = [] adapter = None for form_field in form_fields: field = form_field.field if form_field.render_context: if adapters is None: adapters = {} # Adapt context, if necessary interface = form_field.interface adapter = adapters.get(interface) if adapter is None: if interface is None: adapter = context else: adapter = interface(context) adapters[interface] = adapter if interface is not None: adapters[interface.__name__] = adapter field = field.bind(adapter) else: field = field.bind(context) readonly = form_field.for_display readonly = readonly or (field.readonly and not form_field.for_input) readonly = readonly or ( (form_field.render_context & interfaces.DISPLAY_UNWRITEABLE) and not canWrite(adapter, field)) if form_field.custom_widget is not None: widget = form_field.custom_widget(field, request) else: if readonly: widget = component.getMultiAdapter((field, request), IDisplayWidget) else: widget = component.getMultiAdapter((field, request), IInputWidget) prefix = form_prefix if form_field.prefix: prefix = expandPrefix(prefix) + form_field.prefix widget.setPrefix(prefix) if ignore_request or readonly or not widget.hasInput(): # Get the value to render if form_field.__name__ in data: widget.setRenderedValue(data[form_field.__name__]) elif form_field.get_rendered is not None: widget.setRenderedValue(form_field.get_rendered(form)) elif form_field.render_context: widget.setRenderedValue(field.get(adapter)) else: widget.setRenderedValue(field.default) widgets.append((not readonly, widget)) return Widgets(widgets, prefix=form_prefix)