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