Mercurial > libervia-backend
annotate tools/xml_tools.py @ 104:5458ac1380cc
XMLUI: added tabs layout
xmltools: tabs layout are added, and a new addCategory method is used to add tabs
wix: tabs layout are managed with notebook
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 23 Jun 2010 14:55:04 +0800 |
parents | 6be927a465ed |
children | d2630fba8dfd |
rev | line source |
---|---|
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/python |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 """ |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 SAT: a jabber client |
57 | 6 Copyright (C) 2009, 2010 Jérôme Poisson (goffi@goffi.org) |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 This program is free software: you can redistribute it and/or modify |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 it under the terms of the GNU General Public License as published by |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 the Free Software Foundation, either version 3 of the License, or |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 (at your option) any later version. |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 This program is distributed in the hope that it will be useful, |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 but WITHOUT ANY WARRANTY; without even the implied warranty of |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 GNU General Public License for more details. |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 You should have received a copy of the GNU General Public License |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 along with this program. If not, see <http://www.gnu.org/licenses/>. |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 """ |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 from logging import debug, info, error |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 from xml.dom import minidom |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
24 from wokkel import data_form |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 import pdb |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 |
102 | 27 """This library help manage XML used in SàT (parameters, registration, etc) """ |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 |
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
102 | 30 def dataForm2xml(form): |
31 """Take a data form (xep-0004, Wokkel's implementation) and convert it to a SàT xml""" | |
32 | |
103 | 33 form_panel = XMLUI("form", "vertical") |
102 | 34 |
104 | 35 |
102 | 36 if form.instructions: |
103 | 37 form_panel.addText('\n'.join(form.instructions), 'instructions') |
38 | |
39 form_panel.changeLayout("pairs") | |
40 | |
102 | 41 for field in form.fieldList: |
42 if field.fieldType == 'fixed': | |
43 __field_type = 'text' | |
44 elif field.fieldType == 'text-single': | |
45 __field_type = "string" | |
46 elif field.fieldType == 'text-private': | |
47 __field_type = "password" | |
48 elif field.fieldType == 'list-single': | |
49 __field_type = "list" | |
50 else: | |
51 error (u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType) | |
52 __field_type = "string" | |
35
c45deebb40a5
Wix: Registration form management (not finished yet)
Goffi <goffi@goffi.org>
parents:
33
diff
changeset
|
53 |
103 | 54 if field.label: |
55 form_panel.addLabel(field.label) | |
56 else: | |
57 form_panel.addEmpty() | |
58 | |
59 elem = form_panel.addElement(__field_type, field.var, None, field.value, [option.value for option in field.options]) | |
60 return form_panel.toXml() | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
61 |
102 | 62 def tupleList2dataForm(values): |
63 """convert a list of tuples (name,value) to a wokkel submit data form""" | |
64 form = data_form.Form('submit') | |
65 for value in values: | |
66 field = data_form.Field(var=value[0], value=value[1]) | |
67 form.addField(field) | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
68 |
102 | 69 return form |
103 | 70 |
71 class XMLUI: | |
72 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" | |
73 | |
74 def __init__(self, panel_type, layout="vertical"): | |
75 """Init SàT XML Panel | |
76 @param panel_type: one of | |
77 - window (new window) | |
78 - form (formulaire, depend of the frontend, usually a panel with cancel/submit buttons) | |
79 - param (parameters, presentatio depend of the frontend) | |
80 @param layout: disposition of elements, one of: | |
81 - VERTICAL: elements are disposed up to bottom | |
82 - HORIZONTAL: elements are disposed left to right | |
83 - PAIRS: elements come on two aligned columns | |
84 (usually one for a label, the next for the element) | |
85 """ | |
86 if not panel_type in ['window', 'form', 'param']: | |
87 error(_("Unknown panel type [%s]") % panel_type) | |
88 assert(False) | |
89 self.type = panel_type | |
90 impl = minidom.getDOMImplementation() | |
91 | |
92 self.doc = impl.createDocument(None, "sat_xmlui", None) | |
93 top_element = self.doc.documentElement | |
94 top_element.setAttribute("type", panel_type) | |
104 | 95 self.parentTabsLayout = None #used only we have 'tabs' layout |
96 self.currentCategory = None #used only we have 'tabs' layout | |
97 self.changeLayout(layout) | |
103 | 98 |
99 def __del__(self): | |
100 self.doc.unlink() | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
101 |
103 | 102 def __createLayout(self, layout, parent=None): |
103 """Create a layout element | |
104 @param type: layout type (cf init doc) | |
105 @parent: parent element or None | |
106 """ | |
104 | 107 if not layout in ['vertical', 'horizontal', 'pairs', 'tabs']: |
103 | 108 error (_("Unknown layout type [%s]") % layout) |
109 assert (False) | |
110 layout_elt = self.doc.createElement('layout') | |
111 layout_elt.setAttribute('type',layout) | |
112 if parent != None: | |
113 parent.appendChild(layout_elt) | |
114 return layout_elt | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
115 |
103 | 116 def __createElem(self, type, name=None, parent = None): |
117 """Create an element | |
118 @param type: one of | |
119 - empty: empty element (usefull to skip something in a layout, e.g. skip first element in a PAIRS layout) | |
120 - text: text to be displayed in an multi-line area, e.g. instructions | |
121 @param name: name of the element or None | |
122 @param parent: parent element or None | |
123 """ | |
124 elem = self.doc.createElement('elem') | |
125 if name: | |
126 elem.setAttribute('name', name) | |
127 elem.setAttribute('type', type) | |
128 if parent != None: | |
129 parent.appendChild(elem) | |
130 return elem | |
131 | |
132 def changeLayout(self, layout): | |
133 """Change the current layout""" | |
104 | 134 self.currentLayout = self.__createLayout(layout, self.currentCategory if self.currentCategory else self.doc.documentElement) |
135 if layout == "tabs": | |
136 self.parentTabsLayout = self.currentLayout | |
103 | 137 |
138 | |
139 def addEmpty(self, name=None): | |
140 """Add a multi-lines text""" | |
141 elem = self.__createElem('empty', name, self.currentLayout) | |
142 | |
143 def addText(self, text, name=None): | |
144 """Add a multi-lines text""" | |
145 elem = self.__createElem('text', name, self.currentLayout) | |
146 text = self.doc.createTextNode(text) | |
147 elem.appendChild(text) | |
148 | |
149 def addLabel(self, text, name=None): | |
150 """Add a single line text, mainly useful as label before element""" | |
151 elem = self.__createElem('label', name, self.currentLayout) | |
152 elem.setAttribute('value', text) | |
153 | |
154 def addString(self, name=None, value=None): | |
155 """Add a string box""" | |
156 elem = self.__createElem('string', name, self.currentLayout) | |
157 if value: | |
158 elem.setAttribute('value', value) | |
159 | |
160 def addPassword(self, name=None, value=None): | |
161 """Add a password box""" | |
162 elem = self.__createElem('password', name, self.currentLayout) | |
163 if value: | |
164 elem.setAttribute('value', value) | |
165 | |
166 def addList(self, options, name=None, value=None): | |
167 """Add a list of choices""" | |
168 assert (options) | |
169 elem = self.__createElem('list', name, self.currentLayout) | |
170 self.addOptions(options, elem) | |
171 if value: | |
172 elem.setAttribute('value', value) | |
173 | |
174 def addElement(self, type, name = None, content = None, value = None, options = None): | |
175 """Convenience method to add element, the params correspond to the ones in addSomething methods""" | |
176 if type == 'empty': | |
177 self.addEmpty(name) | |
178 elif type == 'text': | |
179 assert(content) | |
180 self.addText(content, name) | |
181 elif type == 'label': | |
182 assert(value) | |
183 elif type == 'string': | |
184 self.addString(name, value) | |
185 elif type == 'password': | |
186 self.addPassword(name, value) | |
187 elif type == 'list': | |
188 self.addList(options, name, value) | |
189 | |
190 def addOptions(self, options, parent): | |
191 """Add options to a multi-values element (e.g. list) | |
192 @param parent: multi-values element""" | |
193 for option in options: | |
194 opt = self.doc.createElement('option') | |
195 opt.setAttribute('value', option) | |
196 parent.appendChild(opt) | |
197 | |
104 | 198 def addCategory(self, name, layout): |
199 """Add a category to current layout (must be a tabs layout)""" | |
200 assert(layout != 'tabs') | |
201 if not self.parentTabsLayout: | |
202 error(_("Trying to add a category without parent tabs layout")) | |
203 assert(False) | |
204 if self.parentTabsLayout.getAttribute('type') != 'tabs': | |
205 error(_("parent layout of a category is not tabs")) | |
206 assert(False) | |
207 self.currentCategory = cat = self.doc.createElement('category') | |
208 cat.setAttribute('name', name) | |
209 self.changeLayout(layout) | |
210 self.parentTabsLayout.appendChild(cat) | |
211 | |
103 | 212 def toXml(self): |
213 """return the XML representation of the panel""" | |
214 return self.doc.toxml() |