|
@@ -16,6 +16,7 @@ import mosql.mysql
|
16
|
16
|
from DataSource.dummy.leapidatasource import DummyDatasource
|
17
|
17
|
from DataSource.MySQL import utils
|
18
|
18
|
from EditorialModel.classtypes import EmNature
|
|
19
|
+from EditorialModel.fieldtypes.generic import MultiValueFieldType
|
19
|
20
|
|
20
|
21
|
from Lodel.settings import Settings
|
21
|
22
|
|
|
@@ -273,6 +274,10 @@ class LeDataSourceSQL(DummyDatasource):
|
273
|
274
|
main_datas[main_column_name] = datas[main_column_name]
|
274
|
275
|
del(datas[main_column_name])
|
275
|
276
|
|
|
277
|
+ # extract multivalued field from class_table datas
|
|
278
|
+ if class_table:
|
|
279
|
+ multivalued_datas = self.create_multivalued_datas(target_cls, datas)
|
|
280
|
+
|
276
|
281
|
sql = insert(main_table, main_datas)
|
277
|
282
|
cur = utils.query(self.connection, sql)
|
278
|
283
|
lodel_id = cur.lastrowid
|
|
@@ -283,8 +288,52 @@ class LeDataSourceSQL(DummyDatasource):
|
283
|
288
|
sql = insert(class_table, datas)
|
284
|
289
|
utils.query(self.connection, sql)
|
285
|
290
|
|
|
291
|
+ # do multivalued inserts
|
|
292
|
+ for key_name, lines in multivalued_datas.items():
|
|
293
|
+ table_name = utils.multivalue_table_name(class_table, key_name)
|
|
294
|
+ for key_value, line_datas in lines.items():
|
|
295
|
+ line_datas[key_name] = key_value
|
|
296
|
+ line_datas[fk_name] = lodel_id
|
|
297
|
+ sql = insert(table_name, line_datas)
|
|
298
|
+ utils.query(self.connection, sql)
|
|
299
|
+
|
286
|
300
|
return lodel_id
|
287
|
301
|
|
|
302
|
+ # extract multivalued field from datas, prepare multivalued data list
|
|
303
|
+ def create_multivalued_datas(self, target_cls, datas):
|
|
304
|
+ multivalue_fields = self.get_multivalue_fields(target_cls)
|
|
305
|
+
|
|
306
|
+ if multivalue_fields:
|
|
307
|
+ # construct multivalued datas
|
|
308
|
+ multivalued_datas = {key:{} for key in multivalue_fields}
|
|
309
|
+ for key_name, names in multivalue_fields.items():
|
|
310
|
+ for field_name in names:
|
|
311
|
+ try:
|
|
312
|
+ for key, value in datas[field_name].items():
|
|
313
|
+ if key not in multivalued_datas[key_name]:
|
|
314
|
+ multivalued_datas[key_name][key] = {}
|
|
315
|
+ multivalued_datas[key_name][key][field_name] = value
|
|
316
|
+ del(datas[field_name])
|
|
317
|
+ except KeyError:
|
|
318
|
+ pass # field_name is not in datas
|
|
319
|
+ return multivalued_datas
|
|
320
|
+ else:
|
|
321
|
+ return {}
|
|
322
|
+
|
|
323
|
+ # return multivalue fields of a class
|
|
324
|
+ def get_multivalue_fields(self, target_cls):
|
|
325
|
+ multivalue_fields = {}
|
|
326
|
+ # scan fieldtypes to get mutltivalued field
|
|
327
|
+ for field_name, fieldtype in target_cls.fieldtypes(complete=False).items():
|
|
328
|
+ if isinstance(fieldtype, MultiValueFieldType):
|
|
329
|
+ if fieldtype.keyname in multivalue_fields:
|
|
330
|
+ multivalue_fields[fieldtype.keyname].append(field_name)
|
|
331
|
+ else:
|
|
332
|
+ multivalue_fields[fieldtype.keyname] = [field_name]
|
|
333
|
+
|
|
334
|
+ return multivalue_fields
|
|
335
|
+
|
|
336
|
+
|
288
|
337
|
## @brief insert multiple editorial component
|
289
|
338
|
# @param target_cls LeCrud(class) : The component class concerned by the insert (a LeCrud child class (not instance !) )
|
290
|
339
|
# @param datas_list list : A list of dict representing the datas to insert
|