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)
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()
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
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