def _validate_vocabulary_name(self, schema, field, vocabulary_name):
     if not vocabulary_name:
         return True
     if (
         vocabulary_name != getattr(field, 'vocabulary', None) and
         vocabulary_name != getattr(field, 'vocabularyName', None)
     ):
         # Determine the widget to check for vocabulary there
         widgets = mergedTaggedValueDict(schema, WIDGETS_KEY)
         widget = widgets.get(field.getName())
         if widget:
             if isinstance(widget, six.string_types):
                 widget = resolveDottedName(widget)
             if widget:
                 widget = widget(field, self._request)
         else:
             # default widget
             widget = queryMultiAdapter(
                 (field, self._request),
                 IFieldWidget
             )
         if widget:
             widget.update()
         if getattr(widget, 'vocabulary', None) != vocabulary_name:
             return False
     return True
Beispiel #2
0
 def __call__(self, field, request):
     __traceback_info__ = (
         '{0}, processing:\n'
         '- field "{1}"\n'
         '- widget: {2}\n'
         '- params: {3}\n'.format(
             self.__class__.__name__,
             field.__name__,
             repr(self.widget_factory),
             self.params
         )
     )
     if isinstance(self.widget_factory, six.string_types):
         __traceback_info__ += '- resolving dotted name\n'
         self.widget_factory = resolveDottedName(self.widget_factory)
     if self.widget_factory is None:
         # use default widget factory for this field type
         __traceback_info__ += '- using default widget factory\n'
         widget = getMultiAdapter((field, request), IFieldWidget)
     elif IWidget.implementedBy(self.widget_factory):
         __traceback_info__ += '- calling factory, then wrapping with ' \
                               'FieldWidget\n'
         widget = FieldWidget(field, self.widget_factory(request))
     elif IFieldWidget.implementedBy(self.widget_factory):
         __traceback_info__ += '- calling factory\n'
         widget = self.widget_factory(field, request)
     for k, v in self.params.items():
         setattr(widget, k, v)
     return widget
Beispiel #3
0
 def _validate_vocabulary_name(self, schema, field, vocabulary_name):
     if not vocabulary_name:
         return True
     if (
         vocabulary_name != getattr(field, 'vocabulary', None) and
         vocabulary_name != getattr(field, 'vocabularyName', None)
     ):
         # Determine the widget to check for vocabulary there
         widgets = mergedTaggedValueDict(schema, WIDGETS_KEY)
         widget = widgets.get(field.getName())
         if widget:
             if isinstance(widget, six.string_types):
                 widget = resolveDottedName(widget)
             if widget:
                 widget = widget(field, self._request)
         else:
             # default widget
             widget = queryMultiAdapter(
                 (field, self._request),
                 IFieldWidget
             )
         if widget:
             widget.update()
         if getattr(widget, 'vocabulary', None) != vocabulary_name:
             return False
     return True
Beispiel #4
0
 def _add(self, schema, key, name, value, expected=None):
     if expected is not None:
         obj = resolveDottedName(value)
         if not expected.implementedBy(obj):
             raise ValueError("%s not implemented by %s"
                 % (expected.__identifier__, value))
     tagged_value = schema.queryTaggedValue(key, {})
     tagged_value[name] = value
     schema.setTaggedValue(key, tagged_value)
 def updateWidgets(self):
     widgets = mergedTaggedValueDict(self.schema, WIDGETS_KEY)
     if self.field in widgets:
         factory = widgets[self.field]
         if self.fields[self.field].widgetFactory.get(
                     self.mode, None) is None:
             if isinstance(factory, basestring):
                 factory = resolveDottedName(factory)
             self.fields[self.field].widgetFactory = factory
     DisplayForm.updateWidgets(self)
Beispiel #6
0
 def _add_validator(self, field, value):
     validator = resolveDottedName(value)
     if not IValidator.implementedBy(validator):
         raise ValueError(
             "z3c.form.interfaces.IValidator not implemented by %s."
             % value)
     provideAdapter(validator,
         (None, None, None, getSpecification(field), None),
         IValidator,
         )
Beispiel #7
0
 def _add_validator(self, field, value):
     validator = resolveDottedName(value)
     if not IValidator.implementedBy(validator):
         msg = 'z3c.form.interfaces.IValidator not implemented by {0}.'
         raise ValueError(msg.format(value))
     provideAdapter(
         validator,
         (None, None, None, getSpecification(field), None),
         IValidator,
     )
