django-bulk-hooks 0.2.59__tar.gz → 0.2.60__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 (27) hide show
  1. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/bulk_executor.py +26 -1
  3. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_handler.py +4 -17
  4. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/pyproject.toml +1 -1
  5. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/LICENSE +0 -0
  6. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/README.md +0 -0
  7. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/__init__.py +0 -0
  8. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/changeset.py +0 -0
  9. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/conditions.py +0 -0
  10. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/constants.py +0 -0
  11. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/context.py +0 -0
  12. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/decorators.py +0 -0
  13. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/dispatcher.py +0 -0
  14. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/enums.py +0 -0
  15. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/factory.py +0 -0
  16. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/handler.py +0 -0
  17. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/helpers.py +0 -0
  18. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/manager.py +0 -0
  19. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/models.py +0 -0
  20. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/__init__.py +0 -0
  21. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/analyzer.py +0 -0
  22. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/coordinator.py +0 -0
  23. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/field_utils.py +0 -0
  24. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_plans.py +0 -0
  25. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/record_classifier.py +0 -0
  26. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/queryset.py +0 -0
  27. {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/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.2.59
3
+ Version: 0.2.60
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
@@ -182,10 +182,35 @@ class BulkExecutor:
182
182
  if not objs:
183
183
  return 0
184
184
 
185
+ # Ensure auto_now fields are included and pre-saved for all models
186
+ # This handles both MTI and non-MTI models uniformly (SOC & DRY)
187
+ fields = list(fields) # Make a copy so we can modify it
188
+
189
+ # Get models to check - for MTI, check entire inheritance chain
190
+ if self.mti_handler.is_mti_model():
191
+ models_to_check = self.mti_handler.get_inheritance_chain()
192
+ else:
193
+ models_to_check = [self.model_cls]
194
+
195
+ # Collect all auto_now fields and pre-save them
196
+ auto_now_fields = set()
197
+ for model in models_to_check:
198
+ for field in model._meta.local_fields:
199
+ if getattr(field, "auto_now", False) and not getattr(field, "auto_now_add", False):
200
+ auto_now_fields.add(field.name)
201
+ # Pre-save the field to set the value on instances
202
+ for obj in objs:
203
+ field.pre_save(obj, add=False)
204
+
205
+ # Add auto_now fields to the update list if not already present
206
+ for auto_now_field in auto_now_fields:
207
+ if auto_now_field not in fields:
208
+ fields.append(auto_now_field)
209
+
185
210
  # Check if this is an MTI model and route accordingly
186
211
  if self.mti_handler.is_mti_model():
187
212
  logger.info(f"Detected MTI model {self.model_cls.__name__}, using MTI bulk update")
188
- # Build execution plan
213
+ # Build execution plan (fields already have auto_now included)
189
214
  plan = self.mti_handler.build_update_plan(objs, fields, batch_size=batch_size)
190
215
  # Execute the plan
191
216
  return self._execute_mti_update_plan(plan)
@@ -537,7 +537,7 @@ class MTIHandler:
537
537
 
538
538
  Args:
539
539
  objs: List of model instances to update
540
- fields: List of field names to update
540
+ fields: List of field names to update (auto_now fields already included by executor)
541
541
  batch_size: Number of objects per batch
542
542
 
543
543
  Returns:
@@ -555,28 +555,15 @@ class MTIHandler:
555
555
 
556
556
  batch_size = batch_size or len(objs)
557
557
 
558
- # Handle auto_now fields
559
- for obj in objs:
560
- for model in inheritance_chain:
561
- for field in model._meta.local_fields:
562
- if getattr(field, "auto_now", False):
563
- field.pre_save(obj, add=False)
564
-
565
- # Add auto_now fields to update list
566
- auto_now_fields = set()
567
- for model in inheritance_chain:
568
- for field in model._meta.local_fields:
569
- if getattr(field, "auto_now", False):
570
- auto_now_fields.add(field.name)
571
-
572
- all_fields = list(fields) + list(auto_now_fields)
558
+ # Note: auto_now fields are already handled by executor.bulk_update()
559
+ # which calls pre_save() and includes them in the fields list
573
560
 
574
561
  # Group fields by model
575
562
  field_groups = []
576
563
  for model_idx, model in enumerate(inheritance_chain):
577
564
  model_fields = []
578
565
 
579
- for field_name in all_fields:
566
+ for field_name in fields:
580
567
  try:
581
568
  field = self.model_cls._meta.get_field(field_name)
582
569
  if field in model._meta.local_fields:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.2.59"
3
+ version = "0.2.60"
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"