Browse Source

datasource SQL: take care of multivalued fields in INSERT

ArnAud 8 years ago
parent
commit
88c5f2fe54
1 changed files with 49 additions and 0 deletions
  1. 49
    0
      DataSource/MySQL/leapidatasource.py

+ 49
- 0
DataSource/MySQL/leapidatasource.py View File

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

Loading…
Cancel
Save