Mercurial > libervia-backend
comparison src/tools/xml_tools.py @ 590:56531f9e9ac7
Fix pep8 support in src/tools.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Fri, 18 Jan 2013 17:55:35 +0100 |
parents | beaf6bec2fcd |
children | 84a6e83157c2 |
comparison
equal
deleted
inserted
replaced
589:d1b4805124a1 | 590:56531f9e9ac7 |
---|---|
20 """ | 20 """ |
21 | 21 |
22 from logging import debug, info, error | 22 from logging import debug, info, error |
23 from xml.dom import minidom | 23 from xml.dom import minidom |
24 from wokkel import data_form | 24 from wokkel import data_form |
25 import pdb | |
26 from twisted.words.xish import domish | 25 from twisted.words.xish import domish |
27 | 26 |
28 """This library help manage XML used in SàT (parameters, registration, etc) """ | 27 """This library help manage XML used in SàT (parameters, registration, etc) """ |
29 | 28 |
30 | 29 |
34 form_ui = XMLUI("form", "vertical") | 33 form_ui = XMLUI("form", "vertical") |
35 | 34 |
36 if form.instructions: | 35 if form.instructions: |
37 form_ui.addText('\n'.join(form.instructions), 'instructions') | 36 form_ui.addText('\n'.join(form.instructions), 'instructions') |
38 | 37 |
39 labels = filter(lambda field:field.label,form.fieldList) | 38 labels = [field for field in form.fieldList if field.label] |
40 if labels: | 39 if labels: |
41 #if there is no label, we don't need to use pairs | 40 # if there is no label, we don't need to use pairs |
42 form_ui.changeLayout("pairs") | 41 form_ui.changeLayout("pairs") |
43 | 42 |
44 for field in form.fieldList: | 43 for field in form.fieldList: |
45 if field.fieldType == 'fixed': | 44 if field.fieldType == 'fixed': |
46 __field_type = 'text' | 45 __field_type = 'text' |
49 elif field.fieldType == 'text-private': | 48 elif field.fieldType == 'text-private': |
50 __field_type = "password" | 49 __field_type = "password" |
51 elif field.fieldType == 'list-single': | 50 elif field.fieldType == 'list-single': |
52 __field_type = "list" | 51 __field_type = "list" |
53 else: | 52 else: |
54 error (u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType) | 53 error(u"FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType) |
55 __field_type = "string" | 54 __field_type = "string" |
56 | 55 |
57 if labels: | 56 if labels: |
58 if field.label: | 57 if field.label: |
59 form_ui.addLabel(field.label) | 58 form_ui.addLabel(field.label) |
60 else: | 59 else: |
61 form_ui.addEmpty() | 60 form_ui.addEmpty() |
62 | 61 |
63 elem = form_ui.addElement(__field_type, field.var, field.value, [option.value for option in field.options]) | 62 form_ui.addElement(__field_type, field.var, field.value, [option.value for option in field.options]) |
64 return form_ui.toXml() | 63 return form_ui.toXml() |
64 | |
65 | 65 |
66 def tupleList2dataForm(values): | 66 def tupleList2dataForm(values): |
67 """convert a list of tuples (name,value) to a wokkel submit data form""" | 67 """convert a list of tuples (name,value) to a wokkel submit data form""" |
68 form = data_form.Form('submit') | 68 form = data_form.Form('submit') |
69 for value in values: | 69 for value in values: |
70 field = data_form.Field(var=value[0], value=value[1]) | 70 field = data_form.Field(var=value[0], value=value[1]) |
71 form.addField(field) | 71 form.addField(field) |
72 | 72 |
73 return form | 73 return form |
74 | |
74 | 75 |
75 def paramsXml2xmlUI(xml): | 76 def paramsXml2xmlUI(xml): |
76 """Convert the xml for parameter to a SàT XML User Interface""" | 77 """Convert the xml for parameter to a SàT XML User Interface""" |
77 params_doc = minidom.parseString(xml.encode('utf-8')) | 78 params_doc = minidom.parseString(xml.encode('utf-8')) |
78 top = params_doc.documentElement | 79 top = params_doc.documentElement |
91 name = param.getAttribute('name') | 92 name = param.getAttribute('name') |
92 label = param.getAttribute('label') | 93 label = param.getAttribute('label') |
93 if not name: | 94 if not name: |
94 error(_('INTERNAL ERROR: params must have a name')) | 95 error(_('INTERNAL ERROR: params must have a name')) |
95 assert(False) | 96 assert(False) |
96 type = param.getAttribute('type') | 97 type_ = param.getAttribute('type') |
97 value = param.getAttribute('value') or None | 98 value = param.getAttribute('value') or None |
98 callback_id = param.getAttribute('callback_id') or None | 99 callback_id = param.getAttribute('callback_id') or None |
99 if type == "button": | 100 if type_ == "button": |
100 param_ui.addEmpty() | 101 param_ui.addEmpty() |
101 else: | 102 else: |
102 param_ui.addLabel(label or name) | 103 param_ui.addLabel(label or name) |
103 param_ui.addElement(name=name, type=type, value=value, callback_id=callback_id) | 104 param_ui.addElement(name=name, type_=type_, value=value, callback_id=callback_id) |
104 | 105 |
105 return param_ui.toXml() | 106 return param_ui.toXml() |
106 | |
107 | |
108 | 107 |
109 | 108 |
110 class XMLUI(object): | 109 class XMLUI(object): |
111 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" | 110 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" |
112 | 111 |
125 @param title: title or default if None | 124 @param title: title or default if None |
126 """ | 125 """ |
127 if not panel_type in ['window', 'form', 'param']: | 126 if not panel_type in ['window', 'form', 'param']: |
128 error(_("Unknown panel type [%s]") % panel_type) | 127 error(_("Unknown panel type [%s]") % panel_type) |
129 assert(False) | 128 assert(False) |
130 self.type = panel_type | 129 self.type_ = panel_type |
131 impl = minidom.getDOMImplementation() | 130 impl = minidom.getDOMImplementation() |
132 | 131 |
133 self.doc = impl.createDocument(None, "sat_xmlui", None) | 132 self.doc = impl.createDocument(None, "sat_xmlui", None) |
134 top_element = self.doc.documentElement | 133 top_element = self.doc.documentElement |
135 top_element.setAttribute("type", panel_type) | 134 top_element.setAttribute("type", panel_type) |
136 if title: | 135 if title: |
137 top_element.setAttribute("title", title) | 136 top_element.setAttribute("title", title) |
138 self.parentTabsLayout = None #used only we have 'tabs' layout | 137 self.parentTabsLayout = None # used only we have 'tabs' layout |
139 self.currentCategory = None #used only we have 'tabs' layout | 138 self.currentCategory = None # used only we have 'tabs' layout |
139 self.currentLayout = None | |
140 self.changeLayout(layout) | 140 self.changeLayout(layout) |
141 | 141 |
142 def __del__(self): | 142 def __del__(self): |
143 self.doc.unlink() | 143 self.doc.unlink() |
144 | 144 |
146 """Create a layout element | 146 """Create a layout element |
147 @param type: layout type (cf init doc) | 147 @param type: layout type (cf init doc) |
148 @parent: parent element or None | 148 @parent: parent element or None |
149 """ | 149 """ |
150 if not layout in ['vertical', 'horizontal', 'pairs', 'tabs']: | 150 if not layout in ['vertical', 'horizontal', 'pairs', 'tabs']: |
151 error (_("Unknown layout type [%s]") % layout) | 151 error(_("Unknown layout type [%s]") % layout) |
152 assert (False) | 152 assert False |
153 layout_elt = self.doc.createElement('layout') | 153 layout_elt = self.doc.createElement('layout') |
154 layout_elt.setAttribute('type',layout) | 154 layout_elt.setAttribute('type', layout) |
155 if parent != None: | 155 if parent is not None: |
156 parent.appendChild(layout_elt) | 156 parent.appendChild(layout_elt) |
157 return layout_elt | 157 return layout_elt |
158 | 158 |
159 def __createElem(self, type, name=None, parent = None): | 159 def __createElem(self, type_, name=None, parent=None): |
160 """Create an element | 160 """Create an element |
161 @param type: one of | 161 @param type_: one of |
162 - empty: empty element (usefull to skip something in a layout, e.g. skip first element in a PAIRS layout) | 162 - empty: empty element (usefull to skip something in a layout, e.g. skip first element in a PAIRS layout) |
163 - text: text to be displayed in an multi-line area, e.g. instructions | 163 - text: text to be displayed in an multi-line area, e.g. instructions |
164 @param name: name of the element or None | 164 @param name: name of the element or None |
165 @param parent: parent element or None | 165 @param parent: parent element or None |
166 """ | 166 """ |
167 elem = self.doc.createElement('elem') | 167 elem = self.doc.createElement('elem') |
168 if name: | 168 if name: |
169 elem.setAttribute('name', name) | 169 elem.setAttribute('name', name) |
170 elem.setAttribute('type', type) | 170 elem.setAttribute('type', type_) |
171 if parent != None: | 171 if parent is not None: |
172 parent.appendChild(elem) | 172 parent.appendChild(elem) |
173 return elem | 173 return elem |
174 | 174 |
175 def changeLayout(self, layout): | 175 def changeLayout(self, layout): |
176 """Change the current layout""" | 176 """Change the current layout""" |
177 self.currentLayout = self.__createLayout(layout, self.currentCategory if self.currentCategory else self.doc.documentElement) | 177 self.currentLayout = self.__createLayout(layout, self.currentCategory if self.currentCategory else self.doc.documentElement) |
178 if layout == "tabs": | 178 if layout == "tabs": |
179 self.parentTabsLayout = self.currentLayout | 179 self.parentTabsLayout = self.currentLayout |
180 | 180 |
181 | |
182 def addEmpty(self, name=None): | 181 def addEmpty(self, name=None): |
183 """Add a multi-lines text""" | 182 """Add a multi-lines text""" |
184 elem = self.__createElem('empty', name, self.currentLayout) | 183 self.__createElem('empty', name, self.currentLayout) |
185 | 184 |
186 def addText(self, text, name=None): | 185 def addText(self, text, name=None): |
187 """Add a multi-lines text""" | 186 """Add a multi-lines text""" |
188 elem = self.__createElem('text', name, self.currentLayout) | 187 elem = self.__createElem('text', name, self.currentLayout) |
189 text = self.doc.createTextNode(text) | 188 text = self.doc.createTextNode(text) |
212 if value: | 211 if value: |
213 elem.setAttribute('value', value) | 212 elem.setAttribute('value', value) |
214 | 213 |
215 def addBool(self, name=None, value="true"): | 214 def addBool(self, name=None, value="true"): |
216 """Add a string box""" | 215 """Add a string box""" |
217 assert value in ["true","false"] | 216 assert value in ["true", "false"] |
218 elem = self.__createElem('bool', name, self.currentLayout) | 217 elem = self.__createElem('bool', name, self.currentLayout) |
219 elem.setAttribute('value', value) | 218 elem.setAttribute('value', value) |
220 | 219 |
221 def addList(self, options, name=None, value=None, style=set()): | 220 def addList(self, options, name=None, value=None, style=set()): |
222 """Add a list of choices""" | 221 """Add a list of choices""" |
223 styles = set(style) | 222 styles = set(style) |
224 assert (options) | 223 assert options |
225 assert (styles.issubset(['multi'])) | 224 assert styles.issubset(['multi']) |
226 elem = self.__createElem('list', name, self.currentLayout) | 225 elem = self.__createElem('list', name, self.currentLayout) |
227 self.addOptions(options, elem) | 226 self.addOptions(options, elem) |
228 if value: | 227 if value: |
229 elem.setAttribute('value', value) | 228 elem.setAttribute('value', value) |
230 for style in styles: | 229 for style in styles: |
242 for field in fields_back: | 241 for field in fields_back: |
243 fback_el = self.doc.createElement('field_back') | 242 fback_el = self.doc.createElement('field_back') |
244 fback_el.setAttribute('name', field) | 243 fback_el.setAttribute('name', field) |
245 elem.appendChild(fback_el) | 244 elem.appendChild(fback_el) |
246 | 245 |
247 | 246 def addElement(self, type_, name=None, value=None, options=None, callback_id=None): |
248 | |
249 def addElement(self, type, name = None, value = None, options = None, callback_id = None): | |
250 """Convenience method to add element, the params correspond to the ones in addSomething methods""" | 247 """Convenience method to add element, the params correspond to the ones in addSomething methods""" |
251 if type == 'empty': | 248 if type_ == 'empty': |
252 self.addEmpty(name) | 249 self.addEmpty(name) |
253 elif type == 'text': | 250 elif type_ == 'text': |
254 assert(value!=None) | 251 assert value is not None |
255 self.addText(value, name) | 252 self.addText(value, name) |
256 elif type == 'label': | 253 elif type_ == 'label': |
257 assert(value) | 254 assert(value) |
258 self.addLabel(value) | 255 self.addLabel(value) |
259 elif type == 'string': | 256 elif type_ == 'string': |
260 self.addString(name, value) | 257 self.addString(name, value) |
261 elif type == 'password': | 258 elif type_ == 'password': |
262 self.addPassword(name, value) | 259 self.addPassword(name, value) |
263 elif type == 'textbox': | 260 elif type_ == 'textbox': |
264 self.addTextBox(name, value) | 261 self.addTextBox(name, value) |
265 elif type == 'bool': | 262 elif type_ == 'bool': |
266 if not value: | 263 if not value: |
267 value = "true" | 264 value = "true" |
268 self.addBool(name, value) | 265 self.addBool(name, value) |
269 elif type == 'list': | 266 elif type_ == 'list': |
270 self.addList(options, name, value) | 267 self.addList(options, name, value) |
271 elif type == 'button': | 268 elif type_ == 'button': |
272 assert(callback_id and value) | 269 assert(callback_id and value) |
273 self.addButton(callback_id, name, value) | 270 self.addButton(callback_id, name, value) |
274 | 271 |
275 def addOptions(self, options, parent): | 272 def addOptions(self, options, parent): |
276 """Add options to a multi-values element (e.g. list) | 273 """Add options to a multi-values element (e.g. list) |
301 def toXml(self): | 298 def toXml(self): |
302 """return the XML representation of the panel""" | 299 """return the XML representation of the panel""" |
303 return self.doc.toxml() | 300 return self.doc.toxml() |
304 | 301 |
305 | 302 |
306 | |
307 class ElementParser(object): | 303 class ElementParser(object): |
308 """callable class to parse XML string into Element | 304 """callable class to parse XML string into Element |
309 Found at http://stackoverflow.com/questions/2093400/how-to-create-twisted-words-xish-domish-element-entirely-from-raw-xml/2095942#2095942 | 305 Found at http://stackoverflow.com/questions/2093400/how-to-create-twisted-words-xish-domish-element-entirely-from-raw-xml/2095942#2095942 |
310 (c) Karl Anderson""" | 306 (c) Karl Anderson""" |
311 | 307 |
312 def __call__(self, s): | 308 def __call__(self, string): |
313 self.result = None | 309 self.result = None |
314 def onStart(el): | 310 |
315 self.result = el | 311 def onStart(elem): |
312 self.result = elem | |
313 | |
316 def onEnd(): | 314 def onEnd(): |
317 pass | 315 pass |
318 def onElement(el): | 316 |
319 self.result.addChild(el) | 317 def onElement(elem): |
318 self.result.addChild(elem) | |
320 | 319 |
321 parser = domish.elementStream() | 320 parser = domish.elementStream() |
322 parser.DocumentStartEvent = onStart | 321 parser.DocumentStartEvent = onStart |
323 parser.ElementEvent = onElement | 322 parser.ElementEvent = onElement |
324 parser.DocumentEndEvent = onEnd | 323 parser.DocumentEndEvent = onEnd |
325 tmp = domish.Element((None, "s")) | 324 tmp = domish.Element((None, "s")) |
326 tmp.addRawXml(s.replace('\n','').replace('\t','')) | 325 tmp.addRawXml(string.replace('\n', '').replace('\t', '')) |
327 parser.parse(tmp.toXml().encode('utf-8')) | 326 parser.parse(tmp.toXml().encode('utf-8')) |
328 return self.result.firstChildElement() | 327 return self.result.firstChildElement() |