|
@@ -23,7 +23,7 @@ def save(model, **kwargs):
|
23
|
23
|
for emclass in classes:
|
24
|
24
|
write_emclass_xml(etree, em_classes, classes[emclass].uid, classes[emclass].display_name,
|
25
|
25
|
classes[emclass].help_text, classes[emclass].group,
|
26
|
|
- classes[emclass].fields(), classes[emclass].parents,
|
|
26
|
+ classes[emclass].fields(no_parents=True), classes[emclass].parents,
|
27
|
27
|
classes[emclass].abstract, classes[emclass].pure_abstract)
|
28
|
28
|
|
29
|
29
|
em_groups = etree.SubElement(Em, 'groups')
|
|
@@ -60,9 +60,25 @@ def write_datahandler_xml(etree, elem, dhdl_name, **kwargs):
|
60
|
60
|
dhdl = etree.SubElement(elem,'datahandler_name')
|
61
|
61
|
dhdl.text = dhdl_name
|
62
|
62
|
dhdl_opt = etree.SubElement(elem, 'datahandler_options')
|
|
63
|
+
|
63
|
64
|
for argname, argval in kwargs.items():
|
64
|
65
|
arg = etree.SubElement(dhdl_opt, argname)
|
65
|
|
- arg.text = argval
|
|
66
|
+ opt_val=''
|
|
67
|
+ if (isinstance(argval, str)):
|
|
68
|
+ opt_val=argval
|
|
69
|
+ elif (isinstance(argval, bool)):
|
|
70
|
+ opt_val = str(argval)
|
|
71
|
+ elif (isinstance(argval, list) | isinstance(argval, tuple) | isinstance(argval, dict)):
|
|
72
|
+ for argu in argval:
|
|
73
|
+ if len(opt_val) > 0:
|
|
74
|
+ opt_val = opt_val + ','
|
|
75
|
+ if isinstance(argu, EmComponent):
|
|
76
|
+ opt_val = opt_val + argu.uid
|
|
77
|
+ elif isinstance(argu, str):
|
|
78
|
+ opt_val = opt_val + argu
|
|
79
|
+ else:
|
|
80
|
+ opt_val = str(argu)
|
|
81
|
+ arg.text = opt_val
|
66
|
82
|
|
67
|
83
|
##@brief Writes a representation in xml of a EmField
|
68
|
84
|
# @param etree : the xml object
|
|
@@ -88,6 +104,7 @@ def write_emfield_xml(etree, elem, uid, name, help_text, group, datahandler_name
|
88
|
104
|
else:
|
89
|
105
|
write_mlstring_xml(etree, emfield_help, help_text)
|
90
|
106
|
emfield_group = etree.SubElement(emfield, 'group')
|
|
107
|
+
|
91
|
108
|
if group is not None:
|
92
|
109
|
emfield_group.text = group.uid #write_emgroup_xml(etree, emfield_group, group.uid, group.display_name, group.help_text, group.requires)
|
93
|
110
|
write_datahandler_xml(etree,emfield,datahandler_name, **kwargs)
|
|
@@ -125,13 +142,9 @@ def write_emgroup_xml(etree, elem, uid, name, help_text, requires, components):
|
125
|
142
|
em_group_comp_fld_ins_uid.text = component.uid
|
126
|
143
|
em_group_comp_fld_ins_cls = etree.SubElement(emgroup_comp_fld_ins,'class')
|
127
|
144
|
em_group_comp_fld_ins_cls.text = component.get_emclass_uid()
|
128
|
|
- #write_emfield_xml(etree, emgroup_comp_fld, component.uid, component.display_name,
|
129
|
|
- # component.help_text, component.group, component.data_handler_name, **(component.data_handler_options))
|
130
|
145
|
elif isinstance(component, EmClass):
|
131
|
146
|
em_group_comp_cls_ins = etree.SubElement(emgroup_comp_cls, 'emclass')
|
132
|
147
|
em_group_comp_cls_ins.text = component.uid
|
133
|
|
- #write_emclass_xml(etree, emgroup_comp_cls, component.uid, component.display_name, component.help_text, component.group,
|
134
|
|
- # component.fields(), component.parents, component.abstract, component.pure_abstract)
|
135
|
148
|
|
136
|
149
|
##@brief Writes a representation of a EmClass in xml
|
137
|
150
|
# @param etree : the xml object
|
|
@@ -162,14 +175,14 @@ def write_emclass_xml(etree, elem, uid, name, help_text, group, fields, parents,
|
162
|
175
|
emclass_pure_abstract.text = "True" if pure_abstract else "False"
|
163
|
176
|
emclass_group = etree.SubElement(emclass, 'group')
|
164
|
177
|
if group is not None:
|
165
|
|
- emclass_group.text = group.uid #write_emgroup_xml(etree, emclass_group, group.uid, group.name, group.help_text, group.require, group.components)
|
|
178
|
+ emclass_group.text = group.uid
|
166
|
179
|
emclass_fields = etree.SubElement(emclass, 'fields')
|
167
|
180
|
for field in fields:
|
168
|
181
|
write_emfield_xml(etree, emclass_fields, field.uid, field.display_name, field.help_text,
|
169
|
182
|
field.group,field.data_handler_name, **field.data_handler_options)
|
170
|
183
|
parents_list=list()
|
171
|
184
|
for parent in parents:
|
172
|
|
- parents_list.append(parent['uid'])
|
|
185
|
+ parents_list.append(parent.uid)
|
173
|
186
|
emclass_parents = etree.SubElement(emclass, 'parents')
|
174
|
187
|
emclass_parents.text = ",".join(parents_list)
|
175
|
188
|
|
|
@@ -187,7 +200,9 @@ def load(filename):
|
187
|
200
|
|
188
|
201
|
classes = emodel.find('classes')
|
189
|
202
|
for emclass in classes:
|
190
|
|
- model.add_class(load_class_xml(model, emclass))
|
|
203
|
+ em_class = load_class_xml(model, emclass)
|
|
204
|
+ if em_class.uid not in model.all_classes():
|
|
205
|
+ model.add_class(em_class)
|
191
|
206
|
|
192
|
207
|
groups = emodel.find('groups')
|
193
|
208
|
for group in groups:
|
|
@@ -212,8 +227,8 @@ def load_class_xml(model, elem):
|
212
|
227
|
else:
|
213
|
228
|
help_text = load_mlstring_xml(elem.find('help_text'))
|
214
|
229
|
|
215
|
|
- abstract = True if elem.find('abstract').text == 'True' else False
|
216
|
|
- pure_abstract = True if elem.find('pure_abstract').text == 'True' else False
|
|
230
|
+ abstract = (elem.find('abstract').text == 'True')
|
|
231
|
+ pure_abstract = (elem.find('pure_abstract').text == 'True')
|
217
|
232
|
requires = list()
|
218
|
233
|
classes = model.all_classes()
|
219
|
234
|
req = elem.find('parents')
|
|
@@ -225,19 +240,22 @@ def load_class_xml(model, elem):
|
225
|
240
|
else:
|
226
|
241
|
requires.append(model.add_class(EmClass(r)))
|
227
|
242
|
group = elem.find('group')
|
228
|
|
- if group:
|
|
243
|
+ if group.text is not None:
|
229
|
244
|
grp = model.add_group(EmGroup(group.text))
|
230
|
245
|
else:
|
231
|
246
|
grp = None
|
232
|
|
-
|
|
247
|
+
|
233
|
248
|
if uid in classes:
|
234
|
249
|
emclass = model.all_classes_ref(uid)
|
235
|
250
|
emclass.display_name = name
|
236
|
251
|
emclass.help_text = help_text
|
237
|
252
|
emclass.parents=requires
|
238
|
253
|
emclass.group = grp
|
|
254
|
+ emclass.abstract = abstract
|
|
255
|
+ emclass.pure_abstract = pure_abstract
|
239
|
256
|
else:
|
240
|
257
|
emclass = EmClass(uid, name, help_text, abstract,requires, grp, pure_abstract)
|
|
258
|
+ model.add_class(emclass)
|
241
|
259
|
|
242
|
260
|
fields = elem.find('fields')
|
243
|
261
|
for field in fields:
|
|
@@ -247,6 +265,7 @@ def load_class_xml(model, elem):
|
247
|
265
|
for emf in l_emfields:
|
248
|
266
|
if emfield.uid == emf.uid:
|
249
|
267
|
incls = True
|
|
268
|
+ break
|
250
|
269
|
if not incls:
|
251
|
270
|
emclass.add_field(emfield)
|
252
|
271
|
|
|
@@ -267,20 +286,53 @@ def load_field_xml(model, elem):
|
267
|
286
|
help_text = None
|
268
|
287
|
else:
|
269
|
288
|
help_text = load_mlstring_xml(elem.find('help_text'))
|
|
289
|
+
|
270
|
290
|
emgroup = elem.find('group')
|
271
|
|
- if emgroup:
|
|
291
|
+ if emgroup.text is not None:
|
272
|
292
|
group = model.add_group(EmGroup(emgroup.text))
|
273
|
293
|
else:
|
274
|
294
|
group = None
|
|
295
|
+
|
275
|
296
|
dhdl = elem.find('datahandler_name')
|
276
|
|
- if elem.find('datahandler_options').text is not None:
|
277
|
|
- dhdl_options = elem.find('datahandler_options').text.split()
|
278
|
|
- emfield = EmField(uid, dhdl, name, help_text, group, **dhdl_options)
|
|
297
|
+ if dhdl.text is not None:
|
|
298
|
+ dhdl_opts = elem.find('datahandler_options')
|
|
299
|
+
|
|
300
|
+ if dhdl_opts is not None:
|
|
301
|
+ dhdl_options = load_dhdl_options_xml(model, dhdl_opts)
|
|
302
|
+ emfield = EmField(uid, dhdl.text, name, help_text, group, **dhdl_options)
|
|
303
|
+ else:
|
|
304
|
+ emfield = EmField(uid, dhdl.text, name, help_text, group)
|
279
|
305
|
else:
|
280
|
306
|
emfield = EmField(uid, dhdl.text, name, help_text, group)
|
281
|
307
|
|
282
|
308
|
return emfield
|
283
|
309
|
|
|
310
|
+##@brief Returns datahandler options from a xml description
|
|
311
|
+# @param elem : the element which represents the datahandler
|
|
312
|
+# @param model : the model which will contain the new field
|
|
313
|
+# @return datahandler options
|
|
314
|
+def load_dhdl_options_xml(model, elem):
|
|
315
|
+ dhdl_options=dict()
|
|
316
|
+ for opt in elem:
|
|
317
|
+ if (opt.tag == 'allowed_classes'):
|
|
318
|
+ classes = list()
|
|
319
|
+ clss = opt.text.split(',')
|
|
320
|
+ for classe in clss:
|
|
321
|
+ if classe in model.all_classes():
|
|
322
|
+ classes.append(model.all_classes_ref(classe))
|
|
323
|
+ else:
|
|
324
|
+ new_cls = model.add_class(EmClass(classe))
|
|
325
|
+ classes.append(new_cls)
|
|
326
|
+ dhdl_options['allowed_classes'] = classes
|
|
327
|
+ elif (opt.tag == 'back_reference'):
|
|
328
|
+ dhdl_options['back_reference'] = tuple(opt.text.split(','))
|
|
329
|
+ elif ((opt.text == 'True') | (opt.text == 'False')):
|
|
330
|
+ dhdl_options[opt.tag] = (opt.text == 'True')
|
|
331
|
+ else:
|
|
332
|
+ dhdl_options[opt.tag] = opt.text
|
|
333
|
+ return dhdl_options
|
|
334
|
+
|
|
335
|
+
|
284
|
336
|
##@brief Creates a EmGroup from a xml description
|
285
|
337
|
# @param elem : the element which represents the EmGroup
|
286
|
338
|
# @param model : the model which will contain the new group
|
|
@@ -311,13 +363,6 @@ def load_group_xml(model, elem):
|
311
|
363
|
grp = model.new_group(r)
|
312
|
364
|
requires.append(grp)
|
313
|
365
|
|
314
|
|
- if uid in groups:
|
315
|
|
- group = model.all_groups_ref(uid)
|
316
|
|
- group.display_name = name
|
317
|
|
- group.help_text = help_text
|
318
|
|
- group.add_dependencie(requires)
|
319
|
|
- else:
|
320
|
|
- group = EmGroup(uid.text, requires, name, help_text)
|
321
|
366
|
comp= list()
|
322
|
367
|
components = elem.find('components')
|
323
|
368
|
fields = components.find('emfields')
|
|
@@ -329,8 +374,17 @@ def load_group_xml(model, elem):
|
329
|
374
|
classes = components.find('emclasses')
|
330
|
375
|
for classe in classes:
|
331
|
376
|
comp.append(model.all_classes_ref(classe.text))
|
332
|
|
- group.add_components(comp)
|
333
|
377
|
|
|
378
|
+ groups = model.all_groups()
|
|
379
|
+ if uid.text in groups:
|
|
380
|
+ group = model.all_groups_ref(uid.text)
|
|
381
|
+ group.display_name = name
|
|
382
|
+ group.help_text = help_text
|
|
383
|
+ group.add_dependencie(requires)
|
|
384
|
+ else:
|
|
385
|
+ group = EmGroup(uid.text, requires, name, help_text)
|
|
386
|
+
|
|
387
|
+ group.add_components(comp)
|
334
|
388
|
return group
|
335
|
389
|
|
336
|
390
|
##@brief Constructs a MlString from a xml description
|