Mercurial > libervia-backend
annotate frontends/src/wix/xmlui.py @ 297:c5554e2939dd
plugin XEP 0277: author for in request + author, updated management for out request
- a workaround is now used to parse "nick" tag (Jappix behaviour)
- author and updated can now be used in data when sendind microblog. Is no author is given, user jid is used, if no updated is given, current timestamp is used
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 18 Feb 2011 22:32:02 +0100 |
parents | b1794cbb88e5 |
children | cf005701624b |
rev | line source |
---|---|
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 """ |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 wix: a SAT frontend |
228 | 6 Copyright (C) 2009, 2010, 2011 Jérôme Poisson (goffi@goffi.org) |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 This program is free software: you can redistribute it and/or modify |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 it under the terms of the GNU General Public License as published by |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 (at your option) any later version. |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 This program is distributed in the hope that it will be useful, |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 GNU General Public License for more details. |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 along with this program. If not, see <http://www.gnu.org/licenses/>. |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 """ |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 import wx |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 import pdb |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from xml.dom import minidom |
91 | 27 from logging import debug, info, warning, error |
225
fd9b7834d98a
distutils installation script, draft
Goffi <goffi@goffi.org>
parents:
223
diff
changeset
|
28 from sat.tools.jid import JID |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 |
103 | 31 class XMLUI(wx.Frame): |
32 """Create an user interface from a SàT xml""" | |
91 | 33 |
34 def __init__(self, host, xml_data='', title="Form", options=[], misc={}): | |
92 | 35 style = wx.DEFAULT_FRAME_STYLE & ~wx.CLOSE_BOX if 'NO_CANCEL' in options else wx.DEFAULT_FRAME_STYLE #FIXME: gof: Q&D tmp hack |
103 | 36 super(XMLUI, self).__init__(None, title=title, style=style) |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 self.host = host |
91 | 39 self.options = options |
40 self.misc = misc | |
107 | 41 self.ctrl_list = {} # usefull to access ctrl |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 self.sizer = wx.BoxSizer(wx.VERTICAL) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 self.SetSizer(self.sizer) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 self.SetAutoLayout(True) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
46 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
47 #events |
91 | 48 if not 'NO_CANCEL' in self.options: |
49 self.Bind(wx.EVT_CLOSE, self.onClose, self) | |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 self.MakeModal() |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
103 | 53 self.constructUI(xml_data) |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 self.Show() |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 |
104 | 57 def __parseElems(self, node, parent): |
58 """Parse elements inside a <layout> tags, and add them to the parent sizer""" | |
59 for elem in node.childNodes: | |
103 | 60 if elem.nodeName != "elem": |
61 message=_("Unmanaged tag") | |
62 error(message) | |
63 raise Exception(message) | |
64 _proportion = 0 | |
106 | 65 id = elem.getAttribute("id") |
103 | 66 name = elem.getAttribute("name") |
67 type = elem.getAttribute("type") | |
68 value = elem.getAttribute("value") if elem.hasAttribute('value') else u'' | |
69 if type=="empty": | |
70 ctrl = wx.Window(parent, -1) | |
71 elif type=="text": | |
72 try: | |
73 value = elem.childNodes[0].wholeText | |
149 | 74 except IndexError: |
103 | 75 warning (_("text node has no child !")) |
76 ctrl = wx.StaticText(parent, -1, value) | |
77 elif type=="label": | |
78 ctrl = wx.StaticText(parent, -1, value+": ") | |
79 elif type=="string": | |
80 ctrl = wx.TextCtrl(parent, -1, value) | |
107 | 81 self.ctrl_list[name] = ({'type':type, 'control':ctrl}) |
103 | 82 _proportion = 1 |
83 elif type=="password": | |
84 ctrl = wx.TextCtrl(parent, -1, value, style=wx.TE_PASSWORD) | |
107 | 85 self.ctrl_list[name] = ({'type':type, 'control':ctrl}) |
86 _proportion = 1 | |
87 elif type=="textbox": | |
88 ctrl = wx.TextCtrl(parent, -1, value, style=wx.TE_MULTILINE) | |
89 self.ctrl_list[name] = ({'type':type, 'control':ctrl}) | |
103 | 90 _proportion = 1 |
183
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
91 elif type=="bool": |
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
92 ctrl = wx.CheckBox(panel, -1, "", style = wx.CHK_2STATE) |
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
93 ctrl.SetValue(value=="true") |
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
94 self.ctrl_list[name] = ({'type':type, 'control':ctrl}) |
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
95 _proportion = 1 |
103 | 96 elif type=="list": |
107 | 97 style=wx.LB_MULTIPLE if elem.getAttribute("multi")=='yes' else wx.LB_SINGLE |
98 ctrl = wx.ListBox(parent, -1, choices=[option.getAttribute("value") for option in elem.getElementsByTagName("option")], style=style) | |
99 self.ctrl_list[name] = ({'type':type, 'control':ctrl}) | |
103 | 100 _proportion = 1 |
105 | 101 elif type=="button": |
106 | 102 callback_id = elem.getAttribute("callback_id") |
103 ctrl = wx.Button(parent, -1, value) | |
107 | 104 ctrl.param_id = (callback_id,[field.getAttribute('name') for field in elem.getElementsByTagName("field_back")]) |
106 | 105 parent.Bind(wx.EVT_BUTTON, self.onButtonClicked, ctrl) |
103 | 106 else: |
107 error(_("FIXME FIXME FIXME: type [%s] is not implemented") % type) #FIXME ! | |
108 raise NotImplementedError | |
104 | 109 parent.sizer.Add(ctrl, _proportion, flag=wx.EXPAND) |
103 | 110 |
104 | 111 def __parseChilds(self, parent, current_param, elem, wanted = ['layout']): |
112 """Recursively parse childNodes of an elemen | |
113 @param parent: parent wx.Window | |
114 @param current_param: current wx.Window (often wx.Panel) or None if we must create one | |
115 @param elem: element from which childs will be parsed | |
116 @param wanted: list of tag names that can be present in the childs to be SàT XMLUI compliant""" | |
117 for node in elem.childNodes: | |
118 if wanted and not node.nodeName in wanted: | |
119 raise Exception("Invalid XMLUI") #TODO: make a custom exception | |
120 if node.nodeName == "layout": | |
105 | 121 _proportion = 0 |
104 | 122 type = node.getAttribute('type') |
123 if type == "tabs": | |
124 current = wx.Notebook(parent, -1, style=wx.NB_LEFT if self.type=='param' else 0) | |
125 self.__parseChilds(current, None, node, ['category']) | |
105 | 126 _proportion = 1 |
104 | 127 else: |
128 if current_param == None: | |
129 current = wx.Panel(parent, -1) | |
130 else: | |
131 current = current_param | |
132 if type == "vertical": | |
133 current.sizer = wx.BoxSizer(wx.VERTICAL) | |
134 elif type == "pairs": | |
135 current.sizer = wx.FlexGridSizer(cols=2) | |
136 current.sizer.AddGrowableCol(1) #The growable column need most of time to be the right one in pairs | |
137 else: | |
138 warning(_("Unknown layout, using default one")) | |
139 current.sizer = wx.BoxSizer(wx.VERTICAL) | |
140 current.SetSizer(current.sizer) | |
141 self.__parseElems(node, current) | |
142 if parent: | |
105 | 143 parent.sizer.Add(current, _proportion, flag=wx.EXPAND) |
104 | 144 elif node.nodeName == "category": |
145 name = node.getAttribute('name') | |
183
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
146 label = node.getAttribute('label') |
104 | 147 if not node.nodeName in wanted or not name or not isinstance(parent,wx.Notebook): |
148 raise Exception("Invalid XMLUI") #TODO: make a custom exception | |
149 notebook = parent | |
150 tab_panel = wx.Panel(notebook, -1) | |
151 tab_panel.sizer = wx.BoxSizer(wx.VERTICAL) | |
152 tab_panel.SetSizer(tab_panel.sizer) | |
183
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
153 notebook.AddPage(tab_panel, label or name) |
104 | 154 self.__parseChilds(tab_panel, None, node, ['layout']) |
155 | |
156 else: | |
157 message=_("Unknown tag") | |
158 error(message) | |
159 raise Exception(message) #TODO: raise a custom exception here | |
103 | 160 |
161 | |
162 def constructUI(self, xml_data): | |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
163 panel=wx.Panel(self) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
164 panel.sizer = wx.BoxSizer(wx.VERTICAL) |
104 | 165 |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
166 cat_dom = minidom.parseString(xml_data.encode('utf-8')) |
103 | 167 top= cat_dom.documentElement |
168 self.type = top.getAttribute("type") | |
107 | 169 self.title = top .getAttribute("title") |
170 if self.title: | |
171 self.SetTitle(self.title) | |
103 | 172 if top.nodeName != "sat_xmlui" or not self.type in ['form', 'param', 'window']: |
104 | 173 raise Exception("Invalid XMLUI") #TODO: make a custom exception |
103 | 174 |
104 | 175 self.__parseChilds(panel, None, cat_dom.documentElement) |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
176 |
103 | 177 if self.type == 'form': |
178 dialogButtons = wx.StdDialogButtonSizer() | |
179 submitButton = wx.Button(panel,wx.ID_OK, label=_("Submit")) | |
180 dialogButtons.AddButton(submitButton) | |
181 panel.Bind(wx.EVT_BUTTON, self.onFormSubmitted, submitButton) | |
182 if not 'NO_CANCEL' in self.options: | |
183 cancelButton = wx.Button(panel,wx.ID_CANCEL) | |
184 dialogButtons.AddButton(cancelButton) | |
185 panel.Bind(wx.EVT_BUTTON, self.onFormCancelled, cancelButton) | |
186 dialogButtons.Realize() | |
187 panel.sizer.Add(dialogButtons, flag=wx.ALIGN_CENTER_HORIZONTAL) | |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
188 |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
189 panel.SetSizer(panel.sizer) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
190 panel.SetAutoLayout(True) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 panel.sizer.Fit(self) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
192 self.sizer.Add(panel, 1, flag=wx.EXPAND) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 cat_dom.unlink() |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
194 |
106 | 195 ###events |
196 | |
197 def onButtonClicked(self, event): | |
198 """Called when a button is pushed""" | |
107 | 199 callback_id, fields = event.GetEventObject().param_id |
106 | 200 data = {"callback_id":callback_id} |
107 | 201 for field in fields: |
202 ctrl = self.ctrl_list[field] | |
203 if isinstance(ctrl['control'], wx.ListBox): | |
204 data[field] = '\t'.join([ctrl['control'].GetString(idx) for idx in ctrl['control'].GetSelections()]) | |
205 else: | |
206 data[field] = ctrl['control'].GetValue() | |
207 | |
135
7452ac3818e7
Core, wix: added profile management for RegisterNewAccount method, and LaunchAction
Goffi <goffi@goffi.org>
parents:
107
diff
changeset
|
208 id = self.host.bridge.launchAction("button", data, profile_key = self.host.profile) |
106 | 209 self.host.current_action_ids.add(id) |
210 event.Skip() | |
211 | |
36 | 212 def onFormSubmitted(self, event): |
213 """Called when submit button is clicked""" | |
70 | 214 debug(_("Submitting form")) |
36 | 215 data = [] |
107 | 216 for ctrl_name in self.ctrl_list: |
217 ctrl = self.ctrl_list[ctrl_name] | |
91 | 218 if isinstance(ctrl['control'], wx.ListBox): |
107 | 219 data.append((ctrl_name, ctrl['control'].GetStringSelection())) |
183
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
220 elif isinstance(ctrl['control'], wx.CheckBox): |
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
149
diff
changeset
|
221 data.append((ctrl_name, "true" if ctrl['control'].GetValue() else "false")) |
91 | 222 else: |
107 | 223 data.append((ctrl_name, ctrl['control'].GetValue())) |
91 | 224 if self.misc.has_key('action_back'): #FIXME FIXME FIXME: WTF ! Must be cleaned |
225 id = self.misc['action_back']("SUBMIT",self.misc['target'], data) | |
226 self.host.current_action_ids.add(id) | |
227 elif self.misc.has_key('callback'): | |
228 self.misc['callback'](data) | |
229 else: | |
230 warning (_("The form data is not sent back, the type is not managed properly")) | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
231 self.MakeModal(False) |
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
232 self.Destroy() |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
233 |
36 | 234 def onFormCancelled(self, event): |
235 """Called when cancel button is clicked""" | |
70 | 236 debug(_("Cancelling form")) |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
237 self.MakeModal(False) |
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
36
diff
changeset
|
238 self.Close() |
36 | 239 |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
240 def onClose(self, event): |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
241 """Close event: we have to send the form.""" |
70 | 242 debug(_("close")) |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
243 self.MakeModal(False) |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
244 event.Skip() |
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
245 |