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.

Files changed (17) hide show
  1. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/queryset.py +24 -6
  3. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/pyproject.toml +1 -1
  4. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/LICENSE +0 -0
  5. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/README.md +0 -0
  6. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/__init__.py +0 -0
  7. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/conditions.py +0 -0
  8. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/constants.py +0 -0
  9. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/context.py +0 -0
  10. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/decorators.py +0 -0
  11. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/engine.py +0 -0
  12. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/enums.py +0 -0
  13. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/handler.py +0 -0
  14. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/manager.py +0 -0
  15. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/models.py +0 -0
  16. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/priority.py +0 -0
  17. {django_bulk_hooks-0.1.244 → django_bulk_hooks-0.1.245}/django_bulk_hooks/registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-bulk-hooks
3
- Version: 0.1.244
3
+ Version: 0.1.245
4
4
  Summary: Hook-style hooks for Django bulk operations like bulk_create and bulk_update.
5
5
  Home-page: https://github.com/AugendLimited/django-bulk-hooks
6
6
  License: MIT
@@ -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
- # Run validation hooks first
176
- engine.run(model_cls, VALIDATE_UPDATE, instances, originals, ctx=ctx)
177
- # Then run BEFORE_UPDATE hooks
178
- engine.run(model_cls, BEFORE_UPDATE, instances, originals, ctx=ctx)
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 = self._detect_modified_fields(instances, originals)
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
- if has_subquery and instances:
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.244"
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"