django-bulk-hooks 0.2.38__tar.gz → 0.2.40__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.38 → django_bulk_hooks-0.2.40}/PKG-INFO +1 -1
  2. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/bulk_executor.py +20 -5
  3. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/pyproject.toml +1 -1
  4. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/LICENSE +0 -0
  5. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/README.md +0 -0
  6. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/__init__.py +0 -0
  7. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/changeset.py +0 -0
  8. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/conditions.py +0 -0
  9. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/constants.py +0 -0
  10. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/context.py +0 -0
  11. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/decorators.py +0 -0
  12. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/dispatcher.py +0 -0
  13. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/enums.py +0 -0
  14. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/factory.py +0 -0
  15. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/handler.py +0 -0
  16. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/helpers.py +0 -0
  17. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/manager.py +0 -0
  18. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/models.py +0 -0
  19. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/__init__.py +0 -0
  20. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/analyzer.py +0 -0
  21. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/coordinator.py +0 -0
  22. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/mti_handler.py +0 -0
  23. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/mti_plans.py +0 -0
  24. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/operations/record_classifier.py +0 -0
  25. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/django_bulk_hooks/queryset.py +0 -0
  26. {django_bulk_hooks-0.2.38 → django_bulk_hooks-0.2.40}/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.38
3
+ Version: 0.2.40
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,8 @@ 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, ForeignKey
10
+ from django.db.models import AutoField, ForeignKey, Case, When, Value
11
+ from django.db.models.functions import Cast
11
12
 
12
13
  logger = logging.getLogger(__name__)
13
14
 
@@ -487,16 +488,16 @@ class BulkExecutor:
487
488
 
488
489
  # Handle NULL values specially for ForeignKey fields
489
490
  if is_fk and value is None:
490
- # For ForeignKey fields with None values, use None directly
491
- # Django handles this as proper NULL with correct type
491
+ # For ForeignKey fields with None values, use Cast to ensure proper NULL type
492
+ # PostgreSQL needs explicit type casting for NULL values in CASE statements
492
493
  logger.info(
493
494
  f"DEBUG NULL FIX APPLIED - Field: {field_name}, "
494
- f"PK: {pk}, Using None directly instead of Value(None, ...)"
495
+ f"PK: {pk}, Using Cast(Value(None), output_field={type(case_output_field).__name__})"
495
496
  )
496
497
  when_statements.append(
497
498
  When(
498
499
  **{field_group.filter_field: pk},
499
- then=None,
500
+ then=Cast(Value(None), output_field=case_output_field),
500
501
  ),
501
502
  )
502
503
  else:
@@ -528,6 +529,20 @@ class BulkExecutor:
528
529
  f"WhenThen: {when_stmt.result}, "
529
530
  f"WhenThenType: {type(when_stmt.result).__name__}"
530
531
  )
532
+
533
+ # DEBUG: Check if the When result has output_field
534
+ if hasattr(when_stmt.result, 'output_field'):
535
+ logger.info(
536
+ f"DEBUG When Result OutputField - Field: {field_name}, "
537
+ f"WhenIndex: {i}, "
538
+ f"ResultOutputField: {type(when_stmt.result.output_field).__name__}"
539
+ )
540
+ else:
541
+ logger.info(
542
+ f"DEBUG When Result No OutputField - Field: {field_name}, "
543
+ f"WhenIndex: {i}, "
544
+ f"ResultType: {type(when_stmt.result).__name__}"
545
+ )
531
546
 
532
547
  # Execute bulk update
533
548
  if case_statements:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-bulk-hooks"
3
- version = "0.2.38"
3
+ version = "0.2.40"
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"