django-bulk-hooks 0.1.254__tar.gz → 0.1.255__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.254 → django_bulk_hooks-0.1.255}/PKG-INFO +1 -1
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/queryset.py +21 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/pyproject.toml +1 -1
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/LICENSE +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/README.md +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/engine.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/manager.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/priority.py +0 -0
- {django_bulk_hooks-0.1.254 → django_bulk_hooks-0.1.255}/django_bulk_hooks/registry.py +0 -0
|
@@ -627,17 +627,24 @@ class HookQuerySetMixin:
|
|
|
627
627
|
# CRITICAL: Exclude auto_now fields from update_fields for existing records
|
|
628
628
|
# This prevents Django from including them in the ON CONFLICT DO UPDATE clause
|
|
629
629
|
if existing_records and update_fields:
|
|
630
|
+
logger.debug(f"Processing {len(existing_records)} existing records with update_fields: {update_fields}")
|
|
631
|
+
|
|
630
632
|
# Identify auto_now fields that should be excluded from updates
|
|
631
633
|
auto_now_fields_to_exclude = set()
|
|
632
634
|
for field in model_cls._meta.local_fields:
|
|
633
635
|
if hasattr(field, "auto_now") and field.auto_now:
|
|
634
636
|
auto_now_fields_to_exclude.add(field.name)
|
|
635
637
|
|
|
638
|
+
logger.debug(f"Found auto_now fields: {auto_now_fields_to_exclude}")
|
|
639
|
+
|
|
636
640
|
# Filter out auto_now fields from update_fields for existing records
|
|
637
641
|
if auto_now_fields_to_exclude:
|
|
638
642
|
# Create a filtered version of update_fields that excludes auto_now fields
|
|
639
643
|
filtered_update_fields = [f for f in update_fields if f not in auto_now_fields_to_exclude]
|
|
640
644
|
|
|
645
|
+
logger.debug(f"Filtered update_fields: {filtered_update_fields}")
|
|
646
|
+
logger.debug(f"Excluded auto_now fields: {auto_now_fields_to_exclude}")
|
|
647
|
+
|
|
641
648
|
# Store the original update_fields to restore later
|
|
642
649
|
ctx.original_update_fields = update_fields
|
|
643
650
|
ctx.auto_now_fields_excluded = auto_now_fields_to_exclude
|
|
@@ -645,6 +652,12 @@ class HookQuerySetMixin:
|
|
|
645
652
|
# Use the filtered update_fields for the database operation
|
|
646
653
|
# This prevents Django from overwriting the timestamps during upsert
|
|
647
654
|
update_fields = filtered_update_fields
|
|
655
|
+
|
|
656
|
+
logger.debug(f"Final update_fields for DB operation: {update_fields}")
|
|
657
|
+
else:
|
|
658
|
+
logger.debug("No auto_now fields found to exclude")
|
|
659
|
+
else:
|
|
660
|
+
logger.debug(f"No existing records or update_fields to process. existing_records: {len(existing_records) if existing_records else 0}, update_fields: {update_fields}")
|
|
648
661
|
|
|
649
662
|
# Run validation hooks on all records
|
|
650
663
|
if not bypass_validation:
|
|
@@ -694,6 +707,10 @@ class HookQuerySetMixin:
|
|
|
694
707
|
# but we need to call it on the base manager to avoid recursion
|
|
695
708
|
# Filter out custom parameters that Django's bulk_create doesn't accept
|
|
696
709
|
|
|
710
|
+
logger.debug(f"Calling Django bulk_create with update_fields: {update_fields}")
|
|
711
|
+
logger.debug(f"Calling Django bulk_create with update_conflicts: {update_conflicts}")
|
|
712
|
+
logger.debug(f"Calling Django bulk_create with unique_fields: {unique_fields}")
|
|
713
|
+
|
|
697
714
|
result = super().bulk_create(
|
|
698
715
|
objs,
|
|
699
716
|
batch_size=batch_size,
|
|
@@ -702,15 +719,19 @@ class HookQuerySetMixin:
|
|
|
702
719
|
update_fields=update_fields,
|
|
703
720
|
unique_fields=unique_fields,
|
|
704
721
|
)
|
|
722
|
+
|
|
723
|
+
logger.debug(f"Django bulk_create completed with result: {result}")
|
|
705
724
|
|
|
706
725
|
# Fire AFTER hooks
|
|
707
726
|
if not bypass_hooks:
|
|
708
727
|
if update_conflicts and unique_fields:
|
|
709
728
|
# Restore original update_fields if we modified them
|
|
710
729
|
if hasattr(ctx, 'original_update_fields'):
|
|
730
|
+
logger.debug(f"Restoring original update_fields: {ctx.original_update_fields}")
|
|
711
731
|
update_fields = ctx.original_update_fields
|
|
712
732
|
delattr(ctx, 'original_update_fields')
|
|
713
733
|
delattr(ctx, 'auto_now_fields_excluded')
|
|
734
|
+
logger.debug(f"Restored update_fields: {update_fields}")
|
|
714
735
|
|
|
715
736
|
# For upsert operations, we need to determine which records were actually created vs updated
|
|
716
737
|
# Use the same logic as before to separate records
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "django-bulk-hooks"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.255"
|
|
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
|