massive refactoring to switch from camelCase to snake_case:

historically, Libervia (SàT before) was using camelCase as allowed by PEP8 when using a
pre-PEP8 code, to use the same coding style as in Twisted.

However, snake_case is more readable and it's better to follow PEP8 best practices, so it
has been decided to move on full snake_case. Because Libervia has a huge codebase, this
ended with a ugly mix of camelCase and snake_case.

To fix that, this patch does a big refactoring by renaming every function and method
(including bridge) that are not coming from Twisted or Wokkel, to use fully snake_case.

This is a massive change, and may result in some bugs.
This commit is contained in:
Goffi 2023-04-08 13:54:42 +02:00
commit 6a6f15707a

View file

@ -47,7 +47,7 @@ XML_ENTITIES = ("quot", "amp", "apos", "lt", "gt")
# method to clean XHTML, receive raw unsecure XML or HTML, must return cleaned raw XHTML
# this method must be set during runtime
cleanXHTML = None
clean_xhtml = None
# TODO: move XMLUI stuff in a separate module
# TODO: rewrite this with lxml or ElementTree or domish.Element: it's complicated and difficult to maintain with current minidom implementation
@ -55,7 +55,7 @@ cleanXHTML = None
# Helper functions
def _dataFormField2XMLUIData(field, read_only=False):
def _data_form_field_2_xmlui_data(field, read_only=False):
"""Get data needed to create an XMLUI's Widget from Wokkel's data_form's Field.
The attribute field can be modified (if it's fixed and it has no value).
@ -144,14 +144,14 @@ def _dataFormField2XMLUIData(field, read_only=False):
return widget_type, widget_args, widget_kwargs
def dataForm2Widgets(form_ui, form, read_only=False, prepend=None, filters=None):
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.
@param form_ui (XMLUI): XMLUI instance
@param form (data_form.Form): Wokkel's implementation of data form
@param read_only (bool): if True and it makes sense, create a read only input widget
@param prepend(iterable, None): widgets to prepend to main LabelContainer
if not None, must be an iterable of *args for addWidget. Those widgets will
if not None, must be an iterable of *args for add_widget. Those widgets will
be added first to the container.
@param filters(dict, None): if not None, a dictionary of callable:
key is the name of the widget to filter
@ -165,14 +165,14 @@ def dataForm2Widgets(form_ui, form, read_only=False, prepend=None, filters=None)
if form.instructions:
form_ui.addText("\n".join(form.instructions), "instructions")
form_ui.changeContainer("label")
form_ui.change_container("label")
if prepend is not None:
for widget_args in prepend:
form_ui.addWidget(*widget_args)
form_ui.add_widget(*widget_args)
for field in form.fieldList:
widget_type, widget_args, widget_kwargs = _dataFormField2XMLUIData(
widget_type, widget_args, widget_kwargs = _data_form_field_2_xmlui_data(
field, read_only
)
try:
@ -190,12 +190,12 @@ def dataForm2Widgets(form_ui, form, read_only=False, prepend=None, filters=None)
else:
form_ui.addEmpty()
form_ui.addWidget(widget_type, *widget_args, **widget_kwargs)
form_ui.add_widget(widget_type, *widget_args, **widget_kwargs)
return form_ui
def dataForm2XMLUI(form, submit_id, session_id=None, read_only=False):
def data_form_2_xmlui(form, submit_id, session_id=None, read_only=False):
"""Take a data form (Wokkel's XEP-0004 implementation) and convert it to a SàT XMLUI.
@param form (data_form.Form): a Form instance
@ -205,13 +205,13 @@ def dataForm2XMLUI(form, submit_id, session_id=None, read_only=False):
@return: XMLUI instance
"""
form_ui = XMLUI("form", "vertical", submit_id=submit_id, session_id=session_id)
return dataForm2Widgets(form_ui, form, read_only=read_only)
return data_form_2_widgets(form_ui, form, read_only=read_only)
def dataForm2dataDict(form: data_form.Form) -> dict:
def data_form_2_data_dict(form: data_form.Form) -> dict:
"""Convert data form to a simple dict, easily serialisable
see dataDict2dataForm for a description of the format
see data_dict_2_data_form for a description of the format
"""
fields = []
data_dict = {
@ -253,7 +253,7 @@ def dataForm2dataDict(form: data_form.Form) -> dict:
return data_dict
def dataDict2dataForm(data_dict):
def data_dict_2_data_form(data_dict):
"""Convert serialisable dict of data to a data form
The format of the dict is as follow:
@ -299,7 +299,7 @@ def dataDict2dataForm(data_dict):
)
def dataFormEltResult2XMLUIData(form_xml):
def data_form_elt_result_2_xmlui_data(form_xml):
"""Parse a data form result (not parsed by Wokkel's XEP-0004 implementation).
The raw data form is used because Wokkel doesn't manage result items parsing yet.
@ -337,12 +337,12 @@ def dataFormEltResult2XMLUIData(form_xml):
continue
field = data_form.Field.fromElement(elt)
xmlui_data.append(_dataFormField2XMLUIData(field))
xmlui_data.append(_data_form_field_2_xmlui_data(field))
return headers, xmlui_data
def XMLUIData2AdvancedList(xmlui, headers, xmlui_data):
def xmlui_data_2_advanced_list(xmlui, headers, xmlui_data):
"""Take a raw data form result (not parsed by Wokkel's XEP-0004 implementation) and convert it to an advanced list.
The raw data form is used because Wokkel doesn't manage result items parsing yet.
@ -354,15 +354,15 @@ def XMLUIData2AdvancedList(xmlui, headers, xmlui_data):
adv_list = AdvancedListContainer(
xmlui, headers=headers, columns=len(headers), parent=xmlui.current_container
)
xmlui.changeContainer(adv_list)
xmlui.change_container(adv_list)
for widget_type, widget_args, widget_kwargs in xmlui_data:
xmlui.addWidget(widget_type, *widget_args, **widget_kwargs)
xmlui.add_widget(widget_type, *widget_args, **widget_kwargs)
return xmlui
def dataFormResult2AdvancedList(xmlui, form_xml):
def data_form_result_2_advanced_list(xmlui, form_xml):
"""Take a raw data form result (not parsed by Wokkel's XEP-0004 implementation) and convert it to an advanced list.
The raw data form is used because Wokkel doesn't manage result items parsing yet.
@ -370,11 +370,11 @@ def dataFormResult2AdvancedList(xmlui, form_xml):
@param form_xml (domish.Element): element of the data form
@return: the completed XMLUI instance
"""
headers, xmlui_data = dataFormEltResult2XMLUIData(form_xml)
XMLUIData2AdvancedList(xmlui, headers, xmlui_data)
headers, xmlui_data = data_form_elt_result_2_xmlui_data(form_xml)
xmlui_data_2_advanced_list(xmlui, headers, xmlui_data)
def dataFormEltResult2XMLUI(form_elt, session_id=None):
def data_form_elt_result_2_xmlui(form_elt, session_id=None):
"""Take a raw data form (not parsed by XEP-0004) and convert it to a SàT XMLUI.
The raw data form is used because Wokkel doesn't manage result items parsing yet.
@ -384,14 +384,14 @@ def dataFormEltResult2XMLUI(form_elt, session_id=None):
"""
xml_ui = XMLUI("window", "vertical", session_id=session_id)
try:
dataFormResult2AdvancedList(xml_ui, form_elt)
data_form_result_2_advanced_list(xml_ui, form_elt)
except exceptions.DataError:
parsed_form = data_form.Form.fromElement(form_elt)
dataForm2Widgets(xml_ui, parsed_form, read_only=True)
data_form_2_widgets(xml_ui, parsed_form, read_only=True)
return xml_ui
def dataFormResult2XMLUI(result_form, base_form, session_id=None, prepend=None,
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.
@ -399,12 +399,12 @@ def dataFormResult2XMLUI(result_form, base_form, session_id=None, prepend=None,
@param base_form (data_form.Form): initial form (i.e. of form type "form")
this one is necessary to reconstruct options when needed (e.g. list elements)
@param session_id (unicode): session id to return with the data
@param prepend: same as for [dataForm2Widgets]
@param filters: same as for [dataForm2Widgets]
@param read_only: same as for [dataForm2Widgets]
@param prepend: same as for [data_form_2_widgets]
@param filters: same as for [data_form_2_widgets]
@param read_only: same as for [data_form_2_widgets]
@return: XMLUI instance
"""
# we deepcopy the form because _dataFormField2XMLUIData can modify the value
# 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)
@ -416,11 +416,11 @@ def dataFormResult2XMLUI(result_form, base_form, session_id=None, prepend=None,
continue
field.options = base_field.options[:]
xml_ui = XMLUI("window", "vertical", session_id=session_id)
dataForm2Widgets(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
def _cleanValue(value):
def _clean_value(value):
"""Workaround method to avoid DBus types with D-Bus bridge.
@param value: value to clean
@ -433,7 +433,7 @@ def _cleanValue(value):
return value
def XMLUIResult2DataFormResult(xmlui_data):
def xmlui_result_2_data_form_result(xmlui_data):
""" Extract form data from a XMLUI return.
@param xmlui_data (dict): data returned by frontends for XMLUI form
@ -451,11 +451,11 @@ def XMLUIResult2DataFormResult(xmlui_data):
# FIXME: workaround to handle multiple values. Proper serialisation must
# be done in XMLUI
value = value.split("\t")
ret[key[len(SAT_FORM_PREFIX) :]] = _cleanValue(value)
ret[key[len(SAT_FORM_PREFIX) :]] = _clean_value(value)
return ret
def formEscape(name):
def form_escape(name):
"""Return escaped name for forms.
@param name (unicode): form name
@ -464,23 +464,23 @@ def formEscape(name):
return "%s%s" % (SAT_FORM_PREFIX, name)
def isXMLUICancelled(raw_xmlui):
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))
def XMLUIResultToElt(xmlui_data):
def xmlui_result_to_elt(xmlui_data):
"""Construct result domish.Element from XMLUI result.
@param xmlui_data (dict): data returned by frontends for XMLUI form
@return: domish.Element
"""
form = data_form.Form("submit")
form.makeFields(XMLUIResult2DataFormResult(xmlui_data))
form.makeFields(xmlui_result_2_data_form_result(xmlui_data))
return form.toElement()
def tupleList2dataForm(values):
def tuple_list_2_data_form(values):
"""Convert a list of tuples (name, value) to a wokkel submit data form.
@param values (list): list of tuples
@ -494,7 +494,7 @@ def tupleList2dataForm(values):
return form
def paramsXML2XMLUI(xml):
def params_xml_2_xmlui(xml):
"""Convert the XML for parameter to a SàT XML User Interface.
@param xml (unicode)
@ -516,7 +516,7 @@ def paramsXML2XMLUI(xml):
raise exceptions.DataError(
_("INTERNAL ERROR: params categories must have a name")
)
tabs_cont.addTab(category_name, label=label, container=LabelContainer)
tabs_cont.add_tab(category_name, label=label, container=LabelContainer)
for param in category.getElementsByTagName("param"):
widget_kwargs = {}
@ -530,12 +530,12 @@ def paramsXML2XMLUI(xml):
callback_id = param.getAttribute("callback_id") or None
if type_ == "list":
options, selected = _paramsGetListOptions(param)
options, selected = _params_get_list_options(param)
widget_kwargs["options"] = options
widget_kwargs["selected"] = selected
widget_kwargs["styles"] = ["extensible"]
elif type_ == "jids_list":
widget_kwargs["jids"] = _paramsGetListJids(param)
widget_kwargs["jids"] = _params_get_list_jids(param)
if type_ in ("button", "text"):
param_ui.addEmpty()
@ -562,12 +562,12 @@ def paramsXML2XMLUI(xml):
param_name,
)
param_ui.addWidget(type_, **widget_kwargs)
param_ui.add_widget(type_, **widget_kwargs)
return param_ui.toXml()
def _paramsGetListOptions(param):
def _params_get_list_options(param):
"""Retrieve the options for list element.
The <option/> tags must be direct children of <param/>.
@ -599,7 +599,7 @@ def _paramsGetListOptions(param):
return (options, selected)
def _paramsGetListJids(param):
def _params_get_list_jids(param):
"""Retrive jids from a jids_list element.
the <jid/> tags must be direct children of <param/>
@ -679,9 +679,9 @@ class TabElement(Element):
self.elem.setAttribute("name", name)
self.elem.setAttribute("label", label)
if selected:
self.setSelected(selected)
self.set_selected(selected)
def setSelected(self, selected=False):
def set_selected(self, selected=False):
"""Set the tab selected.
@param selected (bool): set to True to select this tab
@ -824,7 +824,7 @@ class Container(Element):
super(Container, self).__init__(xmlui, parent)
self.elem.setAttribute("type", self.type)
def getParentContainer(self):
def get_parent_container(self):
""" Return first parent container
@return: parent container or None
@ -856,7 +856,7 @@ class LabelContainer(Container):
class TabsContainer(Container):
type = "tabs"
def addTab(self, name, label=None, selected=None, container=VerticalContainer):
def add_tab(self, name, label=None, selected=None, container=VerticalContainer):
"""Add a tab.
@param name (unicode): tab name
@ -869,15 +869,15 @@ class TabsContainer(Container):
label = name
tab_elt = TabElement(self, name, label, selected)
new_container = container(self.xmlui, tab_elt)
return self.xmlui.changeContainer(new_container)
return self.xmlui.change_container(new_container)
def end(self):
""" Called when we have finished tabs
change current container to first container parent
"""
parent_container = self.getParentContainer()
self.xmlui.changeContainer(parent_container)
parent_container = self.get_parent_container()
self.xmlui.change_container(parent_container)
class AdvancedListContainer(Container):
@ -928,9 +928,9 @@ class AdvancedListContainer(Container):
raise exceptions.DataError(
_("Headers lenght doesn't correspond to columns")
)
self.addHeaders(headers)
self.add_headers(headers)
if items:
self.addItems(items)
self.add_items(items)
self.elem.setAttribute("columns", str(self._columns))
if callback_id is not None:
self.elem.setAttribute("callback", callback_id)
@ -940,18 +940,18 @@ class AdvancedListContainer(Container):
self.elem.setAttribute("auto_index", "true")
self.next_row_idx = None
def addHeaders(self, headers):
def add_headers(self, headers):
for header in headers:
self.addHeader(header)
def addHeader(self, header):
pass # TODO
def addItems(self, items):
def add_items(self, items):
for item in items:
self.append(item)
def setRowIndex(self, idx):
def set_row_index(self, idx):
""" Set index for next row
index are returned when a row is selected, in data's "index" key
@ -974,8 +974,8 @@ class AdvancedListContainer(Container):
"""
if self._item_idx % self._columns != 0:
raise exceptions.DataError(_("Incorrect number of items in list"))
parent_container = self.getParentContainer()
self.xmlui.changeContainer(parent_container)
parent_container = self.get_parent_container()
self.xmlui.change_container(parent_container)
## Widgets ##
@ -1004,7 +1004,7 @@ class Widget(Element):
xmlui.named_widgets[name] = self
self.elem.setAttribute("type", self.type)
def setInternalCallback(self, callback, fields, data_elts=None):
def set_internal_callback(self, callback, fields, data_elts=None):
"""Set an internal UI callback when the widget value is changed.
The internal callbacks are NO callback ids, they are strings from
@ -1169,10 +1169,10 @@ class XHTMLBoxWidget(StringWidget):
word, set to False only if you made the XHTML yourself)
"""
if clean:
if cleanXHTML is None:
if clean_xhtml is None:
raise exceptions.NotFound(
"No cleaning method set, can't clean the XHTML")
value = cleanXHTML(value)
value = clean_xhtml(value)
super(XHTMLBoxWidget, self).__init__(
xmlui, value=value, name=name, parent=parent, read_only=read_only)
@ -1279,10 +1279,10 @@ class ListWidget(InputWidget):
# because we would not have the labels
log.warning(_('empty "options" list'))
super(ListWidget, self).__init__(xmlui, name, parent)
self.addOptions(options, selected)
self.setStyles(styles)
self.add_options(options, selected)
self.set_styles(styles)
def addOptions(self, options, selected=None):
def add_options(self, options, selected=None):
"""Add options to a multi-values element (e.g. list) """
if selected:
if isinstance(selected, str):
@ -1294,7 +1294,7 @@ class ListWidget(InputWidget):
value = option if isinstance(option, str) else option[0]
OptionElement(self, option, value in selected)
def setStyles(self, styles):
def set_styles(self, styles):
if not styles.issubset(self.STYLES):
raise exceptions.DataError(_("invalid styles"))
for style in styles:
@ -1302,7 +1302,7 @@ class ListWidget(InputWidget):
# TODO: check flags incompatibily (noselect and multi) like in __init__
def setStyle(self, style):
self.setStyles([style])
self.set_styles([style])
@property
def value(self):
@ -1336,9 +1336,9 @@ class JidsListWidget(InputWidget):
if not jids:
log.debug("empty jids list")
else:
self.addJids(jids)
self.add_jids(jids)
def addJids(self, jids):
def add_jids(self, jids):
for jid_ in jids:
JidElement(self, jid_)
@ -1499,20 +1499,20 @@ class XMLUI(object):
if panel_type == C.XMLUI_DIALOG:
if dialog_opt is None:
dialog_opt = {}
self._createDialog(dialog_opt)
self._create_dialog(dialog_opt)
return
self.main_container = self._createContainer(container, TopElement(self))
self.main_container = self._create_container(container, TopElement(self))
self.current_container = self.main_container
self.named_widgets = {}
@staticmethod
def creatorWrapper(widget_cls, is_input):
def creator_wrapper(widget_cls, is_input):
# TODO: once moved to Python 3, use functools.partialmethod and
# remove the creatorWrapper
def createWidget(self, *args, **kwargs):
# remove the creator_wrapper
def create_widget(self, *args, **kwargs):
if self.type == C.XMLUI_DIALOG:
raise exceptions.InternalError(_(
"createWidget can't be used with dialogs"))
"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,7 +1521,7 @@ class XMLUI(object):
args = list(args)
kwargs["name"] = args.pop(0)
return widget_cls(self, *args, **kwargs)
return createWidget
return create_widget
@classmethod
def _introspect(cls):
@ -1547,10 +1547,10 @@ class XMLUI(object):
# .format(creator_name=creator_name, is_input=is_input))
assert not hasattr(cls, creator_name)
# XXX: we need to use creatorWrapper because we are in a loop
# XXX: we need to use creator_wrapper because we are in a loop
# and Python 2 doesn't support default values in kwargs
# when using *args, **kwargs
setattr(cls, creator_name, cls.creatorWrapper(obj, is_input))
setattr(cls, creator_name, cls.creator_wrapper(obj, is_input))
elif issubclass(obj, Container):
if obj.__name__ == "Container":
@ -1602,7 +1602,7 @@ class XMLUI(object):
else:
raise exceptions.DataError("session_id can't be empty")
def _createDialog(self, dialog_opt):
def _create_dialog(self, dialog_opt):
dialog_type = dialog_opt.setdefault(C.XMLUI_DATA_TYPE, C.XMLUI_DIALOG_MESSAGE)
if (
dialog_type in [C.XMLUI_DIALOG_CONFIRM, C.XMLUI_DIALOG_FILE]
@ -1630,7 +1630,7 @@ class XMLUI(object):
except KeyError:
pass
def _createContainer(self, container, parent=None, **kwargs):
def _create_container(self, container, parent=None, **kwargs):
"""Create a container element
@param type: container type (cf init doc)
@ -1642,15 +1642,15 @@ class XMLUI(object):
new_container = cls(self, parent=parent, **kwargs)
return new_container
def changeContainer(self, container, **kwargs):
def change_container(self, container, **kwargs):
"""Change the current container
@param container: either container type (container it then created),
or an Container instance"""
if isinstance(container, str):
self.current_container = self._createContainer(
self.current_container = self._create_container(
container,
self.current_container.getParentContainer() or self.main_container,
self.current_container.get_parent_container() or self.main_container,
**kwargs
)
else:
@ -1660,7 +1660,7 @@ class XMLUI(object):
assert isinstance(self.current_container, Container)
return self.current_container
def addWidget(self, type_, *args, **kwargs):
def add_widget(self, type_, *args, **kwargs):
"""Convenience method to add an element"""
if "parent" not in kwargs:
kwargs["parent"] = self.current_container
@ -1702,13 +1702,13 @@ def note(message, title="", level=C.XMLUI_DATA_LVL_INFO):
return note_xmlui
def quickNote(host, client, message, title="", level=C.XMLUI_DATA_LVL_INFO):
def quick_note(host, client, message, title="", level=C.XMLUI_DATA_LVL_INFO):
"""more sugar to do the whole note process"""
note_ui = note(message, title, level)
host.actionNew({"xmlui": note_ui.toXml()}, profile=client.profile)
host.action_new({"xmlui": note_ui.toXml()}, profile=client.profile)
def deferredUI(host, xmlui, chained=False):
def deferred_ui(host, xmlui, chained=False):
"""create a deferred linked to XMLUI
@param xmlui(XMLUI): instance of the XMLUI
@ -1720,15 +1720,15 @@ def deferredUI(host, xmlui, chained=False):
assert xmlui.submit_id == ""
xmlui_d = defer.Deferred()
def onSubmit(data, profile):
def on_submit(data, profile):
xmlui_d.callback(data)
return xmlui_d if chained else {}
xmlui.submit_id = host.registerCallback(onSubmit, with_data=True, one_shot=True)
xmlui.submit_id = host.register_callback(on_submit, with_data=True, one_shot=True)
return xmlui_d
def deferXMLUI(host, xmlui, action_extra=None, security_limit=C.NO_SECURITY_LIMIT,
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
@ -1736,17 +1736,17 @@ def deferXMLUI(host, xmlui, action_extra=None, security_limit=C.NO_SECURITY_LIMI
Must be an XMLUI that you can submit, with submit_id set to ''
@param profile: %(doc_profile)s
@param action_extra(None, dict): extra action to merge with xmlui
mainly used to add meta informations (see actionNew doc)
mainly used to add meta informations (see action_new doc)
@param security_limit: %(doc_security_limit)s
@param chained(bool): True if the Deferred result must be returned to the frontend
useful when backend is in a series of dialogs with an ui
@return (data): a deferred which fire the data
"""
xmlui_d = deferredUI(host, xmlui, chained)
xmlui_d = deferred_ui(host, xmlui, chained)
action_data = {"xmlui": xmlui.toXml()}
if action_extra is not None:
action_data.update(action_extra)
host.actionNew(
host.action_new(
action_data,
security_limit=security_limit,
keep_id=xmlui.submit_id,
@ -1755,7 +1755,7 @@ def deferXMLUI(host, xmlui, action_extra=None, security_limit=C.NO_SECURITY_LIMI
return xmlui_d
def deferDialog(host, message, title="Please confirm", type_=C.XMLUI_DIALOG_CONFIRM,
def defer_dialog(host, message, title="Please confirm", type_=C.XMLUI_DIALOG_CONFIRM,
options=None, action_extra=None, security_limit=C.NO_SECURITY_LIMIT, chained=False,
profile=C.PROF_KEY_NONE):
"""Create a submitable dialog and manage it with a deferred
@ -1766,7 +1766,7 @@ def deferDialog(host, message, title="Please confirm", type_=C.XMLUI_DIALOG_CONF
@param options(None, dict): if not None, will be used to update (extend) dialog_opt
arguments of XMLUI
@param action_extra(None, dict): extra action to merge with xmlui
mainly used to add meta informations (see actionNew doc)
mainly used to add meta informations (see action_new doc)
@param security_limit: %(doc_security_limit)s
@param chained(bool): True if the Deferred result must be returned to the frontend
useful when backend is in a series of dialogs with an ui
@ -1778,19 +1778,19 @@ def deferDialog(host, message, title="Please confirm", type_=C.XMLUI_DIALOG_CONF
if options is not None:
dialog_opt.update(options)
dialog = XMLUI(C.XMLUI_DIALOG, title=title, dialog_opt=dialog_opt, submit_id="")
return deferXMLUI(host, dialog, action_extra, security_limit, chained, profile)
return defer_xmlui(host, dialog, action_extra, security_limit, chained, profile)
def deferConfirm(*args, **kwargs):
"""call deferDialog and return a boolean instead of the whole data dict"""
d = deferDialog(*args, **kwargs)
def defer_confirm(*args, **kwargs):
"""call defer_dialog and return a boolean instead of the whole data dict"""
d = defer_dialog(*args, **kwargs)
d.addCallback(lambda data: C.bool(data["answer"]))
return d
# Misc other funtions
def elementCopy(
def element_copy(
element: domish.Element,
with_parent: bool = True,
with_children: bool = True
@ -1815,7 +1815,7 @@ def elementCopy(
return new_elt
def isXHTMLField(field):
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)
@ -1826,7 +1826,7 @@ class ElementParser:
# XXX: Found at http://stackoverflow.com/questions/2093400/how-to-create-twisted-words-xish-domish-element-entirely-from-raw-xml/2095942#2095942
def _escapeHTML(self, matchobj):
def _escape_html(self, matchobj):
entity = matchobj.group(1)
if entity in XML_ENTITIES:
# we don't escape XML entities
@ -1854,23 +1854,23 @@ class ElementParser:
raw_xml = "<div>{}</div>".format(raw_xml)
# avoid ParserError on HTML escaped chars
raw_xml = html_entity_re.sub(self._escapeHTML, raw_xml)
raw_xml = html_entity_re.sub(self._escape_html, raw_xml)
self.result = None
def onStart(elem):
def on_start(elem):
self.result = elem
def onEnd():
def on_end():
pass
def onElement(elem):
self.result.addChild(elem)
parser = domish.elementStream()
parser.DocumentStartEvent = onStart
parser.DocumentStartEvent = on_start
parser.ElementEvent = onElement
parser.DocumentEndEvent = onEnd
parser.DocumentEndEvent = on_end
tmp = domish.Element((None, "s"))
if force_spaces:
raw_xml = raw_xml.replace("\n", " ").replace("\t", " ")
@ -1888,8 +1888,8 @@ class ElementParser:
parse = ElementParser()
# FIXME: this method is duplicated from frontends.tools.xmlui.getText
def getText(node):
# FIXME: this method is duplicated from frontends.tools.xmlui.get_text
def get_text(node):
"""Get child text nodes of a domish.Element.
@param node (domish.Element)
@ -1902,7 +1902,7 @@ def getText(node):
return "".join(data)
def findAll(elt, namespaces=None, names=None):
def find_all(elt, namespaces=None, names=None):
"""Find child element at any depth matching criteria
@param elt(domish.Element): top parent of the elements to find
@ -1924,11 +1924,11 @@ def findAll(elt, namespaces=None, names=None):
and (not namespaces or child.uri in namespaces)
):
yield child
for found in findAll(child, namespaces, names):
for found in find_all(child, namespaces, names):
yield found
def findAncestor(
def find_ancestor(
elt,
name: str,
namespace: Optional[Union[str, Iterable[str]]] = None
@ -1958,12 +1958,12 @@ def findAncestor(
current = current.parent
def pFmtElt(elt, indent=0, defaultUri=""):
def p_fmt_elt(elt, indent=0, defaultUri=""):
"""Pretty format a domish.Element"""
strings = []
for child in elt.children:
if domish.IElement.providedBy(child):
strings.append(pFmtElt(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:
@ -1977,9 +1977,9 @@ def pFmtElt(elt, indent=0, defaultUri=""):
return '\n'.join(strings)
def ppElt(elt):
def pp_elt(elt):
"""Pretty print a domish.Element"""
print(pFmtElt(elt))
print(p_fmt_elt(elt))
# ElementTree