Beispiel #8
0
    def read(self, fieldNode, schema, field):
        name = field.__name__

        widgetAttr = fieldNode.get(ns('widget', self.namespace))
        mode = fieldNode.get(ns('mode', self.namespace))
        omitted = fieldNode.get(ns('omitted', self.namespace))
        before = fieldNode.get(ns('before', self.namespace))
        after = fieldNode.get(ns('after', self.namespace))
        validator = fieldNode.get(ns('validator', self.namespace))

        if mode:
            self._add_interface_values(schema, MODES_KEY, name, mode)
        if omitted:
            self._add_interface_values(schema, OMITTED_KEY, name, omitted)
        if before:
            self._add_order(schema, name, 'before', before)
        if after:
            self._add_order(schema, name, 'after', after)
        if validator:
            self._add_validator(field, validator)

        widgetNode = fieldNode.find(ns('widget', self.namespace))
        widget = None
        if widgetNode is not None:  # form:widget element
            widgetFactory = widgetNode.get('type')
            if widgetFactory is not None:
                # resolve immediately so we don't have to each time
                # form is rendered
                widgetFactory = resolveDottedName(widgetFactory)
            widget = ParameterizedWidget(widgetFactory)
            widgetHandler = widget.getExportImportHandler(field)
            widgetHandler.read(widgetNode, widget.params)
        elif widgetAttr is not None:  # BBB for old form:widget attributes
            obj = resolveDottedName(widgetAttr)
            if not IFieldWidget.implementedBy(obj):
                raise ValueError(
                    'IFieldWidget not implemented by {0}'.format(obj)
                )
            widget = widgetAttr
        if widget is not None:
            self._add(schema, WIDGETS_KEY, name, widget)
Beispiel #9
0
    def read(self, fieldNode, schema, field):
        name = field.__name__

        widgetAttr = fieldNode.get(ns('widget', self.namespace))
        mode = fieldNode.get(ns('mode', self.namespace))
        omitted = fieldNode.get(ns('omitted', self.namespace))
        before = fieldNode.get(ns('before', self.namespace))
        after = fieldNode.get(ns('after', self.namespace))
        validator = fieldNode.get(ns('validator', self.namespace))

        if mode:
            self._add_interface_values(schema, MODES_KEY, name, mode)
        if omitted:
            self._add_interface_values(schema, OMITTED_KEY, name, omitted)
        if before:
            self._add_order(schema, name, 'before', before)
        if after:
            self._add_order(schema, name, 'after', after)
        if validator:
            self._add_validator(field, validator)

        widgetNode = fieldNode.find(ns('widget', self.namespace))
        widget = None
        if widgetNode is not None:  # form:widget element
            widgetFactory = widgetNode.get('type')
            if widgetFactory is not None:
                # resolve immediately so we don't have to each time
                # form is rendered
                widgetFactory = resolveDottedName(widgetFactory)
            widget = ParameterizedWidget(widgetFactory)
            widgetHandler = widget.getExportImportHandler(field)
            widgetHandler.read(widgetNode, widget.params)
        elif widgetAttr is not None:  # BBB for old form:widget attributes
            obj = resolveDottedName(widgetAttr)
            if not IFieldWidget.implementedBy(obj):
                raise ValueError(
                    'IFieldWidget not implemented by {0}'.format(obj))
            widget = widgetAttr
        if widget is not None:
            self._add(schema, WIDGETS_KEY, name, widget)
Beispiel #10
0
 def _add_interface_values(self, schema, key, name, values):
     tagged_value = schema.queryTaggedValue(key, [])
     values = values.split(" ")
     for value in values:
         if ":" in value:
             (interface_dotted_name, value) = value.split(":")
             interface = resolveDottedName(interface_dotted_name)
             if not isinstance(interface, InterfaceClass):
                 raise ValueError("%s not an Interface." % interface_dotted_name)
         else:
             interface = Interface
         tagged_value.append((interface, name, value))
     schema.setTaggedValue(key, tagged_value)
Beispiel #11
0
    def __call__(self, field, request):
        if isinstance(self.widget_factory, basestring):
            self.widget_factory = resolveDottedName(self.widget_factory)

        if self.widget_factory is None:
            # use default widget factory for this field type
            widget = getMultiAdapter((field, request), IFieldWidget)
        elif IWidget.implementedBy(self.widget_factory):
            widget = FieldWidget(field, self.widget_factory(request))
        elif IFieldWidget.implementedBy(self.widget_factory):
            widget = self.widget_factory(field, request)
        for k, v in self.params.items():
            setattr(widget, k, v)
        return widget
Beispiel #12
0
    def __call__(self, field, request):
        if isinstance(self.widget_factory, basestring):
            self.widget_factory = resolveDottedName(self.widget_factory)

        if self.widget_factory is None:
            # use default widget factory for this field type
            widget = getMultiAdapter((field, request), IFieldWidget)
        elif IWidget.implementedBy(self.widget_factory):
            widget = FieldWidget(field, self.widget_factory(request))
        elif IFieldWidget.implementedBy(self.widget_factory):
            widget = self.widget_factory(field, request)
        for k, v in self.params.items():
            setattr(widget, k, v)
        return widget
