Browse Source

datasource SQL: take care of multivalued fields in INSERT

ArnAud 9 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
 from DataSource.dummy.leapidatasource import DummyDatasource
16
 from DataSource.dummy.leapidatasource import DummyDatasource
17
 from DataSource.MySQL import utils
17
 from DataSource.MySQL import utils
18
 from EditorialModel.classtypes import EmNature
18
 from EditorialModel.classtypes import EmNature
19
+from EditorialModel.fieldtypes.generic import MultiValueFieldType
19
 
20
 
20
 from Lodel.settings import Settings
21
 from Lodel.settings import Settings
21
 
22
 
273
                     main_datas[main_column_name] = datas[main_column_name]
274
                     main_datas[main_column_name] = datas[main_column_name]
274
                 del(datas[main_column_name])
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
         sql = insert(main_table, main_datas)
281
         sql = insert(main_table, main_datas)
277
         cur = utils.query(self.connection, sql)
282
         cur = utils.query(self.connection, sql)
278
         lodel_id = cur.lastrowid
283
         lodel_id = cur.lastrowid
283
             sql = insert(class_table, datas)
288
             sql = insert(class_table, datas)
284
             utils.query(self.connection, sql)
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
         return lodel_id
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
     ## @brief insert multiple editorial component
337
     ## @brief insert multiple editorial component
289
     # @param target_cls LeCrud(class) : The component class concerned by the insert (a LeCrud child class (not instance !) )
338
     # @param target_cls LeCrud(class) : The component class concerned by the insert (a LeCrud child class (not instance !) )
290
     # @param datas_list list : A list of dict representing the datas to insert
339
     # @param datas_list list : A list of dict representing the datas to insert

Loading…
Cancel
Save