django-bulk-hooks 0.2.27__tar.gz → 0.2.29__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.27 → django_bulk_hooks-0.2.29}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/bulk_executor.py +6 -39
  3. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/pyproject.toml +1 -1
  4. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/LICENSE +0 -0
  5. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/README.md +0 -0
  6. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/__init__.py +0 -0
  7. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/changeset.py +0 -0
  8. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/conditions.py +0 -0
  9. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/constants.py +0 -0
  10. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/context.py +0 -0
  11. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/decorators.py +0 -0
  12. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/dispatcher.py +0 -0
  13. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/enums.py +0 -0
  14. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/factory.py +0 -0
  15. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/handler.py +0 -0
  16. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/helpers.py +0 -0
  17. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/manager.py +0 -0
  18. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/models.py +0 -0
  19. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/__init__.py +0 -0
  20. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/analyzer.py +0 -0
  21. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/coordinator.py +0 -0
  22. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_handler.py +0 -0
  23. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/mti_plans.py +0 -0
  24. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/operations/record_classifier.py +0 -0
  25. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/django_bulk_hooks/queryset.py +0 -0
  26. {django_bulk_hooks-0.2.27 → django_bulk_hooks-0.2.29}/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.27
3
+ Version: 0.2.29
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
@@ -7,7 +7,7 @@ This service coordinates bulk database operations with validation and MTI handli
7
7
  import logging
8
8
 
9
9
  from django.db import transaction
10
- from django.db.models import AutoField
10
+ from django.db.models import AutoField, ForeignKey
11
11
 
12
12
  logger = logging.getLogger(__name__)
13
13
 
@@ -455,58 +455,25 @@ class BulkExecutor:
455
455
  case_statements = {}
456
456
  for field_name in field_group.fields:
457
457
  field = field_group.model_class._meta.get_field(field_name)
458
-
459
- # Use column name for FK fields
460
- if getattr(field, "is_relation", False) and hasattr(field, "attname"):
461
- db_field_name = field.attname
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}")
472
- else:
473
- db_field_name = field_name
474
- target_field = field
475
-
476
458
  when_statements = []
459
+
477
460
  for pk, obj in zip(root_pks, plan.objects):
478
461
  obj_pk = getattr(obj, "pk", None) or getattr(obj, "id", None)
479
462
  if obj_pk is None:
480
463
  continue
481
464
 
482
- value = getattr(obj, db_field_name)
483
-
484
- # For FK fields, ensure we get the actual ID value, not the related object
485
- if getattr(field, "is_relation", False) and hasattr(field, "attname"):
486
- # If value is a model instance, get its pk
487
- if value is not None and hasattr(value, "pk"):
488
- value = value.pk
489
- # If value is a string representation of an ID, convert to int
490
- elif value is not None and isinstance(value, str):
491
- if value.isdigit():
492
- value = int(value)
493
- elif value == "":
494
- value = None
495
-
496
- # Create the Value expression with proper type casting
497
- value_expr = Value(value, output_field=target_field)
465
+ # Get the field value - handle ForeignKey fields specially
466
+ value = getattr(obj, field.attname, None) if isinstance(field, ForeignKey) else getattr(obj, field_name)
498
467
 
499
468
  when_statements.append(
500
469
  When(
501
470
  **{field_group.filter_field: pk},
502
- then=value_expr,
471
+ then=Value(value, output_field=field),
503
472
  ),
504
473
  )
505
474
 
506
475
  if when_statements:
507
- case_statements[db_field_name] = Case(
508
- *when_statements, output_field=target_field,
509
- )
476
+ case_statements[field_name] = Case(*when_statements, output_field=field)
510
477
 
511
478
  # Execute bulk update
512
479
  if case_statements:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.2.27"
3
+ version = "0.2.29"
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"