Beispiel #13
0
 def _add_interface_values(self, schema, key, name, values):
     tagged_value = schema.queryTaggedValue(key, [])
     values = values.split(' ')
     for value in values:
         if ':' in value:
             (interface_dotted_name, value) = value.split(':')
             interface = resolveDottedName(interface_dotted_name)
             if not isinstance(interface, InterfaceClass):
                 raise ValueError(
                     "%s not an Interface." % interface_dotted_name)
         else:
             interface = Interface
         tagged_value.append((interface, name, value))
     schema.setTaggedValue(key, tagged_value)
Beispiel #14
0
    def validate(self, field_name, vocabulary_name=None):
        context = self.context
        checker = getSecurityManager().checkPermission
        schemata = self._get_schemata()
        for schema in schemata:
            if field_name in schema:
                # If a vocabulary name was specified and it does not
                # match the vocabulary name for the field or widget,
                # fail.
                field = schema[field_name]
                if vocabulary_name and (
                        vocabulary_name != getattr(field, 'vocabulary', None)
                        and vocabulary_name != getattr(field, 'vocabularyName',
                                                       None)):
                    # Determine the widget to check for vocabulary there
                    widgets = mergedTaggedValueDict(schema, WIDGETS_KEY)
                    widget = widgets.get(field_name)
                    if widget:
                        widget = (isinstance(widget, basestring)
                                  and resolveDottedName(widget) or widget)
                        widget = widget and widget(field, self._request)
                    else:
                        widget = queryMultiAdapter((field, self._request),
                                                   IFieldWidget)
                    if widget:
                        widget.update()
                    if getattr(widget, 'vocabulary', None) != vocabulary_name:
                        return False
                # Create mapping of all schema permissions
                permissions = mergedTaggedValueDict(schema,
                                                    WRITE_PERMISSIONS_KEY)
                permission_name = permissions.get(field_name, None)
                if permission_name is not None:
                    permission = queryUtility(IPermission,
                                              name=permission_name)
                    if permission:
                        return checker(permission.title, context)

                # If the field is in the schema, but no permission is
                # specified, fall back to the default edit permission
                return checker(self.DEFAULT_PERMISSION, context)
        else:
            raise AttributeError('No such field: {0}'.format(field_name))
    def validate(self, field_name, vocabulary_name=None):
        context = self.context
        checker = getSecurityManager().checkPermission
        schemata = self._get_schemata()
        for schema in schemata:
            if field_name in schema:
                # If a vocabulary name was specified and it does not
                # match the vocabulary name for the field or widget,
                # fail.
                field = schema[field_name]
                if vocabulary_name and (
                   vocabulary_name != getattr(field, 'vocabulary', None) and
                   vocabulary_name != getattr(field, 'vocabularyName', None)):
                    # Determine the widget to check for vocabulary there
                    widgets = mergedTaggedValueDict(schema, WIDGETS_KEY)
                    widget = widgets.get(field_name)
                    if widget:
                        widget = (isinstance(widget, basestring) and
                                  resolveDottedName(widget) or widget)
                        widget = widget and widget(field, self._request)
                    else:
                        widget = queryMultiAdapter((field, self._request),
                                                   IFieldWidget)
                    if widget:
                        widget.update()
                    if getattr(widget, 'vocabulary', None) != vocabulary_name:
                        return False
                # Create mapping of all schema permissions
                permissions = mergedTaggedValueDict(schema,
                                                    WRITE_PERMISSIONS_KEY)
                permission_name = permissions.get(field_name, None)
                if permission_name is not None:
                    permission = queryUtility(IPermission,
                                              name=permission_name)
                    if permission:
                        return checker(permission.title, context)

                # If the field is in the schema, but no permission is
                # specified, fall back to the default edit permission
                return checker(self.DEFAULT_PERMISSION, context)
        else:
            raise AttributeError('No such field: {0}'.format(field_name))
Beispiel #16
0
 def __call__(self, field, request):
     __traceback_info__ = ('{0}, processing:\n'
                           '- field "{1}"\n'
                           '- widget: {2}\n'
                           '- params: {3}\n'.format(
                               self.__class__.__name__, field.__name__,
                               repr(self.widget_factory), self.params))
     if isinstance(self.widget_factory, six.string_types):
         __traceback_info__ += '- resolving dotted name\n'
         self.widget_factory = resolveDottedName(self.widget_factory)
     if self.widget_factory is None:
         # use default widget factory for this field type
         __traceback_info__ += '- using default widget factory\n'
         widget = getMultiAdapter((field, request), IFieldWidget)
     elif IWidget.implementedBy(self.widget_factory):
         __traceback_info__ += '- calling factory, then wrapping with ' \
                               'FieldWidget\n'
         widget = FieldWidget(field, self.widget_factory(request))
     elif IFieldWidget.implementedBy(self.widget_factory):
         __traceback_info__ += '- calling factory\n'
         widget = self.widget_factory(field, request)
     for k, v in self.params.items():
         setattr(widget, k, v)
     return widget