plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code

This commit is contained in:
Goffi 2018-06-27 21:15:34 +02:00
commit d5c9fa5e31
2 changed files with 59 additions and 81 deletions

View file

@ -95,43 +95,21 @@ class XEP_0070(object):
auth_method = auth_elt["method"]
auth_url = auth_elt["url"]
self._dictRequest[client] = (auth_id, auth_method, auth_url, stanzaType, elt)
title = D_(u"Auth confirmation")
message = D_(u"{auth_url} needs to validate your identity, do you agree?\n"
u"Validation code : {auth_id}\n\n"
u"Please check that this code is the same as on {auth_url}"
).format(auth_url=auth_url, auth_id=auth_id)
d = xml_tools.deferConfirm(self.host, message=message, title=title,
profile=client.profile)
d.addCallback(self._authRequestCallback, client)
confirm_ui = xml_tools.XMLUI("form", title=D_(u"Auth confirmation"), submit_id="")
confirm_ui.addText(
D_(u"{} needs to validate your identity, do you agree ?".format(auth_url))
)
confirm_ui.addText(D_(u"Validation code : {}".format(auth_id)))
confirm_ui.addText(
D_(u"Please check that this code is the same as on {}".format(auth_url))
)
confirm_ui.addText(u"")
confirm_ui.addText(D_(u"Submit to authorize, cancel otherwise."))
d = xml_tools.deferredUI(self.host, confirm_ui, chained=False)
d.addCallback(self._authRequestCallback, client.profile)
self.host.actionNew({u"xmlui": confirm_ui.toXml()}, profile=client.profile)
def _authRequestCallback(self, result, profile):
client = self.host.getClient(profile)
def _authRequestCallback(self, authorized, client):
try:
cancelled = result["cancelled"]
auth_id, auth_method, auth_url, stanzaType, elt = self._dictRequest.pop(
client)
except KeyError:
cancelled = False
authorized = False
if cancelled:
auth_id, auth_method, auth_url, stanzaType, elt = self._dictRequest[client]
del self._dictRequest[client]
authorized = False
else:
try:
auth_id, auth_method, auth_url, stanzaType, elt = self._dictRequest[
client
]
del self._dictRequest[client]
authorized = True
except KeyError:
authorized = False
if authorized:
if stanzaType == IQ:

View file

