django-bulk-hooks 0.1.74__tar.gz → 0.1.76__tar.gz

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.

Files changed (17) hide show
  1. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/context.py +0 -10
  3. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/manager.py +8 -22
  4. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/queryset.py +3 -19
  5. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/pyproject.toml +1 -1
  6. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/LICENSE +0 -0
  7. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/README.md +0 -0
  8. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/__init__.py +0 -0
  9. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/conditions.py +0 -0
  10. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/constants.py +0 -0
  11. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/decorators.py +0 -0
  12. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/engine.py +0 -0
  13. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/enums.py +0 -0
  14. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/handler.py +0 -0
  15. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/models.py +0 -0
  16. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/priority.py +0 -0
  17. {django_bulk_hooks-0.1.74 → django_bulk_hooks-0.1.76}/django_bulk_hooks/registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: django-bulk-hooks
3
- Version: 0.1.74
3
+ Version: 0.1.76
4
4
  Summary: Hook-style hooks for Django bulk operations like bulk_create and bulk_update.
5
5
  License: MIT
6
6
  Keywords: django,bulk,hooks
@@ -10,16 +10,6 @@ def get_hook_queue():
10
10
  return _hook_context.queue
11
11
 
12
12
 
13
- def is_in_bulk_operation():
14
- """Check if we're currently in a bulk operation to prevent recursion."""
15
- return getattr(_hook_context, "in_bulk_operation", False)
16
-
17
-
18
- def set_bulk_operation_flag(value):
19
- """Set the bulk operation flag to prevent recursion."""
20
- _hook_context.in_bulk_operation = value
21
-
22
-
23
13
  class HookContext:
24
14
  def __init__(self, model_cls, metadata=None):
25
15
  self.model_cls = model_cls
@@ -12,7 +12,7 @@ from django_bulk_hooks.constants import (
12
12
  VALIDATE_DELETE,
13
13
  VALIDATE_UPDATE,
14
14
  )
15
- from django_bulk_hooks.context import HookContext, is_in_bulk_operation, set_bulk_operation_flag
15
+ from django_bulk_hooks.context import HookContext
16
16
  from django_bulk_hooks.queryset import HookQuerySet
17
17
 
18
18
 
@@ -37,20 +37,10 @@ class BulkHookManager(models.Manager):
37
37
  )
38
38
 
39
39
  if not bypass_hooks:
40
- # Check if we're already in a hook context (recursive call)
41
- # If so, refetch the current database state like Salesforce does
42
- import threading
43
-
44
- if hasattr(threading.current_thread(), "_hook_context"):
45
- # We're in a recursive call - refetch current DB state
46
- originals = list(
47
- model_cls.objects.filter(pk__in=[obj.pk for obj in objs])
48
- )
49
- else:
50
- # First call - use the passed originals
51
- originals = list(
52
- model_cls.objects.filter(pk__in=[obj.pk for obj in objs])
53
- )
40
+ # Load originals for hook comparison
41
+ originals = list(
42
+ model_cls.objects.filter(pk__in=[obj.pk for obj in objs])
43
+ )
54
44
 
55
45
  ctx = HookContext(model_cls)
56
46
 
@@ -178,13 +168,9 @@ class BulkHookManager(models.Manager):
178
168
 
179
169
  pks = [obj.pk for obj in objs if obj.pk is not None]
180
170
 
181
- # Set flag to prevent recursion during the actual deletion
182
- set_bulk_operation_flag(True)
183
- try:
184
- # Use the custom manager - hooks won't fire again due to the flag
185
- model_cls.objects.filter(pk__in=pks).delete()
186
- finally:
187
- set_bulk_operation_flag(False)
171
+ # Use base manager for the actual deletion to prevent recursion
172
+ # The hooks have already been fired above, so we don't need them again
173
+ model_cls._base_manager.filter(pk__in=pks).delete()
188
174
 
189
175
  if not bypass_hooks:
190
176
  engine.run(model_cls, AFTER_DELETE, objs, ctx=ctx)
@@ -1,5 +1,4 @@
1
1
  from django.db import models, transaction
2
- from django_bulk_hooks.context import is_in_bulk_operation
3
2
 
4
3
 
5
4
  class HookQuerySet(models.QuerySet):
@@ -8,15 +7,7 @@ class HookQuerySet(models.QuerySet):
8
7
  objs = list(self)
9
8
  if not objs:
10
9
  return 0
11
-
12
- # If we're already in a bulk operation, use base manager to prevent recursion
13
- if is_in_bulk_operation():
14
- # Use standard Django delete method on base manager
15
- pks = [obj.pk for obj in objs if obj.pk is not None]
16
- return self.model._base_manager.filter(pk__in=pks).delete()[0]
17
- else:
18
- # Normal case - use custom manager to ensure hooks fire
19
- return self.model.objects.bulk_delete(objs)
10
+ return self.model.objects.bulk_delete(objs)
20
11
 
21
12
  @transaction.atomic
22
13
  def update(self, **kwargs):
@@ -29,7 +20,6 @@ class HookQuerySet(models.QuerySet):
29
20
 
30
21
  # Load originals for hook comparison
31
22
  originals = list(model_cls.objects.filter(pk__in=pks))
32
- originals_by_pk = {obj.pk: obj for obj in originals}
33
23
 
34
24
  # Apply field updates to instances
35
25
  for obj in instances:
@@ -44,14 +34,8 @@ class HookQuerySet(models.QuerySet):
44
34
  engine.run(model_cls, "before_update", instances, originals, ctx=ctx)
45
35
 
46
36
  # Use Django's built-in update logic directly
47
- # Set flag to prevent recursion during the actual update
48
- from django_bulk_hooks.context import set_bulk_operation_flag
49
- set_bulk_operation_flag(True)
50
- try:
51
- queryset = self.model.objects.filter(pk__in=pks)
52
- update_count = queryset.update(**kwargs)
53
- finally:
54
- set_bulk_operation_flag(False)
37
+ queryset = self.model.objects.filter(pk__in=pks)
38
+ update_count = queryset.update(**kwargs)
55
39
 
56
40
  # Run AFTER_UPDATE hooks
57
41
  engine.run(model_cls, "after_update", instances, originals, ctx=ctx)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.1.74"
3
+ version = "0.1.76"
4
4
  description = "Hook-style hooks for Django bulk operations like bulk_create and bulk_update."
5
5
  authors = ["Konrad Beck <konrad.beck@merchantcapital.co.za>"]
6
6
  readme = "README.md"