changeset 760:73a0077f80cc

backend, frontends: XMLUI refactoring: - session_id is resent in result data if found in incoming data - list now use distinct labels and values (label is the one displayed, value is the one used for everything else) - misc refactoring /!\ urwid SàtExt must be updated ! /!\
author Goffi <goffi@goffi.org>
date Tue, 24 Dec 2013 15:19:18 +0100
parents 93bd868b8fb6
children 2f8d72226bc0
files frontends/src/primitivus/xmlui.py frontends/src/wix/xmlui.py src/tools/xml_tools.py
diffstat 3 files changed, 46 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/src/primitivus/xmlui.py	Tue Dec 24 15:19:08 2013 +0100
+++ b/frontends/src/primitivus/xmlui.py	Tue Dec 24 15:19:18 2013 +0100
@@ -105,7 +105,7 @@
                 self.ctrl_list[name] = ({'type':type_, 'control':ctrl})
             elif type_=="list":
                 style=[] if elem.getAttribute("multi")=='yes' else ['single']
-                ctrl = sat_widgets.List(options=[option.getAttribute("value") for option in elem.getElementsByTagName("option")], style=style, on_change=self.onParamChange if self.type == "param" else None)
+                ctrl = sat_widgets.List(options=[(option.getAttribute("value"), option.getAttribute("label")) for option in elem.getElementsByTagName("option")], style=style, on_change=self.onParamChange if self.type == "param" else None)
                 ctrl.selectValue(elem.getAttribute("value"))
                 self.ctrl_list[name] = ({'type':type_, 'control':ctrl})
             elif type_=="button":
@@ -178,6 +178,7 @@
         top=cat_dom.documentElement
         self.type = top.getAttribute("type")
         self.title = top.getAttribute("title") or self.title
+        self.session_id = top.getAttribute("session_id") or None
         self.submit_id = top.getAttribute("submit") or None
         if top.nodeName != "sat_xmlui" or not self.type in ['form', 'param', 'window']:
             raise InvalidXMLUI
@@ -251,24 +252,27 @@
         self.param_changed.add(widget)
 
     def onFormSubmitted(self, button):
-        data = []
+        selected_values = []
         for ctrl_name in self.ctrl_list:
             ctrl = self.ctrl_list[ctrl_name]
             if isinstance(ctrl['control'], sat_widgets.List):
-                data.append((ctrl_name, u'\t'.join(ctrl['control'].getSelectedValues())))
+                selected_values.append((ctrl_name, u'\t'.join([option.value for option in ctrl['control'].getSelectedValues()])))
             elif isinstance(ctrl['control'], urwid.CheckBox):
-                data.append((ctrl_name, "true" if ctrl['control'].get_state() else "false"))
+                selected_values.append((ctrl_name, "true" if ctrl['control'].get_state() else "false"))
             else:
-                data.append((ctrl_name, ctrl['control'].get_edit_text()))
+                selected_values.append((ctrl_name, ctrl['control'].get_edit_text()))
         if self.misc.has_key('action_back'): #FIXME FIXME FIXME: WTF ! Must be cleaned
             raise NotImplementedError
         elif 'callback' in self.misc: # FIXME: this part is not needed anymore
             try:
-                self.misc['callback'](data, submit_id=self.submit_id, *self.misc['callback_args'])
+                self.misc['callback'](selected_values, submit_id=self.submit_id, *self.misc['callback_args'])
             except KeyError:
-                self.misc['callback'](data, submit_id=self.submit_id)
+                self.misc['callback'](selected_values, submit_id=self.submit_id)
         elif self.submit_id is not None:
-            self.host.launchAction(self.submit_id, dict(data), profile_key=self.host.profile)
+            data = dict(selected_values)
+            if self.session_id is not None:
+                data["session_id"] = self.session_id
+            self.host.launchAction(self.submit_id, data, profile_key=self.host.profile)
 
         else:
             warning (_("The form data is not sent back, the type is not managed properly"))
--- a/frontends/src/wix/xmlui.py	Tue Dec 24 15:19:08 2013 +0100
+++ b/frontends/src/wix/xmlui.py	Tue Dec 24 15:19:18 2013 +0100
@@ -95,8 +95,10 @@
                 _proportion = 1
             elif type=="list":
                 style=wx.LB_MULTIPLE if elem.getAttribute("multi")=='yes' else wx.LB_SINGLE
