def xpath_to_value(self, raw=False):

        xpath_expr = getattr(self.context, self.fieldname, None)
        if not xpath_expr:
            error = u'Empty XPath field specification'
            return dict(errors=[error], data=None)

        fields = get_all_fields(self.context)
        field_name, xpath_expr = parse_field_expression(xpath_expr)
        xml_field = fields.get(field_name)
        if xml_field is None:
            error = u'XML field "{}" does not exist'.format(field_name)
            return dict(errors=[error], data=None)

        # get the dedicated datamanager for the XMLText field
        # that knows how to pull data from the database

        adapter = XMLFieldDataManager(context=self.context, field=xml_field)
        xml = adapter.get()
        if not xml:
            error = u'XML field is empty'
            return dict(errors=[error], data=None)

        # apply xpath expression
        root = defusedxml.lxml.fromstring(xml)
        try:
            result = root.xpath(xpath_expr)
        except lxml.etree.XPathEvalError as e:
            error = u'Invalid XPath expression "{}" (error: {})'.format(
                xpath_expr, e)
            return dict(errors=[error], data=None)

        return dict(errors=[], data=result)
    def xpath_to_value(self, raw=False):

        xpath_expr = getattr(self.context, self.fieldname, None)
        if not xpath_expr:
            error = u'Empty XPath field specification'
            return dict(errors=[error], data=None)

        fields = get_all_fields(self.context)
        field_name, xpath_expr = parse_field_expression(xpath_expr)
        xml_field = fields.get(field_name)
        if xml_field is None:
            error = u'XML field "{}" does not exist'.format(field_name)
            return dict(errors=[error], data=None)

        # get the dedicated datamanager for the XMLText field
        # that knows how to pull data from the database

        adapter = XMLFieldDataManager(context=self.context, field=xml_field)
        xml = adapter.get()
        if not xml:
            error = u'XML field is empty'
            return dict(errors=[error], data=None)

        # apply xpath expression
        root = lxml.etree.fromstring(xml)
        try:
            result = root.xpath(xpath_expr)
        except lxml.etree.XPathEvalError as e:
            error = u'Invalid XPath expression "{}" (error: {})'.format(
                xpath_expr, e)
            return dict(errors=[error], data=None)

        return dict(errors=[], data=result)
示例#3
0
 def validate(self, value, force=False):  # pylint: disable=unused-argument
     """See interfaces.IValidator"""
     context = self.context
     field = self.field
     widget = self.widget
     if field.required and widget and widget.ignore_required_on_validation:
         # make the field not-required while checking
         field = copy.copy(field)
         field.required = False
     if context is not None:
         field = field.bind(context)
     registry = self.request.registry
     if value is NOT_CHANGED:
         if IContextAware.providedBy(widget) and not widget.ignore_context:
             # get value from context
             value = registry.getMultiAdapter((context, field), IDataManager).query()
         else:
             value = NO_VALUE
         if value is NO_VALUE:
             # look up default value
             value = field.default
             # pylint: disable=redefined-outer-name
             adapter = registry.queryMultiAdapter(
                 (context, self.request, self.view, field, widget),
                 IValue, name='default')
             if adapter:
                 value = adapter.get()
     return field.validate(value)
def registry_edited(itema, itemb):
    raw_text=itema.easynewsletter_values

    sm=getSiteManager()
    
    #print_layers(sm)
    texts = {}
    modified = []
    
    utilities = getAllUtilitiesRegisteredFor(ISubscriberSource)
    utilities += [ a[1] for a in sm.getUtilitiesFor(ISubscriberSource) if a[1] not in utilities]
    
    if raw_text is not None:
        for item in raw_text.replace("\r","").split("\n"):
            registry=item.split(":")
            if(len(registry)==2):
                texts[registry[0]]=registry[1]
                found=[a for a in utilities if a.name == registry[0]]
                if len(found)==0:
                    #if element is not here we suscribe it
                    suscribe_utility(sm, registry[1], registry[0])
                elif (registry[1]!=found[0].source):
                    #if source is different than before, we notify it as modified
                    modified.append(found[0].name.__str__())
        
    for ut in utilities:
        if((unicode(ut.name) not in texts.keys()) or (ut.name in modified)):
            ut_registered=sm._utility_registrations.get((ISubscriberSource, ut.name))
            if ut_registered is not None:
                sm.unregisterUtility(ut_registered, ISubscriberSource, name=ut.name)
            sm.utilities.unsubscribe((), ISubscriberSource, ut)

    for adapter in sm.utilities._adapters[:]:
        items = adapter.get(ISubscriberSource, {})
        for key in items.keys():
            if((unicode(key) not in texts.keys()) or (key in modified)):
                del items[key]

    for interface_utility in sm._utility_registrations.keys():
        if((interface_utility[0].__name__=="ISubscriberSource")):
            name=sm._utility_registrations[interface_utility][0].name
            if (((unicode(name) not in texts.keys()) or (name in modified))):
                del sm._utility_registrations[interface_utility]

    for item_modified in modified:
        name=unicode(item_modified)
        source=texts[name]
        suscribe_utility(sm, source, name)
        
    transaction.commit()
    sm._p_jar.sync()
示例#5
0
    def get(self):
        """ get default value of field from TDefault """
        efield = IFieldExtender(self.field)
        TDefault = getattr(efield, "TDefault", None)
        if TDefault:
            return get_expression(self.context, TDefault)

        # see if there is another default adapter for this field instead
        _, _, view_interface, _, _ = self.__class__.__component_adapts__
        adapter = superAdapter(
            view_interface,
            self,
            (self.context, self.request, self.view, self.field, self.widget),
            name="default",
        )
        if adapter is not None:
            return adapter.get()
        else:
            # TODO: this should have already been done by z3c.form.widget.update() so shouldn't be needed
            return self.field.default
示例#6
0
def save_form(  # noqa: C901 (this has gotten quite complex)
    form,
    data,
    submission,
    default_values=False,
    force=False,
):
    changes = {}
    for name, field in form.fields.items():
        if name == 'schema':
            continue
        elif name not in data and default_values:
            value = field.field.default
            adapter = queryMultiAdapter(
                (
                    form.context,
                    form.request,
                    form,
                    field.field,
                    form.widgets[name],
                ),
                IValue,
                name='default',
            )
            if adapter:
                value = adapter.get()
        elif name not in data:
            continue
        else:
            value = data[name]
        if value is NOT_CHANGED:
            continue

        # Set contained information of schema.Object
        if IContained.providedBy(value):
            value.__name__ = name
            value.__parent__ = aq_base(submission)

        # Set contained information of schema.List|Tuple(value_type=Object)
        if isinstance(value, list) or isinstance(value, tuple):
            for item in value:
                if IContained.providedBy(item):
                    item.__name__ = name
                    item.__parent__ = aq_base(submission)

        if force:
            setattr(submission, name, value)
        elif changedField(field.field, value, context=submission):
            # Only update the data, if it is different
            dm = getMultiAdapter((submission, field.field), IDataManager)
            dm.set(value)
            # Record the change using information required later
            changes.setdefault(dm.field.interface, []).append(name)
    try:
        for group in form.groups:
            changes.update(
                save_form(group, data, submission, default_values, force), )
    except AttributeError:
        pass

    return changes