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.
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/PKG-INFO +1 -1
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/bulk_executor.py +26 -1
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_handler.py +4 -17
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/pyproject.toml +1 -1
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/LICENSE +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/README.md +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/changeset.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/dispatcher.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/factory.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/helpers.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/manager.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/__init__.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/analyzer.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/coordinator.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/field_utils.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_plans.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/record_classifier.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/queryset.py +0 -0
- {django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/registry.py +0 -0
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/bulk_executor.py
RENAMED
|
@@ -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)
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_handler.py
RENAMED
|
@@ -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
|
-
#
|
|
559
|
-
|
|
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
|
|
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:
|
|
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
|
|
File without changes
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/__init__.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/analyzer.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/coordinator.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/field_utils.py
RENAMED
|
File without changes
|
{django_bulk_hooks-0.2.59 → django_bulk_hooks-0.2.60}/django_bulk_hooks/operations/mti_plans.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|