-                ctrl = wx.ListBox(parent, -1, choices=[option.getAttribute("value") for option in elem.getElementsByTagName("option")], style=style)
-                self.ctrl_list[name] = ({'type':type, 'control':ctrl})
+                _options = [(option.getAttribute("label"), option.getAttribute("value")) for option in elem.getElementsByTagName("option")]
+                attr_map = {label: value for label, value in _options}
+                ctrl = wx.ListBox(parent, -1, choices=[option[0] for option in _options], style=style)
+                self.ctrl_list[name] = ({'type':type, 'control':ctrl, 'attr_map': attr_map})
                 _proportion = 1
             elif type=="button":
                 callback_id = elem.getAttribute("callback_id")
@@ -167,6 +169,7 @@
         top= cat_dom.documentElement
         self.type = top.getAttribute("type")
         self.title = top .getAttribute("title")
+        self.session_id = top.getAttribute("session_id") or None
         self.submit_id = top.getAttribute("submit") or None
         if self.title:
             self.SetTitle(self.title)
@@ -211,23 +214,27 @@
     def onFormSubmitted(self, event):
         """Called when submit button is clicked"""
         debug(_("Submitting form"))
-        data = []
+        selected_values = []
         for ctrl_name in self.ctrl_list:
             ctrl = self.ctrl_list[ctrl_name]
             if isinstance(ctrl['control'], wx.ListBox):
-                data.append((ctrl_name, ctrl['control'].GetStringSelection()))
+                label = ctrl['control'].GetStringSelection()
+                value = ctrl['attr_map'][label]
+                selected_values.append((ctrl_name, value))
             elif isinstance(ctrl['control'], wx.CheckBox):
-                data.append((ctrl_name, "true" if ctrl['control'].GetValue() else "false"))
+                selected_values.append((ctrl_name, "true" if ctrl['control'].GetValue() else "false"))
             else:
-                data.append((ctrl_name, ctrl['control'].GetValue()))
+                selected_values.append((ctrl_name, ctrl['control'].GetValue()))
         if self.misc.has_key('action_back'): #FIXME FIXME FIXME: WTF ! Must be cleaned
-            id = self.misc['action_back']("SUBMIT",self.misc['target'], data)
+            id = self.misc['action_back']("SUBMIT",self.misc['target'], selected_values)
             self.host.current_action_ids.add(id)
         elif self.misc.has_key('callback'):
-            self.misc['callback'](data)
+            self.misc['callback'](selected_values)
 
         elif self.submit_id is not None:
             data = dict(selected_values)
+            if self.session_id is not None:
+                data["session_id"] = self.session_id
             self.host.launchAction(self.submit_id, data, profile_key=self.host.profile)
         else:
             warning (_("The form data is not sent back, the type is not managed properly"))
--- a/src/tools/xml_tools.py	Tue Dec 24 15:19:08 2013 +0100
+++ b/src/tools/xml_tools.py	Tue Dec 24 15:19:18 2013 +0100
@@ -219,7 +219,7 @@
 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, layout="vertical", title=None, submit_id=None):
+    def __init__(self, panel_type, layout="vertical", title=None, submit_id=None, session_id=None):
         """Init SàT XML Panel
         @param panel_type: one of
             - window (new window)
@@ -234,9 +234,10 @@
         @param title: title or default if None
         @param submit_id: callback id to call for panel_type we can submit (form, param)
         """
-        if not panel_type in ['window', 'form', 'param']:
-            error(_("Unknown panel type [%s]") % panel_type)
-            assert(False)
+        if panel_type not in ['window', 'form', 'param']:
+            raise exceptions.DataError(_("Unknown panel type [%s]") % panel_type)
+        if panel_type == 'form' and submit_id is None:
+            raise exceptions.DataError(_("form XMLUI need a submit_id"))
         self.type_ = panel_type
         impl = minidom.getDOMImplementation()
 
@@ -247,6 +248,8 @@
             top_element.setAttribute("title", title)
         if submit_id:
             top_element.setAttribute("submit", submit_id)
+        if session_id is not None:
+            top_element.setAttribute("session_id", session_id)
         self.parentTabsLayout = None  # used only we have 'tabs' layout
         self.currentCategory = None  # used only we have 'tabs' layout
         self.currentLayout = None
@@ -255,6 +258,12 @@
     def __del__(self):
         self.doc.unlink()
 
+    def setSessionId(self, session_id):
+        assert(session_id)
+        top_element = self.doc.documentElement
+        top_element.setAttribute("session_id", session_id)
+
+
     def _createLayout(self, layout, parent=None):
         """Create a layout element
         @param type: layout type (cf init doc)
@@ -415,7 +424,12 @@
         @param parent: multi-values element"""
         for option in options:
             opt = self.doc.createElement('option')
-            opt.setAttribute('value', option)
+            if isinstance(option, basestring):
+                value, label = option, option
+            elif isinstance(option, tuple):
+                value, label = option
+            opt.setAttribute('value', value)
+            opt.setAttribute('label', label)
             parent.appendChild(opt)
 
     # Advanced list