|
@@ -104,8 +104,6 @@ class MongoDbDatasource(AbstractDatasource):
|
104
|
104
|
def select(self, target, field_list, filters = None,
|
105
|
105
|
relational_filters=None, order=None, group=None, limit=None,
|
106
|
106
|
offset=0):
|
107
|
|
- logger.debug("Select %s on %s filtered by %s and %s " % (
|
108
|
|
- field_list, target, filters, relational_filters))
|
109
|
107
|
if target.is_abstract():
|
110
|
108
|
#Reccursiv calls for abstract LeObject child
|
111
|
109
|
results = self.__act_on_abstract(target, filters,
|
|
@@ -223,10 +221,18 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
223
|
221
|
#@return int : Number of updated records
|
224
|
222
|
def update(self, target, filters, relational_filters, upd_datas):
|
225
|
223
|
self._data_cast(upd_datas)
|
|
224
|
+ #fetching current datas state
|
|
225
|
+ mongo_filters = self.__process_filters(
|
|
226
|
+ target, filters, relational_filters)
|
|
227
|
+ old_datas_l = self.__collection(target).find(
|
|
228
|
+ mongo_filters)
|
|
229
|
+ old_datas_l = list(old_datas_l)
|
|
230
|
+ #Running update
|
226
|
231
|
res = self.__update_no_backref(target, filters, relational_filters,
|
227
|
232
|
upd_datas)
|
|
233
|
+ #updating backref
|
228
|
234
|
self.__update_backref_filtered(target, filters, relational_filters,
|
229
|
|
- upd_datas)
|
|
235
|
+ upd_datas, old_datas_l)
|
230
|
236
|
return res
|
231
|
237
|
|
232
|
238
|
##@brief Designed to be called by backref update in order to avoid
|
|
@@ -243,6 +249,7 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
243
|
249
|
#Non abstract beahavior
|
244
|
250
|
mongo_filters = self.__process_filters(
|
245
|
251
|
target, filters, relational_filters)
|
|
252
|
+ self._data_cast(upd_datas)
|
246
|
253
|
mongo_arg = {'$set': upd_datas }
|
247
|
254
|
res = self.__collection(target).update(mongo_filters, mongo_arg)
|
248
|
255
|
return res['n']
|
|
@@ -281,16 +288,20 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
281
|
288
|
#@param filters
|
282
|
289
|
#@param relational_filters,
|
283
|
290
|
#@param new_datas None | dict : optional new datas if None mean we are deleting
|
|
291
|
+ #@param old_datas_l None | list : if None fetch old datas from db (usefull
|
|
292
|
+ #when modifications are made on instance before updating backrefs)
|
284
|
293
|
#@return nothing (for the moment
|
285
|
294
|
def __update_backref_filtered(self, target,
|
286
|
|
- filters, relational_filters, new_datas = None):
|
|
295
|
+ filters, relational_filters, new_datas = None, old_datas_l = None):
|
287
|
296
|
#Getting all the UID of the object that will be deleted in order
|
288
|
297
|
#to update back_references
|
289
|
|
- mongo_filters = self.__process_filters(
|
290
|
|
- target, filters, relational_filters)
|
291
|
|
- old_datas_l = self.__collection(target).find(
|
292
|
|
- mongo_filters)
|
293
|
|
- old_datas_l = list(old_datas_l)
|
|
298
|
+ if old_datas_l is None:
|
|
299
|
+ mongo_filters = self.__process_filters(
|
|
300
|
+ target, filters, relational_filters)
|
|
301
|
+ old_datas_l = self.__collection(target).find(
|
|
302
|
+ mongo_filters)
|
|
303
|
+ old_datas_l = list(old_datas_l)
|
|
304
|
+
|
294
|
305
|
uidname = target.uid_fieldname()[0] #MULTIPLE UID BROKEN HERE
|
295
|
306
|
for old_datas in old_datas_l:
|
296
|
307
|
self.__update_backref(
|
|
@@ -342,9 +353,11 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
342
|
353
|
upd_dict = {}
|
343
|
354
|
for fname, fdh in target.reference_handlers().items():
|
344
|
355
|
oldd = old_datas is not None and fname in old_datas and \
|
345
|
|
- hasattr(fdh, 'default') and old_datas[fname] != fdh.default
|
|
356
|
+ (not hasattr(fdh, 'default') or old_datas[fname] != fdh.default) \
|
|
357
|
+ and not old_datas[fname] is None
|
346
|
358
|
newd = new_datas is not None and fname in new_datas and \
|
347
|
|
- hasattr(fdh, 'default') and new_datas[fname] != fdh.default
|
|
359
|
+ (not hasattr(fdh, 'default') or new_datas[fname] != fdh.default) \
|
|
360
|
+ and not new_datas[fname] is None
|
348
|
361
|
if (oldd and newd and old_datas[fname] == new_datas[fname])\
|
349
|
362
|
or not(oldd or newd):
|
350
|
363
|
#No changes or not concerned
|
|
@@ -398,7 +411,7 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
398
|
411
|
#value
|
399
|
412
|
vdict = {}
|
400
|
413
|
if oldd:
|
401
|
|
- vdict['old'] = new_datas[fname]
|
|
414
|
+ vdict['old'] = old_datas[fname]
|
402
|
415
|
uid_val = vdict['old']
|
403
|
416
|
if newd:
|
404
|
417
|
vdict['new'] = new_datas[fname]
|
|
@@ -412,11 +425,11 @@ abstract, preparing reccursiv calls" % (target, filters, relational_filters))
|
412
|
425
|
upd_dict, bref_infos, bref_fname, uid_val)
|
413
|
426
|
#forging update bref_infos
|
414
|
427
|
bref_cls, bref_leo, bref_dh, bref_value = bref_infos
|
415
|
|
- bref_infos = tuple(bref_cls, bref_leo, bref_dh,
|
|
428
|
+ bref_infos = (bref_cls, bref_leo, bref_dh,
|
416
|
429
|
upd_dict[bref_cls][uid_val][1][bref_fname])
|
417
|
430
|
#fetche and store updated value
|
418
|
431
|
new_bref_val = self.__back_ref_upd_one_value(
|
419
|
|
- fname, fdh, tuid, **vdict)
|
|
432
|
+ fname, fdh, tuid, bref_infos, **vdict)
|
420
|
433
|
upd_dict[bref_cls][uid_val][1][bref_fname] = new_bref_val
|
421
|
434
|
#Now we've got our upd_dict ready.
|
422
|
435
|
#running the updates
|
|
@@ -478,6 +491,8 @@ object : %s. Value was : '%s'" % (bref_leo, tuid))
|
478
|
491
|
raise MongoDbConsistencyError("The value we want to \
|
479
|
492
|
delete in this back reference update was not found in the back referenced \
|
480
|
493
|
object : %s. Value was : '%s'" % (bref_leo, tuid))
|
|
494
|
+ if isinstance(bref_val, tuple):
|
|
495
|
+ bref_val = set(bref_val)
|
481
|
496
|
if isinstance(bref_val, set):
|
482
|
497
|
bref_val -= set([tuid])
|
483
|
498
|
else:
|
|
@@ -487,6 +502,8 @@ object : %s. Value was : '%s'" % (bref_leo, tuid))
|
487
|
502
|
raise MongoDbConsistencyError("The value we want to \
|
488
|
503
|
add in this back reference update was found in the back referenced \
|
489
|
504
|
object : %s. Value was : '%s'" % (bref_leo, tuid))
|
|
505
|
+ if isinstance(bref_val, tuple):
|
|
506
|
+ bref_val = set(bref_val)
|
490
|
507
|
if isinstance(bref_val, set):
|
491
|
508
|
bref_val |= set([tuid])
|
492
|
509
|
else:
|
|
@@ -504,7 +521,7 @@ have expected value. Expected was %s but found %s in %s" % (
|
504
|
521
|
if not hasattr(bref_dh, "default"):
|
505
|
522
|
raise MongoDbConsistencyError("Unable to delete a \
|
506
|
523
|
value for a back reference update. The concerned field don't have a default \
|
507
|
|
-value : in %s field %s" % (bref_leo, bref_fname))
|
|
524
|
+value : in %s field %s" % (bref_leo,fname))
|
508
|
525
|
bref_val = getattr(bref_dh, "default")
|
509
|
526
|
elif not oldd and newdd:
|
510
|
527
|
bref_val = tuid
|