django-bulk-hooks 0.2.26__tar.gz → 0.2.27__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 (26) hide show
  1. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/bulk_executor.py +11 -22
  3. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/pyproject.toml +1 -1
  4. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/LICENSE +0 -0
  5. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/README.md +0 -0
  6. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/__init__.py +0 -0
  7. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/changeset.py +0 -0
  8. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/conditions.py +0 -0
  9. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/constants.py +0 -0
  10. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/context.py +0 -0
  11. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/decorators.py +0 -0
  12. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/dispatcher.py +0 -0
  13. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/enums.py +0 -0
  14. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/factory.py +0 -0
  15. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/handler.py +0 -0
  16. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/helpers.py +0 -0
  17. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/manager.py +0 -0
  18. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/models.py +0 -0
  19. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/__init__.py +0 -0
  20. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/analyzer.py +0 -0
  21. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/coordinator.py +0 -0
  22. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/mti_handler.py +0 -0
  23. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/mti_plans.py +0 -0
  24. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/operations/record_classifier.py +0 -0
  25. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/django_bulk_hooks/queryset.py +0 -0
  26. {django_bulk_hooks-0.2.26 → django_bulk_hooks-0.2.27}/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.26
3
+ Version: 0.2.27
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
@@ -459,13 +459,16 @@ class BulkExecutor:
459
459
  # Use column name for FK fields
460
460
  if getattr(field, "is_relation", False) and hasattr(field, "attname"):
461
461
  db_field_name = field.attname
462
- # Get the field object for the database column, not the target field
463
- target_field = field_group.model_class._meta.get_field(field.attname)
464
- logger.error(f"DEBUG FK FIELD RESOLUTION: field_name={field_name}, db_field_name={db_field_name}")
465
- logger.error(f"DEBUG FK ORIGINAL FIELD: {field}")
466
- logger.error(f"DEBUG FK TARGET FIELD: {target_field}")
467
- logger.error(f"DEBUG FK TARGET FIELD TYPE: {type(target_field)}")
468
- logger.error(f"DEBUG FK TARGET FIELD CLASS: {target_field.__class__}")
462
+ # For FK fields, use the actual target field from the relationship
463
+ # This ensures proper type casting for the database column
464
+ if hasattr(field, "target_field"):
465
+ target_field = field.target_field
466
+ else:
467
+ # Fallback: create a field that matches the FK column type
468
+ from django.db.models import BigIntegerField
469
+ target_field = BigIntegerField()
470
+
471
+ logger.debug(f"FK field {field_name} -> column {db_field_name}, target_field: {target_field}")
469
472
  else:
470
473
  db_field_name = field_name
471
474
  target_field = field
@@ -480,32 +483,18 @@ class BulkExecutor:
480
483
 
481
484
  # For FK fields, ensure we get the actual ID value, not the related object
482
485
  if getattr(field, "is_relation", False) and hasattr(field, "attname"):
483
- # ADD DEBUG LOGGING
484
- logger.error(f"DEBUG FK CONVERSION: field={field_name}, db_field={db_field_name}")
485
- logger.error(f"DEBUG FK VALUE BEFORE: value={value!r}, type={type(value)}")
486
- logger.error(f"DEBUG FK field.attname={field.attname}, field.target_field={getattr(field, 'target_field', 'N/A')}")
487
-
488
486
  # If value is a model instance, get its pk
489
487
  if value is not None and hasattr(value, "pk"):
490
488
  value = value.pk
491
- logger.error(f"DEBUG FK: Extracted pk from model instance: {value!r}")
492
489
  # If value is a string representation of an ID, convert to int
493
490
  elif value is not None and isinstance(value, str):
494
- logger.error(f"DEBUG FK: Value is string, isdigit()={value.isdigit()}")
495
491
  if value.isdigit():
496
492
  value = int(value)
497
- logger.error(f"DEBUG FK: Converted string to int: {value!r}")
498
493
  elif value == "":
499
494
  value = None
500
- logger.error(f"DEBUG FK: Converted empty string to None")
501
- else:
502
- logger.error(f"DEBUG FK: String value doesn't pass isdigit() check! ASCII codes: {[ord(c) for c in value]}")
503
-
504
- logger.error(f"DEBUG FK VALUE AFTER: value={value!r}, type={type(value)}")
505
495
 
506
- # Create the Value expression - always use output_field to ensure correct type casting
496
+ # Create the Value expression with proper type casting
507
497
  value_expr = Value(value, output_field=target_field)
508
- logger.error(f"DEBUG VALUE EXPRESSION: value={value!r}, output_field={target_field}, value_expr={value_expr}")
509
498
 
510
499
  when_statements.append(
511
500
  When(
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.2.26"
3
+ version = "0.2.27"
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"