plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
This commit is contained in:
parent
744cb0c503
commit
d5c9fa5e31
2 changed files with 59 additions and 81 deletions
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue