prieto 8 lat temu
rodzic
commit
8264423011
1 zmienionych plików z 79 dodań i 25 usunięć
  1. 79
    25
      lodel/editorial_model/translator/xmlfile.py

+ 79
- 25
lodel/editorial_model/translator/xmlfile.py Wyświetl plik

@@ -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

Loading…
Anuluj
Zapisz