Skip to content

Commit e26219d

Browse files
authored
Bump django-import-export to 4.3.4 (#13414)
1 parent 983fc03 commit e26219d

17 files changed

+218
-183
lines changed

Diff for: stubs/django-import-export/import_export/admin.pyi

+27-32
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
from _typeshed import Incomplete
2-
from collections.abc import Callable
2+
from collections.abc import Callable, Sequence
33
from logging import Logger
4-
from typing import Any, TypeVar
4+
from typing import Any, Literal, TypeVar
55
from typing_extensions import TypeAlias, deprecated
66

77
from django.contrib import admin
88
from django.contrib.admin.helpers import ActionForm
99
from django.core.files import File
1010
from django.db.models import Model, QuerySet
11-
from django.forms import Form, Media
11+
from django.forms import Form
1212
from django.http.request import HttpRequest
1313
from django.http.response import HttpResponse
1414
from django.template.response import TemplateResponse
@@ -38,33 +38,21 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase):
3838
import_form_class: type[Form] = ...
3939
confirm_form_class: type[Form] = ...
4040
from_encoding: str
41+
import_error_display: Sequence[Literal["message", "row", "traceback"]]
4142
skip_admin_log: bool | None
4243
tmp_storage_class: str | type[BaseStorage]
4344
def get_skip_admin_log(self) -> bool: ...
4445
def get_tmp_storage_class(self) -> type[BaseStorage]: ...
46+
def get_tmp_storage_class_kwargs(self) -> dict[str, Any]: ...
4547
def has_import_permission(self, request: HttpRequest) -> bool: ...
4648
def get_urls(self) -> list[URLPattern]: ...
47-
def process_import(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ...
48-
def process_dataset(
49-
self,
50-
dataset: Dataset,
51-
confirm_form: Form,
52-
request: HttpRequest,
53-
*args: Any,
54-
rollback_on_validation_errors: bool = False,
55-
**kwargs: Any,
56-
) -> Result: ...
49+
def process_import(self, request: HttpRequest, **kwargs: Any) -> HttpResponse: ...
50+
def process_dataset(self, dataset: Dataset, form: Form, request: HttpRequest, **kwargs: Any) -> Result: ...
5751
def process_result(self, result: Result, request: HttpRequest) -> HttpResponse: ...
5852
def generate_log_entries(self, result: Result, request: HttpRequest) -> None: ...
5953
def add_success_message(self, result: Result, request: HttpRequest) -> None: ...
6054
def get_import_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
6155
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
62-
@deprecated("Use get_import_form_class instead")
63-
def get_import_form(self) -> type[Form]: ...
64-
@deprecated("Use get_confirm_form_class instead")
65-
def get_confirm_import_form(self) -> type[Form]: ...
66-
@deprecated("Use get_import_form_kwargs or get_confirm_form_kwargs")
67-
def get_form_kwargs(self, form: Form, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
6856
def create_import_form(self, request: HttpRequest) -> Form: ...
6957
def get_import_form_class(self, request: HttpRequest) -> type[Form]: ...
7058
def get_import_form_kwargs(self, request: HttpRequest) -> dict[str, Any]: ...
@@ -73,42 +61,49 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase):
7361
def get_confirm_form_class(self, request: HttpRequest) -> type[Form]: ...
7462
def get_confirm_form_kwargs(self, request: HttpRequest, import_form: Form | None = None) -> dict[str, Any]: ...
7563
def get_confirm_form_initial(self, request: HttpRequest, import_form: Form | None) -> dict[str, Any]: ...
76-
def get_import_data_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
64+
def get_import_data_kwargs(self, **kwargs: Any) -> dict[str, Any]: ...
7765
def write_to_tmp_storage(self, import_file: File[bytes], input_format: Format) -> BaseStorage: ...
7866
def add_data_read_fail_error_to_form(self, form: Form, e: Exception) -> None: ...
79-
def import_action(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ...
67+
def import_action(self, request: HttpRequest, **kwargs: Any) -> TemplateResponse: ...
8068
def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
8169

8270
class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase):
83-
import_export_change_list_template: str | None
71+
import_export_change_list_template: str
8472
export_template_name: str
8573
to_encoding: str | None
8674
export_form_class: type[Form] = ...
8775
def get_urls(self) -> list[URLPattern]: ...
8876
def has_export_permission(self, request: HttpRequest) -> bool: ...
8977
def get_export_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ...
90-
def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> str | bytes: ...
78+
def get_export_data(
79+
self, file_format: Format, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any
80+
) -> str | bytes: ...
9181
def get_export_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
9282
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
93-
@deprecated("Use get_export_form_class or use the export_form_class attribute")
94-
def get_export_form(self) -> Form: ...
9583
def get_export_form_class(self) -> type[Form]: ...
96-
def export_action(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ...
84+
def export_action(self, request: HttpRequest) -> TemplateResponse: ...
85+
@deprecated(
86+
"The 'get_valid_export_item_pks()' method is deprecated and will be removed in a future release. "
87+
"Overwrite 'get_queryset()' or 'get_export_queryset()' instead."
88+
)
89+
def get_valid_export_item_pks(self, request: HttpRequest) -> list[str]: ...
9790
def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ...
9891
def get_export_filename(self, request: HttpRequest, queryset: QuerySet[_ModelT], file_format: Format) -> str: ... # type: ignore[override]
92+
def init_request_context_data(self, request: HttpRequest, form: Form) -> dict[str, Any]: ...
9993

100-
class ImportExportMixin(ImportMixin[_ModelT], ExportMixin[_ModelT]):
101-
import_export_change_list_template: str
102-
94+
class ImportExportMixin(ImportMixin[_ModelT], ExportMixin[_ModelT]): ...
10395
class ImportExportModelAdmin(ImportExportMixin[_ModelT], admin.ModelAdmin[_ModelT]): ... # type: ignore[misc]
10496

10597
class ExportActionMixin(ExportMixin[_ModelT]):
98+
change_form_template: str
99+
show_change_form_export: bool
106100
action_form: type[ActionForm]
107-
def __init__(self, *args: Any, **kwargs: Any) -> None: ...
101+
def change_view(
102+
self, request: HttpRequest, object_id: str, form_url: str = "", extra_context: dict[str, Any] | None = None
103+
) -> HttpResponse: ...
104+
def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ...
108105
def export_admin_action(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> HttpResponse: ...
109106
def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ...
110-
@property
111-
def media(self) -> Media: ...
112107

113108
class ExportActionModelAdmin(ExportActionMixin[_ModelT], admin.ModelAdmin[_ModelT]): ... # type: ignore[misc]
114109
class ImportExportActionModelAdmin(ImportMixin[_ModelT], ExportActionModelAdmin[_ModelT]): ... # type: ignore[misc]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from _typeshed import StrPath
2+
from typing import Any
3+
4+
from .formats.base_formats import Format
5+
from .resources import ModelResource
6+
7+
def get_resource_class(model_or_resource_class: str) -> ModelResource[Any]: ...
8+
9+
MIME_TYPE_FORMAT_MAPPING: dict[str, type[Format]]
10+
11+
def get_format_class(format_name: str, file_name: StrPath, encoding: str | None = None) -> Format: ...
12+
def get_default_format_names() -> str: ...
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import _typeshed
2+
from logging import Logger
3+
from typing import Any
4+
5+
logger: Logger
6+
7+
class DeclarativeMetaclass(type):
8+
def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ...
9+
10+
class ModelDeclarativeMetaclass(DeclarativeMetaclass):
11+
def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ...
+9
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
1+
from typing import Any
2+
13
class ImportExportError(Exception): ...
24
class FieldError(ImportExportError): ...
5+
class WidgetError(ImportExportError): ...
6+
7+
class ImportError(ImportExportError):
8+
error: Exception
9+
number: int | None
10+
row: dict[str, Any] | None
11+
def __init__(self, error: Exception, number: int | None = None, row: dict[str, Any] | None = None) -> None: ...

Diff for: stubs/django-import-export/import_export/fields.pyi

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class Field:
2727
dehydrate_method: str | None = None,
2828
m2m_add: bool = False,
2929
) -> None: ...
30-
def clean(self, data: Mapping[str, Any], **kwargs: Any) -> Any: ...
31-
def get_value(self, obj: Model) -> Any: ...
32-
def save(self, obj: Model, data: Mapping[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ...
33-
def export(self, obj: Model) -> str: ...
30+
def clean(self, row: Mapping[str, Any], **kwargs: Any) -> Any: ...
31+
def get_value(self, instance: Model) -> Any: ...
32+
def save(self, instance: Model, row: Mapping[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ...
33+
def export(self, instance: Model, **kwargs: Any) -> str: ...
3434
def get_dehydrate_method(self, field_name: str | None = None) -> str: ...

Diff for: stubs/django-import-export/import_export/formats/base_formats.pyi

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from _typeshed import Incomplete, ReadableBuffer
2+
from logging import Logger
23
from typing import IO, Any, ClassVar
34
from typing_extensions import Self, TypeAlias
45

56
Dataset: TypeAlias = Incomplete # tablib.Dataset
67

8+
logger: Logger
9+
710
class Format:
811
def get_title(self) -> type[Self]: ...
912
def create_dataset(self, in_stream: str | bytes | IO[Any]) -> Dataset: ...
@@ -43,8 +46,7 @@ class TSV(TextFormat):
4346
class ODS(TextFormat):
4447
def export_data(self, dataset: Dataset, **kwargs: Any) -> bytes: ...
4548

46-
class HTML(TextFormat):
47-
def export_data(self, dataset: Dataset, **kwargs: Any) -> str: ...
49+
class HTML(TextFormat): ...
4850

4951
class XLS(TablibFormat):
5052
def export_data(self, dataset: Dataset, **kwargs: Any) -> bytes: ...
@@ -55,3 +57,4 @@ class XLSX(TablibFormat):
5557
def create_dataset(self, in_stream: ReadableBuffer) -> Dataset: ... # type: ignore[override]
5658

5759
DEFAULT_FORMATS: list[type[Format]]
60+
BINARY_FORMATS: list[type[Format]]

Diff for: stubs/django-import-export/import_export/forms.pyi

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,38 @@
1+
from collections.abc import Iterable, Sequence
12
from typing import Any
23

34
from django import forms
4-
from django.contrib.admin.helpers import ActionForm
55

66
from .formats.base_formats import Format
7-
from .resources import Resource
7+
from .resources import ModelResource, Resource
88

99
class ImportExportFormBase(forms.Form):
1010
resource: forms.ChoiceField
11-
def __init__(self, *args: Any, resources: list[type[Resource[Any]]] | None = None, **kwargs: Any) -> None: ...
11+
format: forms.ChoiceField
12+
def __init__(
13+
self, formats: list[type[Format]], resources: list[type[Resource[Any]]] | None = None, **kwargs: Any
14+
) -> None: ...
1215

1316
class ImportForm(ImportExportFormBase):
1417
import_file: forms.FileField
15-
input_format: forms.ChoiceField
16-
def __init__(self, import_formats: list[Format], *args: Any, **kwargs: Any) -> None: ...
18+
field_order: Sequence[str]
1719
@property
1820
def media(self) -> forms.Media: ...
1921

2022
class ConfirmImportForm(forms.Form):
2123
import_file_name: forms.CharField
2224
original_file_name: forms.CharField
23-
input_format: forms.CharField
2425
resource: forms.CharField
2526
def clean_import_file_name(self) -> str: ...
2627

2728
class ExportForm(ImportExportFormBase):
28-
file_format: forms.ChoiceField
29-
def __init__(self, formats: list[Format], *args: Any, **kwargs: Any) -> None: ...
29+
export_items: forms.MultipleChoiceField
3030

31-
def export_action_form_factory(formats: list[tuple[str, str]]) -> type[ActionForm]: ...
31+
class SelectableFieldsExportForm(ExportForm):
32+
resources: Iterable[ModelResource[Any]]
33+
is_selectable_fields_form: bool
34+
resource_fields: dict[str, list[str]]
35+
@staticmethod
36+
def create_boolean_field_name(resource: ModelResource[Any], field_name: str) -> str: ...
37+
def get_selected_resource(self) -> ModelResource[Any]: ...
38+
def get_selected_resource_export_fields(self) -> list[str]: ...

Diff for: stubs/django-import-export/import_export/mixins.pyi

+17-18
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from _typeshed import Incomplete, SupportsGetItem
22
from logging import Logger
33
from typing import Any, Generic, TypeVar
4-
from typing_extensions import TypeAlias
4+
from typing_extensions import TypeAlias, deprecated
55

66
from django.db.models import Model, QuerySet
77
from django.forms import BaseForm, Form
@@ -19,7 +19,6 @@ logger: Logger
1919
_ModelT = TypeVar("_ModelT", bound=Model)
2020

2121
class BaseImportExportMixin(Generic[_ModelT]):
22-
resource_class: type[Resource[_ModelT]]
2322
resource_classes: SupportsGetItem[int, type[Resource[_ModelT]]]
2423
@property
2524
def formats(self) -> list[type[Format]]: ...
@@ -28,39 +27,39 @@ class BaseImportExportMixin(Generic[_ModelT]):
2827
@property
2928
def import_formats(self) -> list[type[Format]]: ...
3029
def check_resource_classes(self, resource_classes: SupportsGetItem[int, type[Resource[_ModelT]]]) -> None: ...
31-
def get_resource_classes(self) -> list[type[Resource[_ModelT]]]: ...
30+
def get_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ...
3231
def get_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
3332
def get_resource_index(self, form: Form) -> int: ...
3433

3534
class BaseImportMixin(BaseImportExportMixin[_ModelT]):
36-
def get_import_resource_classes(self) -> list[type[Resource[_ModelT]]]: ...
35+
skip_import_confirm: bool
36+
def get_import_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ...
3737
def get_import_formats(self) -> list[Format]: ...
38-
def get_import_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
39-
def choose_import_resource_class(self, form: Form) -> type[Resource[_ModelT]]: ...
38+
def get_import_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ...
39+
def choose_import_resource_class(self, form: Form, request: HttpRequest) -> type[Resource[_ModelT]]: ...
40+
def is_skip_import_confirm_enabled(self) -> bool: ...
4041

4142
class BaseExportMixin(BaseImportExportMixin[_ModelT]):
4243
model: Model
43-
escape_exported_data: bool
44-
escape_html: bool
45-
escape_formulae: bool
46-
@property
47-
def should_escape_html(self) -> bool: ...
48-
@property
49-
def should_escape_formulae(self) -> bool: ...
44+
skip_export_form: bool
45+
skip_export_form_from_action: bool
5046
def get_export_formats(self) -> list[Format]: ...
51-
def get_export_resource_classes(self) -> list[Resource[_ModelT]]: ...
52-
def choose_export_resource_class(self, form: Form) -> Resource[_ModelT]: ...
53-
def get_export_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ...
54-
def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> Dataset: ...
47+
def get_export_resource_classes(self, request: HttpRequest) -> list[Resource[_ModelT]]: ...
48+
def choose_export_resource_class(self, form: Form, request: HttpRequest) -> Resource[_ModelT]: ...
49+
def get_export_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ...
50+
def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any) -> Dataset: ...
5551
def get_export_filename(self, file_format: Format) -> str: ...
52+
def is_skip_export_form_enabled(self) -> bool: ...
53+
def is_skip_export_form_from_action_enabled(self) -> bool: ...
5654

5755
class ExportViewMixin(BaseExportMixin[_ModelT]):
5856
form_class: type[BaseForm] = ...
59-
def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> str | bytes: ...
57+
def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], **kwargs: Any) -> str | bytes: ...
6058
def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ...
6159
def get_form_kwargs(self) -> dict[str, Any]: ...
6260

6361
_FormT = TypeVar("_FormT", bound=BaseForm)
6462

63+
@deprecated("ExportViewFormMixin is deprecated and will be removed in a future release.")
6564
class ExportViewFormMixin(ExportViewMixin[_ModelT], FormView[_FormT]): # type: ignore[misc]
6665
def form_valid(self, form: _FormT) -> HttpResponse: ...

Diff for: stubs/django-import-export/import_export/options.pyi

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from collections.abc import Sequence
2+
from typing import Any, Generic, TypeVar
3+
4+
from django.db.models import Model
5+
6+
from .instance_loaders import BaseInstanceLoader
7+
8+
_ModelT = TypeVar("_ModelT", bound=Model)
9+
10+
class ResourceOptions(Generic[_ModelT]):
11+
model: _ModelT | str
12+
fields: Sequence[str] | None
13+
exclude: Sequence[str] | None
14+
instance_loader_class: type[BaseInstanceLoader] | None
15+
import_id_fields: Sequence[str]
16+
export_order: Sequence[str] | None
17+
import_order: Sequence[str] | None
18+
widgets: dict[str, Any] | None
19+
use_transactions: bool | None
20+
skip_unchanged: bool
21+
report_skipped: bool
22+
clean_model_instances: bool
23+
chunk_size: int | None
24+
skip_diff: bool
25+
skip_html_diff: bool
26+
use_bulk: bool
27+
batch_size: int
28+
force_init_instance: bool
29+
using_db: str | None
30+
store_row_values: bool
31+
store_instance: bool
32+
use_natural_foreign_keys: bool

0 commit comments

Comments
 (0)