# HG changeset patch # User Goffi # Date 1530126934 -7200 # Node ID a55a14c3cbf464d883a3e0720cd57c947800976c # Parent 56f94936df1ee0f50111e59217fcd00fdc411f8b plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code diff -r 56f94936df1e -r a55a14c3cbf4 sat/plugins/plugin_xep_0070.py --- a/sat/plugins/plugin_xep_0070.py Wed Jun 27 20:14:46 2018 +0200 +++ b/sat/plugins/plugin_xep_0070.py Wed Jun 27 21:15:34 2018 +0200 @@ -95,43 +95,21 @@ 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: diff -r 56f94936df1e -r a55a14c3cbf4 sat/tools/xml_tools.py --- a/sat/tools/xml_tools.py Wed Jun 27 20:14:46 2018 +0200 +++ b/sat/tools/xml_tools.py Wed Jun 27 21:15:34 2018 +0200 @@ -51,7 +51,8 @@ """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 @@ @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 @@ @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 @@ 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 @@ 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 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 @@ - 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 @@ - 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 @@ 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 @@ 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 @@ 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