|
9 | 9 | from django.db import IntegrityError, router, transaction |
10 | 10 | from django.db.models import ManyToManyField, ProtectedError, RestrictedError |
11 | 11 | from django.db.models.fields.reverse_related import ManyToManyRel |
12 | | -from django.forms import ModelMultipleChoiceField, MultipleHiddenInput |
| 12 | +from django.forms import ModelMultipleChoiceField, MultipleHiddenInput, ValidationError |
13 | 13 | from django.http import HttpResponse |
14 | 14 | from django.shortcuts import get_object_or_404, redirect, render |
15 | 15 | from django.urls import reverse |
@@ -328,6 +328,13 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): |
328 | 328 | def get_required_permission(self): |
329 | 329 | return get_permission_for_model(self.queryset.model, 'add') |
330 | 330 |
|
| 331 | + def prep_related_object_list(self, field_name, enumerated_list): |
| 332 | + """ |
| 333 | + Hook to modify the enumerated list of related objects before it's passed to the related object form (for |
| 334 | + example, to change the order). |
| 335 | + """ |
| 336 | + pass # TODO keep in-place only, or return modified list? |
| 337 | + |
331 | 338 | def prep_related_object_data(self, parent, data): |
332 | 339 | """ |
333 | 340 | Hook to modify the data for related objects before it's passed to the related object form (for example, to |
@@ -369,6 +376,13 @@ def _save_object(self, import_form, model_form, request): |
369 | 376 | raise AbortTransaction() |
370 | 377 | related_objects = list(enumerate(related_objects)) |
371 | 378 |
|
| 379 | + try: |
| 380 | + self.prep_related_object_list(field_name, related_objects) |
| 381 | + except ValidationError as e: |
| 382 | + for message in e.messages: |
| 383 | + import_form.add_error(None, f"{field_name}: {message}") |
| 384 | + raise AbortTransaction() |
| 385 | + |
372 | 386 | related_obj_pks = [] |
373 | 387 | for i, rel_obj_data in related_objects: |
374 | 388 | if not isinstance(rel_obj_data, dict): # TODO isinstance(MutableMapping)? |
|
0 commit comments