core (xmlui): added helper method to easily manage dialogs with a deferred
This commit is contained in:
parent
8deee28320
commit
22808f8c63
1 changed files with 45 additions and 6 deletions
|
|
@ -26,6 +26,7 @@ from xml.dom import minidom, NotFoundErr
|
|||
from wokkel import data_form
|
||||
from twisted.words.xish import domish
|
||||
from twisted.words.protocols.jabber import jid
|
||||
from twisted.internet import defer
|
||||
from sat.core import exceptions
|
||||
from collections import OrderedDict
|
||||
|
||||
|
|
@ -1048,7 +1049,7 @@ class XMLUI(object):
|
|||
top_element.setAttribute("type", panel_type)
|
||||
if title:
|
||||
top_element.setAttribute("title", title)
|
||||
self.submit_id = submit_id
|
||||
self._submit_id = submit_id
|
||||
self.session_id = session_id
|
||||
if panel_type == C.XMLUI_DIALOG:
|
||||
if dialog_opt is None:
|
||||
|
|
@ -1134,7 +1135,7 @@ class XMLUI(object):
|
|||
|
||||
def _createDialog(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] and self.submit_id is None:
|
||||
if dialog_type in [C.XMLUI_DIALOG_CONFIRM, C.XMLUI_DIALOG_FILE] and self._submit_id is None:
|
||||
raise exceptions.InternalError(_("Submit ID must be filled for this kind of dialog"))
|
||||
top_element = TopElement(self)
|
||||
level = dialog_opt.get(C.XMLUI_DATA_LVL)
|
||||
|
|
@ -1198,9 +1199,10 @@ class XMLUI(object):
|
|||
def note(message, title='', level=C.XMLUI_DATA_LVL_INFO):
|
||||
"""Sugar to easily create a Note Dialog
|
||||
|
||||
@param message: body of the note
|
||||
@param title: title of the note
|
||||
@param level: one of C.XMLUI_DATA_LVL_*
|
||||
@param message(unicode): body of the note
|
||||
@param title(unicode): title of the note
|
||||
@param level(unicode): one of C.XMLUI_DATA_LVL_*
|
||||
@return(XMLUI): instance of XMLUI
|
||||
"""
|
||||
note_xmlui = XMLUI(C.XMLUI_DIALOG, dialog_opt={
|
||||
C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
|
||||
|
|
@ -1210,8 +1212,45 @@ def note(message, title='', level=C.XMLUI_DATA_LVL_INFO):
|
|||
)
|
||||
return note_xmlui
|
||||
|
||||
# Misc other funtions
|
||||
def deferXMLUI(host, xmlui, profile):
|
||||
"""Create a deferred linked to XMLUI
|
||||
|
||||
@param xmlui(XMLUI): instance of the XMLUI
|
||||
Must be an XMLUI that you can submit, with submit_id set to ''
|
||||
@param profile: %(doc_profile)s
|
||||
@return (data): a deferred which fire the data
|
||||
"""
|
||||
assert xmlui._submit_id == '' # xmlui.submit_id can't be the empty string, but xmlui._submit_id must here
|
||||
xmlui_d = defer.Deferred()
|
||||
|
||||
def onSubmit(data, profile):
|
||||
xmlui_d.callback(data)
|
||||
return {}
|
||||
|
||||
xmlui.submit_id = host.registerCallback(onSubmit, with_data=True, one_shot=True)
|
||||
host.actionNew({'xmlui': xmlui.toXml()}, profile)
|
||||
return xmlui_d
|
||||
|
||||
def deferDialog(host, message, title=u'Please confirm', type_=C.XMLUI_DIALOG_CONFIRM, profile=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 profile: %(doc_profile)s
|
||||
@return (dict): Deferred dict
|
||||
"""
|
||||
assert profile is not None
|
||||
dialog = XMLUI(C.XMLUI_DIALOG, title=title, dialog_opt = {'type': type_, 'message': message}, submit_id='')
|
||||
return deferXMLUI(host, dialog, profile)
|
||||
|
||||
def deferConfirm(*args, **kwargs):
|
||||
"""call deferDialog and return a boolean instead of the whole data dict"""
|
||||
d = deferDialog(*args, **kwargs)
|
||||
d.addCallback(lambda data: C.bool(data['answer']))
|
||||
return d
|
||||
|
||||
# Misc other funtions
|
||||
|
||||
class ElementParser(object):
|
||||
"""callable class to parse XML string into Element
|
||||
|
|
|
|||
Loading…
Reference in a new issue