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()