Mercurial > libervia-backend
diff libervia/backend/tools/xml_tools.py @ 4270:0d7bb4df2343
Reformatted code base using black.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 19 Jun 2024 18:44:57 +0200 |
parents | b274f0d5c138 |
children | d2deddd6df44 |
line wrap: on
line diff
--- a/libervia/backend/tools/xml_tools.py Tue Jun 18 12:06:45 2024 +0200 +++ b/libervia/backend/tools/xml_tools.py Wed Jun 19 18:44:57 2024 +0200 @@ -81,8 +81,9 @@ widget_kwargs["read_only"] = read_only else: - raise exceptions.DataError("unknown extended type {ext_type}".format( - ext_type = field.ext_type)) + raise exceptions.DataError( + "unknown extended type {ext_type}".format(ext_type=field.ext_type) + ) elif field.fieldType == "fixed" or field.fieldType is None: widget_type = "text" @@ -130,7 +131,7 @@ (option.value, option.label or option.value) for option in field.options ] widget_kwargs["selected"] = widget_args - widget_kwargs["styles"] = ["multi"] + widget_kwargs["styles"] = ["multi"] widget_args = [] else: log.error( @@ -144,6 +145,7 @@ return widget_type, widget_args, widget_kwargs + def data_form_2_widgets(form_ui, form, read_only=False, prepend=None, filters=None): """Complete an existing XMLUI with widget converted from XEP-0004 data forms. @@ -214,20 +216,18 @@ see data_dict_2_data_form for a description of the format """ fields = [] - data_dict = { - "fields": fields - } + data_dict = {"fields": fields} if form.formNamespace: data_dict["namespace"] = form.formNamespace for form_field in form.fieldList: field = {"type": form_field.fieldType} fields.append(field) for src_name, dest_name in ( - ('var', 'name'), - ('label', 'label'), - ('value', 'value'), + ("var", "name"), + ("label", "label"), + ("value", "value"), # FIXME: we probably should have only "values" - ('values', 'values') + ("values", "values"), ): value = getattr(form_field, src_name, None) if value: @@ -242,8 +242,7 @@ if form_field.fieldType is None and form_field.ext_type == "xml": if isinstance(form_field.value, domish.Element): - if ((form_field.value.uri == C.NS_XHTML - and form_field.value.name == "div")): + if form_field.value.uri == C.NS_XHTML and form_field.value.name == "div": field["type"] = "xhtml" if form_field.value.children: log.warning( @@ -270,19 +269,21 @@ # TODO: describe format fields = [] for field_data in data_dict["fields"]: - field_type = field_data.get('type', 'text-single') + field_type = field_data.get("type", "text-single") kwargs = { "fieldType": field_type, "var": field_data["name"], - "label": field_data.get('label'), + "label": field_data.get("label"), "value": field_data.get("value"), - "required": field_data.get("required") + "required": field_data.get("required"), } if field_type == "xhtml": - kwargs.update({ - "fieldType": None, - "ext_type": "xml", - }) + kwargs.update( + { + "fieldType": None, + "ext_type": "xml", + } + ) if kwargs["value"] is None: kwargs["value"] = domish.Element((C.NS_XHTML, "div")) elif "options" in field_data: @@ -292,11 +293,7 @@ ] field = data_form.Field(**kwargs) fields.append(field) - return data_form.Form( - "form", - formNamespace=data_dict.get("namespace"), - fields=fields - ) + return data_form.Form("form", formNamespace=data_dict.get("namespace"), fields=fields) def data_form_elt_result_2_xmlui_data(form_xml): @@ -391,8 +388,9 @@ return xml_ui -def data_form_result_2_xmlui(result_form, base_form, session_id=None, prepend=None, - filters=None, read_only=True): +def data_form_result_2_xmlui( + result_form, base_form, session_id=None, prepend=None, filters=None, read_only=True +): """Convert data form result to SàT XMLUI. @param result_form (data_form.Form): result form to convert @@ -407,7 +405,7 @@ # we deepcopy the form because _data_form_field_2_xmlui_data can modify the value # FIXME: check if it's really important, the only modified value seems to be # the replacement of None by "" on fixed fields - # form = deepcopy(result_form) + # form = deepcopy(result_form) form = result_form for name, field in form.fields.items(): try: @@ -416,7 +414,9 @@ continue field.options = base_field.options[:] xml_ui = XMLUI("window", "vertical", session_id=session_id) - data_form_2_widgets(xml_ui, form, read_only=read_only, prepend=prepend, filters=filters) + data_form_2_widgets( + xml_ui, form, read_only=read_only, prepend=prepend, filters=filters + ) return xml_ui @@ -434,7 +434,7 @@ def xmlui_result_2_data_form_result(xmlui_data): - """ Extract form data from a XMLUI return. + """Extract form data from a XMLUI return. @param xmlui_data (dict): data returned by frontends for XMLUI form @return: dict of data usable by Wokkel's data form @@ -446,7 +446,7 @@ if isinstance(value, str): if "\n" in value: # data form expects multi-lines text to be in separated values - value = value.split('\n') + value = value.split("\n") elif "\t" in value: # FIXME: workaround to handle multiple values. Proper serialisation must # be done in XMLUI @@ -466,7 +466,7 @@ def is_xmlui_cancelled(raw_xmlui): """Tell if an XMLUI has been cancelled by checking raw XML""" - return C.bool(raw_xmlui.get('cancelled', C.BOOL_FALSE)) + return C.bool(raw_xmlui.get("cancelled", C.BOOL_FALSE)) def xmlui_result_to_elt(xmlui_data): @@ -619,7 +619,7 @@ class Element(object): - """ Base XMLUI element """ + """Base XMLUI element""" type = None @@ -651,7 +651,7 @@ class TopElement(Element): - """ Main XML Element """ + """Main XML Element""" type = "top" @@ -661,7 +661,7 @@ class TabElement(Element): - """ Used by TabsContainer to give name and label to tabs.""" + """Used by TabsContainer to give name and label to tabs.""" type = "tab" @@ -690,7 +690,7 @@ class FieldBackElement(Element): - """ Used by ButtonWidget to indicate which field have to be sent back """ + """Used by ButtonWidget to indicate which field have to be sent back""" type = "field_back" @@ -701,7 +701,7 @@ class InternalFieldElement(Element): - """ Used by internal callbacks to indicate which fields are manipulated """ + """Used by internal callbacks to indicate which fields are manipulated""" type = "internal_field" @@ -711,7 +711,7 @@ class InternalDataElement(Element): - """ Used by internal callbacks to retrieve extra data """ + """Used by internal callbacks to retrieve extra data""" type = "internal_data" @@ -723,7 +723,7 @@ class OptionElement(Element): - """" Used by ListWidget to specify options """ + """ " Used by ListWidget to specify options""" type = "option" @@ -749,7 +749,7 @@ class JidElement(Element): - """" Used by JidsListWidget to specify jids""" + """ " Used by JidsListWidget to specify jids""" type = "jid" @@ -770,7 +770,7 @@ class RowElement(Element): - """" Used by AdvancedListContainer """ + """ " Used by AdvancedListContainer""" type = "row" @@ -785,7 +785,7 @@ class HeaderElement(Element): - """" Used by AdvancedListContainer """ + """ " Used by AdvancedListContainer""" type = "header" @@ -810,7 +810,7 @@ class Container(Element): - """ And Element which contains other ones and has a layout """ + """And Element which contains other ones and has a layout""" type = None @@ -825,7 +825,7 @@ self.elem.setAttribute("type", self.type) def get_parent_container(self): - """ Return first parent container + """Return first parent container @return: parent container or None """ @@ -845,11 +845,13 @@ class PairsContainer(Container): """Container with series of 2 elements""" + type = "pairs" class LabelContainer(Container): """Like PairsContainer, but first element can only be a label""" + type = "label" @@ -872,7 +874,7 @@ return self.xmlui.change_container(new_container) def end(self): - """ Called when we have finished tabs + """Called when we have finished tabs change current container to first container parent """ @@ -952,7 +954,7 @@ self.append(item) def set_row_index(self, idx): - """ Set index for next row + """Set index for next row index are returned when a row is selected, in data's "index" key @param idx: string index to associate to the next row @@ -968,7 +970,7 @@ self._item_idx += 1 def end(self): - """ Called when we have finished list + """Called when we have finished list change current container to first container parent """ @@ -997,9 +999,7 @@ self.elem.setAttribute("name", name) if name in xmlui.named_widgets: raise exceptions.ConflictError( - _('A widget with the name "{name}" already exists.').format( - name=name - ) + _('A widget with the name "{name}" already exists.').format(name=name) ) xmlui.named_widgets[name] = self self.elem.setAttribute("type", self.type) @@ -1058,6 +1058,7 @@ used most of time to display the desciption or name of the next widget """ + type = "label" def __init__(self, xmlui, label, name=None, parent=None): @@ -1067,6 +1068,7 @@ class HiddenWidget(Widget): """Not displayed widget, frontends will just copy the value(s)""" + type = "hidden" def __init__(self, xmlui, value, name, parent=None): @@ -1102,7 +1104,7 @@ type = "divider" def __init__(self, xmlui, style="line", name=None, parent=None): - """ Create a divider + """Create a divider @param xmlui: XMLUI instance @param style: one of: @@ -1160,6 +1162,7 @@ class XHTMLBoxWidget(StringWidget): """Specialized textbox to manipulate XHTML""" + type = "xhtmlbox" def __init__(self, xmlui, value, name=None, parent=None, read_only=False, clean=True): @@ -1170,12 +1173,12 @@ """ if clean: if clean_xhtml is None: - raise exceptions.NotFound( - "No cleaning method set, can't clean the XHTML") + raise exceptions.NotFound("No cleaning method set, can't clean the XHTML") value = clean_xhtml(value) super(XHTMLBoxWidget, self).__init__( - xmlui, value=value, name=name, parent=parent, read_only=read_only) + xmlui, value=value, name=name, parent=parent, read_only=read_only + ) class JidInputWidget(StringWidget): @@ -1283,7 +1286,7 @@ self.set_styles(styles) def add_options(self, options, selected=None): - """Add options to a multi-values element (e.g. list) """ + """Add options to a multi-values element (e.g. list)""" if selected: if isinstance(selected, str): selected = [selected] @@ -1347,7 +1350,7 @@ class DialogElement(Element): - """Main dialog element """ + """Main dialog element""" type = "dialog" @@ -1410,8 +1413,15 @@ class XMLUI(object): """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" - def __init__(self, panel_type="window", container="vertical", dialog_opt=None, - title=None, submit_id=None, session_id=None): + def __init__( + self, + panel_type="window", + container="vertical", + dialog_opt=None, + title=None, + submit_id=None, + session_id=None, + ): """Init SàT XML Panel @param panel_type: one of @@ -1511,8 +1521,9 @@ # remove the creator_wrapper def create_widget(self, *args, **kwargs): if self.type == C.XMLUI_DIALOG: - raise exceptions.InternalError(_( - "create_widget can't be used with dialogs")) + raise exceptions.InternalError( + _("create_widget can't be used with dialogs") + ) if "parent" not in kwargs: kwargs["parent"] = self.current_container if "name" not in kwargs and is_input: @@ -1521,11 +1532,12 @@ args = list(args) kwargs["name"] = args.pop(0) return widget_cls(self, *args, **kwargs) + return create_widget @classmethod def _introspect(cls): - """ Introspect module to find Widgets and Containers, and create addXXX methods""" + """Introspect module to find Widgets and Containers, and create addXXX methods""" # FIXME: we can't log anything because this file is used # in bin/sat script then evaluated # bin/sat should be refactored @@ -1539,7 +1551,7 @@ continue cls._widgets[obj.type] = obj creator_name = "add" + obj.__name__ - if creator_name.endswith('Widget'): + if creator_name.endswith("Widget"): creator_name = creator_name[:-6] is_input = issubclass(obj, InputWidget) # FIXME: cf. above comment @@ -1651,7 +1663,7 @@ self.current_container = self._create_container( container, self.current_container.get_parent_container() or self.main_container, - **kwargs + **kwargs, ) else: self.current_container = ( @@ -1728,8 +1740,14 @@ return xmlui_d -def defer_xmlui(host, xmlui, action_extra=None, security_limit=C.NO_SECURITY_LIMIT, - chained=False, profile=C.PROF_KEY_NONE): +def defer_xmlui( + host, + xmlui, + action_extra=None, + security_limit=C.NO_SECURITY_LIMIT, + chained=False, + profile=C.PROF_KEY_NONE, +): """Create a deferred linked to XMLUI @param xmlui(XMLUI): instance of the XMLUI @@ -1764,7 +1782,7 @@ action_extra: Optional[dict] = None, security_limit: int = C.NO_SECURITY_LIMIT, chained: bool = False, - profile: str = C.PROF_KEY_NONE + profile: str = C.PROF_KEY_NONE, ) -> defer.Deferred: """Create a submitable dialog and manage it with a deferred @@ -1798,10 +1816,9 @@ # Misc other funtions + def element_copy( - element: domish.Element, - with_parent: bool = True, - with_children: bool = True + element: domish.Element, with_parent: bool = True, with_children: bool = True ) -> domish.Element: """Make a copy of a domish.Element @@ -1813,9 +1830,10 @@ """ new_elt = domish.Element( (element.uri, element.name), - defaultUri = element.defaultUri, - attribs = element.attributes, - localPrefixes = element.localPrefixes) + defaultUri=element.defaultUri, + attribs=element.attributes, + localPrefixes=element.localPrefixes, + ) if with_parent: new_elt.parent = element.parent if with_children: @@ -1825,8 +1843,11 @@ def is_xhtml_field(field): """Check if a data_form.Field is an XHTML one""" - return (field.fieldType is None and field.ext_type == "xml" and - field.value.uri == C.NS_XHTML) + return ( + field.fieldType is None + and field.ext_type == "xml" + and field.value.uri == C.NS_XHTML + ) class ElementParser: @@ -1937,10 +1958,8 @@ def find_ancestor( - elt, - name: str, - namespace: Optional[Union[str, Iterable[str]]] = None - ) -> domish.Element: + elt, name: str, namespace: Optional[Union[str, Iterable[str]]] = None +) -> domish.Element: """Retrieve ancestor of an element @param elt: starting element, its parent will be checked recursively until the @@ -1971,7 +1990,7 @@ strings = [] for child in elt.children: if domish.IElement.providedBy(child): - strings.append(p_fmt_elt(child, indent+2, defaultUri=elt.defaultUri)) + strings.append(p_fmt_elt(child, indent + 2, defaultUri=elt.defaultUri)) else: strings.append(f"{(indent+2)*' '}{child!s}") if elt.children: @@ -1982,7 +2001,7 @@ strings.append(f"{indent*' '}</{nochild_elt.name}>") else: strings.append(f"{indent*' '}{elt.toXml(defaultUri=defaultUri)}") - return '\n'.join(strings) + return "\n".join(strings) def pp_elt(elt): @@ -1992,6 +2011,7 @@ # ElementTree + def et_get_namespace_and_name(et_elt: ET.Element) -> Tuple[Optional[str], str]: """Retrieve element namespace and name from ElementTree element @@ -2007,7 +2027,7 @@ end_idx = name.find("}") if end_idx == -1: raise ValueError("Invalid ET name") - return name[1:end_idx], name[end_idx+1:] + return name[1:end_idx], name[end_idx + 1 :] def et_elt_2_domish_elt(et_elt: Union[ET.Element, etree.Element]) -> domish.Element: @@ -2026,20 +2046,20 @@ @overload -def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[False]) -> ET.Element: - ... +def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[False]) -> ET.Element: ... + @overload -def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[True]) -> etree.Element: - ... +def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[True]) -> etree.Element: ... + @overload def domish_elt_2_et_elt( elt: domish.Element, lxml: bool -) -> Union[ET.Element, etree.Element]: - ... +) -> Union[ET.Element, etree.Element]: ... -def domish_elt_2_et_elt(elt, lxml = False): + +def domish_elt_2_et_elt(elt, lxml=False): """Convert Twisted's domish.Element to ElementTree equivalent Note: this is a naive implementation, adapted to XMPP, and some text content may be