@ -51,7 +51,8 @@ def _dataFormField2XMLUIData(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).
@param field (data_form.Field): a field with attributes "value", "fieldType", "label" and "var"
@param field (data_form.Field): a field with attributes "value", "fieldType",
"label" and "var"
@param read_only (bool): if True and it makes sense, create a read only input widget
@return: a tuple (widget_type, widget_args, widget_kwargs)
"""
@ -749,7 +750,8 @@ class AdvancedListContainer(Container):
@param selectable: one of:
'no': nothing is done
'single': one row can be selected
@param auto_index: if True, indexes will be generated by frontends, starting from 0
@param auto_index: if True, indexes will be generated by frontends,
starting from 0
@return: created element
"""
assert selectable in ("no", "single")
@ -1049,7 +1051,8 @@ class ListWidget(InputWidget):
@param xmlui
@param options (list[option]): each option can be given as:
- a single string if the label and the value are the same
- a tuple with a couple of string (value,label) if the label and the value differ
- a tuple with a couple of string (value,label) if the label and the
value differ
@param selected (list[string]): list of the selected values
@param styles (iterable[string]): flags to set the behaviour of the list
can be:
@ -1058,7 +1061,8 @@ class ListWidget(InputWidget):
useful when only the list itself is needed
- extensible: can be extended by user (i.e. new options can be added)
- reducible: can be reduced by user (i.e. options can be removed)
- inline: hint that this list should be displayed on a single line (e.g. list of labels)
- inline: hint that this list should be displayed on a single line
(e.g. list of labels)
@param name (string)
@param parent
"""
@ -1070,7 +1074,8 @@ class ListWidget(InputWidget):
if u"noselect" in styles and (u"multi" in styles or selected):
raise exceptions.DataError(
_(
u'"multi" flag and "selected" option are not compatible with "noselect" flag'
u'"multi" flag and "selected" option are not compatible with '
u'"noselect" flag'
)
)
if not options:
@ -1210,21 +1215,15 @@ class FileElement(Element):
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
- C.XMLUI_WINDOW (new window)
- C.XMLUI_POPUP
- C.XMLUI_FORM (form, depend of the frontend, usually a panel with cancel/submit buttons)
- C.XMLUI_FORM (form, depend of the frontend, usually a panel with
cancel/submit buttons)
- C.XMLUI_PARAM (parameters, presentation depend of the frontend)
- C.XMLUI_DIALOG (one common dialog, presentation depend of frontend)
@param container: disposition of elements, one of:
@ -1233,18 +1232,26 @@ class XMLUI(object):
- pairs: elements come on two aligned columns
(usually one for a label, the next for the element)
- label: associations of one LabelWidget or EmptyWidget with an other widget
similar to pairs but specialized in LabelWidget, and not necessarily arranged in 2 columns
similar to pairs but specialized in LabelWidget,
and not necessarily arranged in 2 columns
- tabs: elemens are in categories with tabs (notebook)
@param dialog_opt: only used if panel_type == C.XMLUI_DIALOG. Dictionnary (string/string) where key can be:
@param dialog_opt: only used if panel_type == C.XMLUI_DIALOG.
Dictionnary (string/string) where key can be:
- C.XMLUI_DATA_TYPE: type of dialog, value can be:
- C.XMLUI_DIALOG_MESSAGE (default): an information/error message. Action of user is necessary to close the dialog. Usually the frontend display a classic popup
- C.XMLUI_DIALOG_NOTE: like a C.XMLUI_DIALOG_MESSAGE, but action of user is not necessary to close, at frontend choice (it can be closed after a timeout). Usually the frontend display as a timed out notification
- C.XMLUI_DIALOG_MESSAGE (default): an information/error message.
Action of user is necessary to close the dialog.
Usually the frontend display a classic popup.
- C.XMLUI_DIALOG_NOTE: like a C.XMLUI_DIALOG_MESSAGE, but action of user
is not necessary to close, at frontend choice (it can be closed after
a timeout). Usually the frontend display as a timed out notification
- C.XMLUI_DIALOG_CONFIRM: dialog with 2 choices (usualy "Ok"/"Cancel").
returned data can contain:
- "answer": "true" if answer is "ok", "yes" or equivalent, "false" else
- "answer": "true" if answer is "ok", "yes" or equivalent,
"false" else
- C.XLMUI_DIALOG_FILE: a file selection dialog
returned data can contain:
- "cancelled": "true" if dialog has been cancelled, not present or "false" else
- "cancelled": "true" if dialog has been cancelled, not present
or "false" else
- "path": path of the choosed file/dir
- C.XMLUI_DATA_MESS: message shown in dialog
- C.XMLUI_DATA_LVL: one of:
@ -1252,16 +1259,20 @@ class XMLUI(object):
- C.XMLUI_DATA_LVL_WARNING: attention of user is important
- C.XMLUI_DATA_LVL_ERROR: something went wrong
- C.XMLUI_DATA_BTNS_SET: one of:
- C.XMLUI_DATA_BTNS_SET_OKCANCEL (default): classical "OK" and "Cancel" set
- C.XMLUI_DATA_BTNS_SET_YESNO: a translated "yes" for OK, and "no" for Cancel
- C.XMLUI_DATA_BTNS_SET_OKCANCEL (default): classical "OK" and "Cancel"
set
- C.XMLUI_DATA_BTNS_SET_YESNO: a translated "yes" for OK, and "no" for
Cancel
- C.XMLUI_DATA_FILETYPE: only used for file dialogs, one of:
- C.XMLUI_DATA_FILETYPE_FILE: a file path is requested
- C.XMLUI_DATA_FILETYPE_DIR: a dir path is requested
- C.XMLUI_DATA_FILETYPE_DEFAULT: same as C.XMLUI_DATA_FILETYPE_FILE
@param title: title or default if None
@param submit_id: callback id to call for panel_type we can submit (form, param, dialog)
@param session_id: use to keep a session attached to the dialog, must be returned by frontends
@param submit_id: callback id to call for panel_type we can submit (form, param,
dialog)
@param session_id: use to keep a session attached to the dialog, must be
returned by frontends
@attribute named_widgets(dict): map from name to widget
"""
self._introspect() # FIXME: why doing that on each XMLUI ? should be done once
@ -1505,14 +1516,8 @@ def deferredUI(host, xmlui, chained=False):
return xmlui_d
def deferXMLUI(
host,
xmlui,
action_extra=None,
security_limit=C.NO_SECURITY_LIMIT,
chained=False,
profile=C.PROF_KEY_NONE,
):
def deferXMLUI(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
@ -1538,23 +1543,16 @@ def deferXMLUI(
return xmlui_d
def deferDialog(
host,
message,
title=u"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,
):
def deferDialog(host, message, title=u"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
@param message(unicode): message to display
@param title(unicode): title of the dialog
@param type(unicode): dialog type (C.XMLUI_DIALOG_*)
@param options(None, dict): if not None, will be used to update (extend) dialog_opt arguments of XMLUI
@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)
@param security_limit: %(doc_security_limit)s
@ -1601,8 +1599,10 @@ class ElementParser(object):
def __call__(self, raw_xml, force_spaces=False, namespace=None):
"""
@param raw_xml(unicode): the raw XML
@param force_spaces (bool): if True, replace occurrences of '\n' and '\t' with ' '.
@param namespace(unicode, None): if set, use this namespace for the wrapping element
@param force_spaces (bool): if True, replace occurrences of '\n' and '\t'
with ' '.
@param namespace(unicode, None): if set, use this namespace for the wrapping
element
"""
# we need to wrap element in case
# there is not a unique one on the top