django-bulk-hooks 0.1.107__tar.gz → 0.1.109__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.107 → django_bulk_hooks-0.1.109}/PKG-INFO +1 -1
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/manager.py +41 -5
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/pyproject.toml +1 -1
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/LICENSE +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/README.md +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/__init__.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/conditions.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/constants.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/context.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/decorators.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/engine.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/enums.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/handler.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/models.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/priority.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/queryset.py +0 -0
- {django_bulk_hooks-0.1.107 → django_bulk_hooks-0.1.109}/django_bulk_hooks/registry.py +0 -0
|
@@ -140,20 +140,41 @@ class BulkHookManager(models.Manager):
|
|
|
140
140
|
continue
|
|
141
141
|
|
|
142
142
|
# Handle multi-table inheritance
|
|
143
|
-
# Step 1: Bulk create base objects
|
|
143
|
+
# Step 1: Bulk create base objects with hooks
|
|
144
144
|
base_objects = self._extract_base_objects(class_objects, obj_class)
|
|
145
|
-
|
|
145
|
+
|
|
146
|
+
# Use the model's manager with hooks
|
|
147
|
+
base_model = self._get_base_model(obj_class)
|
|
148
|
+
|
|
149
|
+
# Try to avoid recursion by using raw SQL or _base_manager
|
|
150
|
+
try:
|
|
151
|
+
if hasattr(base_model.objects, 'bulk_create'):
|
|
152
|
+
# Use the base model's manager with hooks
|
|
153
|
+
created_base = base_model.objects.bulk_create(base_objects, **kwargs)
|
|
154
|
+
else:
|
|
155
|
+
# Fallback to _base_manager
|
|
156
|
+
created_base = base_model._base_manager.bulk_create(base_objects, **kwargs)
|
|
157
|
+
except RecursionError:
|
|
158
|
+
# If recursion error, use _base_manager directly
|
|
159
|
+
created_base = base_model._base_manager.bulk_create(base_objects, **kwargs)
|
|
146
160
|
|
|
147
161
|
# Step 2: Update original objects with base IDs
|
|
148
162
|
for obj, base_obj in zip(class_objects, created_base):
|
|
149
163
|
obj.pk = base_obj.pk
|
|
150
164
|
obj._state.adding = False
|
|
151
165
|
|
|
152
|
-
# Step 3: Bulk create child objects
|
|
166
|
+
# Step 3: Bulk create child objects with hooks
|
|
153
167
|
child_objects = self._extract_child_objects(class_objects, obj_class)
|
|
154
168
|
if child_objects:
|
|
155
|
-
#
|
|
156
|
-
|
|
169
|
+
# Try to avoid recursion by using raw SQL or _base_manager
|
|
170
|
+
try:
|
|
171
|
+
if hasattr(obj_class.objects, 'bulk_create'):
|
|
172
|
+
obj_class.objects.bulk_create(child_objects, **kwargs)
|
|
173
|
+
else:
|
|
174
|
+
obj_class._base_manager.bulk_create(child_objects, **kwargs)
|
|
175
|
+
except RecursionError:
|
|
176
|
+
# If recursion error, use _base_manager directly
|
|
177
|
+
obj_class._base_manager.bulk_create(child_objects, **kwargs)
|
|
157
178
|
|
|
158
179
|
result.extend(class_objects)
|
|
159
180
|
|
|
@@ -163,6 +184,21 @@ class BulkHookManager(models.Manager):
|
|
|
163
184
|
logger = logging.getLogger(__name__)
|
|
164
185
|
logger.error(f"Error in _bulk_create_inherited for {obj_class}: {e}")
|
|
165
186
|
logger.error(f"Model fields: {[f.name for f in obj_class._meta.fields]}")
|
|
187
|
+
logger.error(f"Base model: {self._get_base_model(obj_class)}")
|
|
188
|
+
logger.error(f"Base model manager: {self._get_base_model(obj_class).objects}")
|
|
189
|
+
|
|
190
|
+
# If it's a recursion error, try a simpler approach
|
|
191
|
+
if isinstance(e, RecursionError):
|
|
192
|
+
logger.error("Recursion error detected, trying fallback approach")
|
|
193
|
+
try:
|
|
194
|
+
# Fallback: use individual saves
|
|
195
|
+
for obj in class_objects:
|
|
196
|
+
obj.save()
|
|
197
|
+
result.extend(class_objects)
|
|
198
|
+
continue
|
|
199
|
+
except Exception as fallback_error:
|
|
200
|
+
logger.error(f"Fallback approach also failed: {fallback_error}")
|
|
201
|
+
|
|
166
202
|
raise
|
|
167
203
|
|
|
168
204
|
return result
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "django-bulk-hooks"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.109"
|
|
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
|