django-bulk-hooks 0.1.120__py3-none-any.whl → 0.1.122__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-bulk-hooks might be problematic. Click here for more details.
- django_bulk_hooks/queryset.py +23 -8
- {django_bulk_hooks-0.1.120.dist-info → django_bulk_hooks-0.1.122.dist-info}/METADATA +1 -1
- {django_bulk_hooks-0.1.120.dist-info → django_bulk_hooks-0.1.122.dist-info}/RECORD +5 -5
- {django_bulk_hooks-0.1.120.dist-info → django_bulk_hooks-0.1.122.dist-info}/LICENSE +0 -0
- {django_bulk_hooks-0.1.120.dist-info → django_bulk_hooks-0.1.122.dist-info}/WHEEL +0 -0
django_bulk_hooks/queryset.py
CHANGED
|
@@ -284,6 +284,10 @@ class HookQuerySet(models.QuerySet):
|
|
|
284
284
|
if inheritance_chain is None:
|
|
285
285
|
inheritance_chain = self._get_inheritance_chain()
|
|
286
286
|
|
|
287
|
+
# Safety check to prevent infinite recursion
|
|
288
|
+
if len(inheritance_chain) > 10: # Arbitrary limit to prevent infinite loops
|
|
289
|
+
raise ValueError("Inheritance chain too deep - possible infinite recursion detected")
|
|
290
|
+
|
|
287
291
|
batch_size = kwargs.get("batch_size") or len(objs)
|
|
288
292
|
created_objects = []
|
|
289
293
|
with transaction.atomic(using=self.db, savepoint=False):
|
|
@@ -323,19 +327,28 @@ class HookQuerySet(models.QuerySet):
|
|
|
323
327
|
# If the child model is still MTI, call our own logic recursively
|
|
324
328
|
if len([p for p in child_model._meta.parents.keys() if not p._meta.proxy]) > 0:
|
|
325
329
|
# Build inheritance chain for the child model
|
|
326
|
-
|
|
330
|
+
child_inheritance_chain = []
|
|
327
331
|
current_model = child_model
|
|
328
332
|
while current_model:
|
|
329
333
|
if not current_model._meta.proxy:
|
|
330
|
-
|
|
334
|
+
child_inheritance_chain.append(current_model)
|
|
331
335
|
parents = [
|
|
332
336
|
parent
|
|
333
337
|
for parent in current_model._meta.parents.keys()
|
|
334
338
|
if not parent._meta.proxy
|
|
335
339
|
]
|
|
336
340
|
current_model = parents[0] if parents else None
|
|
337
|
-
|
|
338
|
-
|
|
341
|
+
child_inheritance_chain.reverse()
|
|
342
|
+
|
|
343
|
+
# For nested MTI, we can't use bulk operations recursively
|
|
344
|
+
# because it would create infinite recursion. Instead, we save each child individually.
|
|
345
|
+
# We use super().save() to avoid triggering hooks that would cause recursion.
|
|
346
|
+
created = []
|
|
347
|
+
for child_obj in child_objects:
|
|
348
|
+
# Use the base model's save method to avoid triggering hooks
|
|
349
|
+
# This prevents infinite recursion when hooks try to query the database
|
|
350
|
+
super(child_obj.__class__, child_obj).save()
|
|
351
|
+
created.append(child_obj)
|
|
339
352
|
else:
|
|
340
353
|
# Single-table, safe to use bulk_create
|
|
341
354
|
|
|
@@ -370,8 +383,9 @@ class HookQuerySet(models.QuerySet):
|
|
|
370
383
|
|
|
371
384
|
# Handle auto_now_add and auto_now fields like Django does
|
|
372
385
|
for field in parent_model._meta.local_fields:
|
|
373
|
-
if field
|
|
374
|
-
|
|
386
|
+
if hasattr(field, 'auto_now_add') and field.auto_now_add:
|
|
387
|
+
field.pre_save(parent_obj, add=True)
|
|
388
|
+
elif hasattr(field, 'auto_now') and field.auto_now:
|
|
375
389
|
field.pre_save(parent_obj, add=True)
|
|
376
390
|
|
|
377
391
|
return parent_obj
|
|
@@ -392,8 +406,9 @@ class HookQuerySet(models.QuerySet):
|
|
|
392
406
|
|
|
393
407
|
# Handle auto_now_add and auto_now fields like Django does
|
|
394
408
|
for field in child_model._meta.local_fields:
|
|
395
|
-
if field
|
|
396
|
-
|
|
409
|
+
if hasattr(field, 'auto_now_add') and field.auto_now_add:
|
|
410
|
+
field.pre_save(child_obj, add=True)
|
|
411
|
+
elif hasattr(field, 'auto_now') and field.auto_now:
|
|
397
412
|
field.pre_save(child_obj, add=True)
|
|
398
413
|
|
|
399
414
|
return child_obj
|
|
@@ -9,9 +9,9 @@ django_bulk_hooks/handler.py,sha256=xZt8iNdYF-ACz-MnKMY0co6scWINU5V5wC1lyDn844k,
|
|
|
9
9
|
django_bulk_hooks/manager.py,sha256=DjEW-nZjhlBW6cp8GRPl6xOSsAmmquP0Y-QyCZMoSHo,6946
|
|
10
10
|
django_bulk_hooks/models.py,sha256=7RG7GrOdHXFjGVPV4FPRZVNMIHHW-hMCi6hn9LH_hVI,3331
|
|
11
11
|
django_bulk_hooks/priority.py,sha256=HG_2D35nga68lBCZmSXTcplXrjFoRgZFRDOy4ROKonY,376
|
|
12
|
-
django_bulk_hooks/queryset.py,sha256=
|
|
12
|
+
django_bulk_hooks/queryset.py,sha256=19uG70BxNAJwLqu3j3ZmT4DStX8sPRwbV9079m0yn84,16717
|
|
13
13
|
django_bulk_hooks/registry.py,sha256=-mQBizJ06nz_tajZBinViKx_uP2Tbc1tIpTEMv7lwKA,705
|
|
14
|
-
django_bulk_hooks-0.1.
|
|
15
|
-
django_bulk_hooks-0.1.
|
|
16
|
-
django_bulk_hooks-0.1.
|
|
17
|
-
django_bulk_hooks-0.1.
|
|
14
|
+
django_bulk_hooks-0.1.122.dist-info/LICENSE,sha256=dguKIcbDGeZD-vXWdLyErPUALYOvtX_fO4Zjhq481uk,1088
|
|
15
|
+
django_bulk_hooks-0.1.122.dist-info/METADATA,sha256=yR16rQOflmIN7AKOrewUgbdHZUCA7-beKcHxJaa_tQ8,6951
|
|
16
|
+
django_bulk_hooks-0.1.122.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
17
|
+
django_bulk_hooks-0.1.122.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|