django-bulk-hooks 0.1.244__tar.gz → 0.1.245__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.
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/PKG-INFO +1 -1
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/queryset.py +24 -6
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/pyproject.toml +1 -1
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/LICENSE +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/README.md +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/engine.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/manager.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/priority.py +0 -0
- {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/registry.py +0 -0
|
@@ -172,14 +172,21 @@ class HookQuerySetMixin:
|
|
|
172
172
|
logger.debug("update: running hooks with Salesforce-style behavior")
|
|
173
173
|
ctx = HookContext(model_cls, bypass_hooks=False)
|
|
174
174
|
|
|
175
|
-
#
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
175
|
+
# For Subquery updates, we need to run hooks AFTER the database update and refresh
|
|
176
|
+
# For non-Subquery updates, we can run hooks before the database update as usual
|
|
177
|
+
if not has_subquery:
|
|
178
|
+
# Run validation hooks first
|
|
179
|
+
engine.run(model_cls, VALIDATE_UPDATE, instances, originals, ctx=ctx)
|
|
180
|
+
# Then run BEFORE_UPDATE hooks
|
|
181
|
+
engine.run(model_cls, BEFORE_UPDATE, instances, originals, ctx=ctx)
|
|
179
182
|
|
|
180
183
|
# Persist any additional field mutations made by BEFORE_UPDATE hooks.
|
|
181
184
|
# Build CASE statements per modified field not already present in kwargs.
|
|
182
|
-
modified_fields =
|
|
185
|
+
modified_fields = (
|
|
186
|
+
self._detect_modified_fields(instances, originals)
|
|
187
|
+
if not has_subquery
|
|
188
|
+
else set()
|
|
189
|
+
)
|
|
183
190
|
extra_fields = [f for f in modified_fields if f not in kwargs]
|
|
184
191
|
if extra_fields:
|
|
185
192
|
case_statements = {}
|
|
@@ -377,7 +384,11 @@ class HookQuerySetMixin:
|
|
|
377
384
|
raise
|
|
378
385
|
|
|
379
386
|
# If we used Subquery objects, refresh the instances to get computed values
|
|
380
|
-
|
|
387
|
+
# and then run hooks so HasChanged conditions work correctly
|
|
388
|
+
if has_subquery and instances and not current_bypass_hooks:
|
|
389
|
+
logger.debug(
|
|
390
|
+
"Refreshing instances with Subquery computed values before running hooks"
|
|
391
|
+
)
|
|
381
392
|
# Simple refresh of model fields without fetching related objects
|
|
382
393
|
# Subquery updates only affect the model's own fields, not relationships
|
|
383
394
|
refreshed_instances = {
|
|
@@ -397,6 +408,13 @@ class HookQuerySetMixin:
|
|
|
397
408
|
getattr(refreshed_instance, field.name),
|
|
398
409
|
)
|
|
399
410
|
|
|
411
|
+
# Now run the hooks with the refreshed instances containing computed values
|
|
412
|
+
logger.debug("Running hooks after Subquery refresh")
|
|
413
|
+
# Run validation hooks first
|
|
414
|
+
engine.run(model_cls, VALIDATE_UPDATE, instances, originals, ctx=ctx)
|
|
415
|
+
# Then run BEFORE_UPDATE hooks
|
|
416
|
+
engine.run(model_cls, BEFORE_UPDATE, instances, originals, ctx=ctx)
|
|
417
|
+
|
|
400
418
|
# Salesforce-style: Always run AFTER_UPDATE hooks unless explicitly bypassed
|
|
401
419
|
if not current_bypass_hooks:
|
|
402
420
|
logger.debug("update: running AFTER_UPDATE")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "django-bulk-hooks"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.245"
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|