From aac497a51553cd62c3ba1096ef296a4930b5745e Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:14:05 +0100 Subject: [PATCH 01/38] Tackle https://github.com/django-import-export/django-import-export/pull/1629 --- .../import_export/admin.pyi | 18 ++--------- .../import_export/mixins.pyi | 3 -- .../import_export/resources.pyi | 30 +------------------ 3 files changed, 3 insertions(+), 48 deletions(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 6578d569f8b8..1faf62618ea7 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -2,7 +2,7 @@ from _typeshed import Incomplete from collections.abc import Callable from logging import Logger from typing import Any, TypeVar -from typing_extensions import TypeAlias, deprecated +from typing_extensions import TypeAlias from django.contrib import admin from django.contrib.admin.helpers import ActionForm @@ -46,25 +46,13 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): def get_urls(self) -> list[URLPattern]: ... def process_import(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... def process_dataset( - self, - dataset: Dataset, - confirm_form: Form, - request: HttpRequest, - *args: Any, - rollback_on_validation_errors: bool = False, - **kwargs: Any, + self, dataset: Dataset, confirm_form: Form, request: HttpRequest, *args: Any, **kwargs: Any ) -> Result: ... def process_result(self, result: Result, request: HttpRequest) -> HttpResponse: ... def generate_log_entries(self, result: Result, request: HttpRequest) -> None: ... def add_success_message(self, result: Result, request: HttpRequest) -> None: ... def get_import_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... - @deprecated("Use get_import_form_class instead") - def get_import_form(self) -> type[Form]: ... - @deprecated("Use get_confirm_form_class instead") - def get_confirm_import_form(self) -> type[Form]: ... - @deprecated("Use get_import_form_kwargs or get_confirm_form_kwargs") - def get_form_kwargs(self, form: Form, *args: Any, **kwargs: Any) -> dict[str, Any]: ... def create_import_form(self, request: HttpRequest) -> Form: ... def get_import_form_class(self, request: HttpRequest) -> type[Form]: ... def get_import_form_kwargs(self, request: HttpRequest) -> dict[str, Any]: ... @@ -90,8 +78,6 @@ class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> str | bytes: ... def get_export_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... - @deprecated("Use get_export_form_class or use the export_form_class attribute") - def get_export_form(self) -> Form: ... def get_export_form_class(self) -> type[Form]: ... def export_action(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index ac60a5a7ffef..b4c3005d5b79 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -19,7 +19,6 @@ logger: Logger _ModelT = TypeVar("_ModelT", bound=Model) class BaseImportExportMixin(Generic[_ModelT]): - resource_class: type[Resource[_ModelT]] resource_classes: SupportsGetItem[int, type[Resource[_ModelT]]] @property def formats(self) -> list[type[Format]]: ... @@ -44,8 +43,6 @@ class BaseExportMixin(BaseImportExportMixin[_ModelT]): escape_html: bool escape_formulae: bool @property - def should_escape_html(self) -> bool: ... - @property def should_escape_formulae(self) -> bool: ... def get_export_formats(self) -> list[Format]: ... def get_export_resource_classes(self) -> list[Resource[_ModelT]]: ... diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 895b430ccf9d..099249e77e00 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -4,7 +4,7 @@ from collections.abc import Iterator, Sequence from functools import partial from logging import Logger from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeVar, overload -from typing_extensions import TypeAlias, deprecated +from typing_extensions import TypeAlias from django.db.models import Field as DjangoField, ForeignObjectRel, Model, QuerySet from django.utils.safestring import SafeString @@ -133,26 +133,12 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def handle_import_error(self, result: Result, error: Exception, raise_errors: Literal[True]) -> NoReturn: ... @overload def handle_import_error(self, result: Result, error: Exception, raise_errors: Literal[False] = ...) -> None: ... - @overload - @deprecated("raise_errors argument is deprecated and will be removed in a future release.") - def import_row( - self, - row: dict[str, Any], - instance_loader: BaseInstanceLoader, - using_transactions: bool = True, - dry_run: bool = False, - *, - raise_errors: bool, - **kwargs: Any, - ) -> RowResult: ... - @overload def import_row( self, row: dict[str, Any], instance_loader: BaseInstanceLoader, using_transactions: bool = True, dry_run: bool = False, - raise_errors: None = None, **kwargs: Any, ) -> RowResult: ... def import_data( @@ -165,19 +151,6 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): rollback_on_validation_errors: bool = False, **kwargs: Any, ) -> Result: ... - @overload - @deprecated("rollback_on_validation_errors argument is deprecated and will be removed in a future release.") - def import_data_inner( - self, - dataset: Dataset, - dry_run: bool, - raise_errors: bool, - using_transactions: bool, - collect_failed_rows: bool, - rollback_on_validation_errors: bool, - **kwargs: Any, - ) -> Result: ... - @overload def import_data_inner( self, dataset: Dataset, @@ -185,7 +158,6 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): raise_errors: bool, using_transactions: bool, collect_failed_rows: bool, - rollback_on_validation_errors: None = None, **kwargs: Any, ) -> Result: ... def get_export_order(self) -> tuple[str, ...]: ... From 3d473fe2a17fb51ac7cf3b201e6b15c1f3e82985 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:16:17 +0100 Subject: [PATCH 02/38] Tackle https://github.com/django-import-export/django-import-export/pull/1667 --- stubs/django-import-export/import_export/mixins.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index b4c3005d5b79..0b8f6cbc7331 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -1,7 +1,7 @@ from _typeshed import Incomplete, SupportsGetItem from logging import Logger from typing import Any, Generic, TypeVar -from typing_extensions import TypeAlias +from typing_extensions import TypeAlias, deprecated from django.db.models import Model, QuerySet from django.forms import BaseForm, Form @@ -59,5 +59,6 @@ class ExportViewMixin(BaseExportMixin[_ModelT]): _FormT = TypeVar("_FormT", bound=BaseForm) +@deprecated("ExportViewFormMixin is deprecated and will be removed in a future release.") class ExportViewFormMixin(ExportViewMixin[_ModelT], FormView[_FormT]): # type: ignore[misc] def form_valid(self, form: _FormT) -> HttpResponse: ... From ef26e89e03335b42397e6f4bf384885f617ff3c8 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:19:21 +0100 Subject: [PATCH 03/38] Tackle https://github.com/django-import-export/django-import-export/pull/1626 --- stubs/django-import-export/import_export/resources.pyi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 099249e77e00..9d245432797a 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -30,6 +30,7 @@ class ResourceOptions(Generic[_ModelT]): instance_loader_class: type[BaseInstanceLoader] | None import_id_fields: Sequence[str] export_order: Sequence[str] | None + import_order: Sequence[str] | None widgets: dict[str, Any] | None use_transactions: bool | None skip_unchanged: bool @@ -160,6 +161,7 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): collect_failed_rows: bool, **kwargs: Any, ) -> Result: ... + def get_import_order(self) -> tuple[str, ...]: ... def get_export_order(self) -> tuple[str, ...]: ... def before_export(self, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> None: ... def after_export(self, queryset: QuerySet[_ModelT], data: Dataset, *args: Any, **kwargs: Any) -> None: ... From 43a9c5d9a2d3ca6a3b92808917d733e3b7fdd9ad Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:22:12 +0100 Subject: [PATCH 04/38] Tackle https://github.com/django-import-export/django-import-export/pull/1638 --- .../import_export/formats/base_formats.pyi | 3 +-- stubs/django-import-export/import_export/mixins.pyi | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/stubs/django-import-export/import_export/formats/base_formats.pyi b/stubs/django-import-export/import_export/formats/base_formats.pyi index fdc77740b4e3..2e3659a079da 100644 --- a/stubs/django-import-export/import_export/formats/base_formats.pyi +++ b/stubs/django-import-export/import_export/formats/base_formats.pyi @@ -43,8 +43,7 @@ class TSV(TextFormat): class ODS(TextFormat): def export_data(self, dataset: Dataset, **kwargs: Any) -> bytes: ... -class HTML(TextFormat): - def export_data(self, dataset: Dataset, **kwargs: Any) -> str: ... +class HTML(TextFormat): ... class XLS(TablibFormat): def export_data(self, dataset: Dataset, **kwargs: Any) -> bytes: ... diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index 0b8f6cbc7331..fa03f96cfe60 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -39,11 +39,6 @@ class BaseImportMixin(BaseImportExportMixin[_ModelT]): class BaseExportMixin(BaseImportExportMixin[_ModelT]): model: Model - escape_exported_data: bool - escape_html: bool - escape_formulae: bool - @property - def should_escape_formulae(self) -> bool: ... def get_export_formats(self) -> list[Format]: ... def get_export_resource_classes(self) -> list[Resource[_ModelT]]: ... def choose_export_resource_class(self, form: Form) -> Resource[_ModelT]: ... From d9680af2c976d2b0d5135aa72d5884fda1f2915a Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:22:57 +0100 Subject: [PATCH 05/38] Tackle https://github.com/django-import-export/django-import-export/pull/1640 --- stubs/django-import-export/import_export/results.pyi | 1 - 1 file changed, 1 deletion(-) diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index dd50fd7e7e39..41b5fa6f659c 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -34,7 +34,6 @@ class RowResult: object_repr: str | None instance: Model original: Model - new_record: bool | None def __init__(self) -> None: ... def add_instance_info(self, instance: Model) -> None: ... From 9227306c2ecbfe214da1340fd2a889b8e4ef2a51 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:42:51 +0100 Subject: [PATCH 06/38] Tackle https://github.com/django-import-export/django-import-export/pull/1641 --- .../import_export/fields.pyi | 8 +-- .../import_export/mixins.pyi | 6 +- .../import_export/resources.pyi | 58 ++++++++----------- 3 files changed, 32 insertions(+), 40 deletions(-) diff --git a/stubs/django-import-export/import_export/fields.pyi b/stubs/django-import-export/import_export/fields.pyi index 5520ffe6a517..4d4e1d6efdf1 100644 --- a/stubs/django-import-export/import_export/fields.pyi +++ b/stubs/django-import-export/import_export/fields.pyi @@ -27,8 +27,8 @@ class Field: dehydrate_method: str | None = None, m2m_add: bool = False, ) -> None: ... - def clean(self, data: Mapping[str, Any], **kwargs: Any) -> Any: ... - def get_value(self, obj: Model) -> Any: ... - def save(self, obj: Model, data: Mapping[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ... - def export(self, obj: Model) -> str: ... + def clean(self, row: Mapping[str, Any], **kwargs: Any) -> Any: ... + def get_value(self, instance: Model) -> Any: ... + def save(self, instance: Model, row: Mapping[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ... + def export(self, instance: Model) -> str: ... def get_dehydrate_method(self, field_name: str | None = None) -> str: ... diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index fa03f96cfe60..d224123edf06 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -34,7 +34,7 @@ class BaseImportExportMixin(Generic[_ModelT]): class BaseImportMixin(BaseImportExportMixin[_ModelT]): def get_import_resource_classes(self) -> list[type[Resource[_ModelT]]]: ... def get_import_formats(self) -> list[Format]: ... - def get_import_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ... + def get_import_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... def choose_import_resource_class(self, form: Form) -> type[Resource[_ModelT]]: ... class BaseExportMixin(BaseImportExportMixin[_ModelT]): @@ -42,8 +42,8 @@ class BaseExportMixin(BaseImportExportMixin[_ModelT]): def get_export_formats(self) -> list[Format]: ... def get_export_resource_classes(self) -> list[Resource[_ModelT]]: ... def choose_export_resource_class(self, form: Form) -> Resource[_ModelT]: ... - def get_export_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ... - def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> Dataset: ... + def get_export_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... + def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any) -> Dataset: ... def get_export_filename(self, file_format: Format) -> str: ... class ExportViewMixin(BaseExportMixin[_ModelT]): diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 9d245432797a..ef3ae41da85a 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -106,42 +106,34 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def validate_instance( self, instance: _ModelT, import_validation_errors: dict[str, Any] | None = None, validate_unique: bool = True ) -> None: ... - def save_instance( - self, instance: _ModelT, is_create: bool, using_transactions: bool = True, dry_run: bool = False - ) -> None: ... - def before_save_instance(self, instance: _ModelT, using_transactions: bool, dry_run: bool) -> None: ... - def after_save_instance(self, instance: _ModelT, using_transactions: bool, dry_run: bool) -> None: ... - def delete_instance(self, instance: _ModelT, using_transactions: bool = True, dry_run: bool = False) -> None: ... - def before_delete_instance(self, instance: _ModelT, dry_run: bool) -> None: ... - def after_delete_instance(self, instance: _ModelT, dry_run: bool) -> None: ... - def import_field(self, field: Field, obj: _ModelT, data: dict[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ... + # For all the definitions below (from `save_instance()` to `import_row()`), `**kwargs` should contain: + # dry_run: bool, use_transactions: bool, row_number: int, retain_instance_in_row_result: bool. + # Users are free to pass extra arguments in `import_data()`so PEP 728 can probably be leveraged here. + def save_instance(self, instance: _ModelT, is_create: bool, row: dict[str, Any], **kwargs: Any) -> None: ... + def before_save_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def after_save_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def delete_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def before_delete_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def after_delete_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def import_field(self, field: Field, instance: _ModelT, row: dict[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ... def get_import_fields(self) -> list[Field]: ... - def import_obj(self, obj: _ModelT, data: dict[str, Any], dry_run: bool, **kwargs: Any) -> None: ... - def save_m2m(self, obj: _ModelT, data: dict[str, Any], using_transactions: bool, dry_run: bool) -> None: ... + def import_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... + def save_m2m(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... def for_delete(self, row: dict[str, Any], instance: _ModelT) -> bool: ... def skip_row( self, instance: _ModelT, original: _ModelT, row: dict[str, Any], import_validation_errors: dict[str, Any] | None = None ) -> bool: ... def get_diff_headers(self) -> list[str]: ... - def before_import(self, dataset: Dataset, using_transactions: bool, dry_run: bool, **kwargs: Any) -> None: ... - def after_import(self, dataset: Dataset, result: Result, using_transactions: bool, dry_run: bool, **kwargs: Any) -> None: ... - def before_import_row(self, row: dict[str, Any], row_number: int | None = None, **kwargs: Any) -> None: ... - def after_import_row( - self, row: dict[str, Any], row_result: RowResult, row_number: int | None = None, **kwargs: Any - ) -> None: ... - def after_import_instance(self, instance: _ModelT, new: bool, row_number: int | None = None, **kwargs: Any) -> None: ... + def before_import(self, dataset: Dataset, **kwargs: Any) -> None: ... + def after_import(self, dataset: Dataset, result: Result, **kwargs: Any) -> None: ... + def before_import_row(self, row: dict[str, Any], **kwargs: Any) -> None: ... + def after_import_row(self, row: dict[str, Any], row_result: RowResult, **kwargs: Any) -> None: ... + def after_init_instance(self, instance: _ModelT, new: bool, row: dict[str, Any], **kwargs: Any) -> None: ... @overload def handle_import_error(self, result: Result, error: Exception, raise_errors: Literal[True]) -> NoReturn: ... @overload def handle_import_error(self, result: Result, error: Exception, raise_errors: Literal[False] = ...) -> None: ... - def import_row( - self, - row: dict[str, Any], - instance_loader: BaseInstanceLoader, - using_transactions: bool = True, - dry_run: bool = False, - **kwargs: Any, - ) -> RowResult: ... + def import_row(self, row: dict[str, Any], instance_loader: BaseInstanceLoader, **kwargs: Any) -> RowResult: ... def import_data( self, dataset: Dataset, @@ -163,17 +155,17 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): ) -> Result: ... def get_import_order(self) -> tuple[str, ...]: ... def get_export_order(self) -> tuple[str, ...]: ... - def before_export(self, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> None: ... - def after_export(self, queryset: QuerySet[_ModelT], data: Dataset, *args: Any, **kwargs: Any) -> None: ... - def filter_export(self, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> QuerySet[_ModelT]: ... - def export_field(self, field: Field, obj: _ModelT) -> str: ... + def before_export(self, queryset: QuerySet[_ModelT], **kwargs: Any) -> None: ... + def after_export(self, queryset: QuerySet[_ModelT], dataset: Dataset, **kwargs: Any) -> None: ... + def filter_export(self, queryset: QuerySet[_ModelT], **kwargs: Any) -> QuerySet[_ModelT]: ... + def export_field(self, field: Field, instance: _ModelT) -> str: ... def get_export_fields(self) -> list[Field]: ... - def export_resource(self, obj: _ModelT) -> list[str]: ... + def export_resource(self, instance: _ModelT) -> list[str]: ... def get_export_headers(self) -> list[str]: ... def get_user_visible_headers(self) -> list[str]: ... def get_user_visible_fields(self) -> list[str]: ... def iter_queryset(self, queryset: QuerySet[_ModelT]) -> Iterator[_ModelT]: ... - def export(self, *args: Any, queryset: QuerySet[_ModelT] | None = None, **kwargs: Any) -> Dataset: ... + def export(self, queryset: QuerySet[_ModelT] | None = None, **kwargs: Any) -> Dataset: ... class ModelDeclarativeMetaclass(DeclarativeMetaclass): def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... @@ -193,7 +185,7 @@ class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): def field_from_django_field(cls, field_name: str, django_field: DjangoField[Any, Any], readonly: bool) -> Field: ... def get_queryset(self) -> QuerySet[_ModelT]: ... def init_instance(self, row: dict[str, Any] | None = None) -> _ModelT: ... - def after_import(self, dataset: Dataset, result: Result, using_transactions: bool, dry_run: bool, **kwargs: Any) -> None: ... + def after_import(self, dataset: Dataset, result: Result, **kwargs: Any) -> None: ... @classmethod def get_display_name(cls) -> str: ... From 775ea11d8eac48db141d832c944567ae59f5d154 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:45:31 +0100 Subject: [PATCH 07/38] Tackle https://github.com/django-import-export/django-import-export/pull/1651 --- stubs/django-import-export/import_export/widgets.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index e91d2a424124..176bd2753637 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -58,6 +58,7 @@ class ForeignKeyWidget(Widget, Generic[_ModelT]): use_natural_foreign_keys: bool def __init__(self, model: _ModelT, field: str = "pk", use_natural_foreign_keys: bool = False, **kwargs: Any) -> None: ... def get_queryset(self, value: Any, row: Mapping[str, Any], *args: Any, **kwargs: Any) -> QuerySet[_ModelT]: ... + def get_lookup_kwargs(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any): ... class ManyToManyWidget(Widget, Generic[_ModelT]): model: _ModelT From 95b7a612fec69e3690b88381a426f054bc42eca1 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:56:00 +0100 Subject: [PATCH 08/38] Tackle https://github.com/django-import-export/django-import-export/pull/1657 --- .../import_export/widgets.pyi | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index 176bd2753637..4e339d80458c 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -1,52 +1,56 @@ from collections.abc import Mapping from datetime import datetime -from typing import Any, ClassVar, Generic, TypeVar +from typing import Any, ClassVar, Generic, TypeVar, overload +from typing_extensions import deprecated from django.db.models import Model, QuerySet def format_datetime(value: datetime, datetime_format: str) -> str: ... class Widget: + coerce_to_string: bool + def __init__(self, coerce_to_string: bool = True) -> None: ... def clean(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any) -> Any: ... - def render(self, value: Any, obj: Model | None = None) -> Any: ... + @overload + @deprecated("The 'obj' parameter is deprecated and will be removed in a future release.") + def render(self, value: Any, obj: Model) -> Any: ... + @overload + def render(self, value: Any, obj: None = None) -> Any: ... class NumberWidget(Widget): - coerce_to_string: bool - def __init__(self, coerce_to_string: bool = False) -> None: ... def is_empty(self, value: Any) -> bool: ... - def render(self, value: Any, obj: Model | None = None) -> Any: ... class FloatWidget(NumberWidget): ... class IntegerWidget(NumberWidget): ... class DecimalWidget(NumberWidget): ... class CharWidget(Widget): - coerce_to_string: bool allow_blank: bool - def __init__(self, coerce_to_string: bool = False, allow_blank: bool = False) -> None: ... + def __init__(self, coerce_to_string: bool = True, allow_blank: bool = True) -> None: ... class BooleanWidget(Widget): TRUE_VALUES: ClassVar[list[str | int | bool]] FALSE_VALUES: ClassVar[list[str | int | bool]] NULL_VALUES: ClassVar[list[str | None]] + def __init__(self, coerce_to_string: bool = True) -> None: ... class DateWidget(Widget): formats: tuple[str, ...] - def __init__(self, format: str | None = None) -> None: ... + def __init__(self, format: str | None = None, coerce_to_string: bool = True) -> None: ... class DateTimeWidget(Widget): formats: tuple[str, ...] - def __init__(self, format: str | None = None) -> None: ... + def __init__(self, format: str | None = None, coerce_to_string: bool = True) -> None: ... class TimeWidget(Widget): formats: tuple[str, ...] - def __init__(self, format: str | None = None) -> None: ... + def __init__(self, format: str | None = None, coerce_to_string: bool = True) -> None: ... class DurationWidget(Widget): ... class SimpleArrayWidget(Widget): separator: str - def __init__(self, separator: str | None = None) -> None: ... + def __init__(self, separator: str | None = None, coerce_to_string: bool = True) -> None: ... class JSONWidget(Widget): ... From 4b0818067f39b82dff2a177309518809ae80b16e Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:57:26 +0100 Subject: [PATCH 09/38] Tackle https://github.com/django-import-export/django-import-export/pull/1668 --- stubs/django-import-export/import_export/resources.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index ef3ae41da85a..a2267acf7ceb 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -110,6 +110,7 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): # dry_run: bool, use_transactions: bool, row_number: int, retain_instance_in_row_result: bool. # Users are free to pass extra arguments in `import_data()`so PEP 728 can probably be leveraged here. def save_instance(self, instance: _ModelT, is_create: bool, row: dict[str, Any], **kwargs: Any) -> None: ... + def do_instance_save(self, instance: _ModelT) -> None: ... def before_save_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... def after_save_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... def delete_instance(self, instance: _ModelT, row: dict[str, Any], **kwargs: Any) -> None: ... From 0dd431b637eac651db31d3579e021a7609cd79df Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 12:58:31 +0100 Subject: [PATCH 10/38] Tackle https://github.com/django-import-export/django-import-export/pull/1669 --- stubs/django-import-export/import_export/resources.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index a2267acf7ceb..d91247e01259 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -24,7 +24,7 @@ def get_related_model(field: DjangoField[Any, Any]) -> Model | None: ... def has_natural_foreign_key(model: Model) -> bool: ... class ResourceOptions(Generic[_ModelT]): - model: _ModelT + model: _ModelT | str fields: Sequence[str] | None exclude: Sequence[str] | None instance_loader_class: type[BaseInstanceLoader] | None From cd2756cd251b5a65d7637f1cffe431f500abe8a1 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:05:04 +0100 Subject: [PATCH 11/38] Tackle https://github.com/django-import-export/django-import-export/pull/1671 --- stubs/django-import-export/import_export/admin.pyi | 14 +++++--------- stubs/django-import-export/import_export/forms.pyi | 4 +--- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 1faf62618ea7..b2023c7635ee 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -8,7 +8,7 @@ from django.contrib import admin from django.contrib.admin.helpers import ActionForm from django.core.files import File from django.db.models import Model, QuerySet -from django.forms import Form, Media +from django.forms import Form from django.http.request import HttpRequest from django.http.response import HttpResponse from django.template.response import TemplateResponse @@ -68,7 +68,7 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): - import_export_change_list_template: str | None + import_export_change_list_template: str export_template_name: str to_encoding: str | None export_form_class: type[Form] = ... @@ -79,22 +79,18 @@ class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): def get_export_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_export_form_class(self) -> type[Form]: ... - def export_action(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ... + def export_action(self, request: HttpRequest) -> TemplateResponse: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... def get_export_filename(self, request: HttpRequest, queryset: QuerySet[_ModelT], file_format: Format) -> str: ... # type: ignore[override] + def init_request_context_data(self, request: HttpRequest, form: Form) -> dict[str, Any]: ... -class ImportExportMixin(ImportMixin[_ModelT], ExportMixin[_ModelT]): - import_export_change_list_template: str - +class ImportExportMixin(ImportMixin[_ModelT], ExportMixin[_ModelT]): ... class ImportExportModelAdmin(ImportExportMixin[_ModelT], admin.ModelAdmin[_ModelT]): ... # type: ignore[misc] class ExportActionMixin(ExportMixin[_ModelT]): action_form: type[ActionForm] - def __init__(self, *args: Any, **kwargs: Any) -> None: ... def export_admin_action(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> HttpResponse: ... def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ... - @property - def media(self) -> Media: ... class ExportActionModelAdmin(ExportActionMixin[_ModelT], admin.ModelAdmin[_ModelT]): ... # type: ignore[misc] class ImportExportActionModelAdmin(ImportMixin[_ModelT], ExportActionModelAdmin[_ModelT]): ... # type: ignore[misc] diff --git a/stubs/django-import-export/import_export/forms.pyi b/stubs/django-import-export/import_export/forms.pyi index 333ad58e896f..4d70cef19478 100644 --- a/stubs/django-import-export/import_export/forms.pyi +++ b/stubs/django-import-export/import_export/forms.pyi @@ -1,7 +1,6 @@ from typing import Any from django import forms -from django.contrib.admin.helpers import ActionForm from .formats.base_formats import Format from .resources import Resource @@ -26,6 +25,5 @@ class ConfirmImportForm(forms.Form): class ExportForm(ImportExportFormBase): file_format: forms.ChoiceField + export_items: forms.MultipleChoiceField def __init__(self, formats: list[Format], *args: Any, **kwargs: Any) -> None: ... - -def export_action_form_factory(formats: list[tuple[str, str]]) -> type[ActionForm]: ... From 84df78d01296149a3b3a46fb41189d6660f213ed Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:10:14 +0100 Subject: [PATCH 12/38] Tackle https://github.com/django-import-export/django-import-export/pull/1687 --- stubs/django-import-export/import_export/admin.pyi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index b2023c7635ee..f207a0ee5dc1 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -88,7 +88,13 @@ class ImportExportMixin(ImportMixin[_ModelT], ExportMixin[_ModelT]): ... class ImportExportModelAdmin(ImportExportMixin[_ModelT], admin.ModelAdmin[_ModelT]): ... # type: ignore[misc] class ExportActionMixin(ExportMixin[_ModelT]): + change_form_template: str + show_change_form_export: bool action_form: type[ActionForm] + def change_view( + self, request: HttpRequest, object_id: str, form_url: str = "", extra_context: dict[str, Any] | None = None + ) -> HttpResponse: ... + def response_change(self, request: HttpRequest, obj: _ModelT) -> HttpResponse: ... def export_admin_action(self, request: HttpRequest, queryset: QuerySet[_ModelT]) -> HttpResponse: ... def get_actions(self, request: HttpRequest) -> dict[str, tuple[Callable[..., str], str, str] | None]: ... From 863998e1ef82e75f286211c97bc1f808d95fffa9 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:14:24 +0100 Subject: [PATCH 13/38] Tackle https://github.com/django-import-export/django-import-export/pull/1690 --- stubs/django-import-export/import_export/forms.pyi | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/stubs/django-import-export/import_export/forms.pyi b/stubs/django-import-export/import_export/forms.pyi index 4d70cef19478..9391685f4762 100644 --- a/stubs/django-import-export/import_export/forms.pyi +++ b/stubs/django-import-export/import_export/forms.pyi @@ -1,3 +1,4 @@ +from collections.abc import Sequence from typing import Any from django import forms @@ -7,23 +8,22 @@ from .resources import Resource class ImportExportFormBase(forms.Form): resource: forms.ChoiceField - def __init__(self, *args: Any, resources: list[type[Resource[Any]]] | None = None, **kwargs: Any) -> None: ... + format: forms.ChoiceField + def __init__( + self, formats: list[type[Format]], resources: list[type[Resource[Any]]] | None = None, *args: Any, **kwargs: Any + ) -> None: ... class ImportForm(ImportExportFormBase): import_file: forms.FileField - input_format: forms.ChoiceField - def __init__(self, import_formats: list[Format], *args: Any, **kwargs: Any) -> None: ... + field_order: Sequence[str] @property def media(self) -> forms.Media: ... class ConfirmImportForm(forms.Form): import_file_name: forms.CharField original_file_name: forms.CharField - input_format: forms.CharField resource: forms.CharField def clean_import_file_name(self) -> str: ... class ExportForm(ImportExportFormBase): - file_format: forms.ChoiceField export_items: forms.MultipleChoiceField - def __init__(self, formats: list[Format], *args: Any, **kwargs: Any) -> None: ... From d1bf6cb165293f72a22a3034bb0f907a392d96d9 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:15:35 +0100 Subject: [PATCH 14/38] Tackle https://github.com/django-import-export/django-import-export/pull/1708 --- stubs/django-import-export/import_export/admin.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index f207a0ee5dc1..f0703341228b 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -42,6 +42,7 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): tmp_storage_class: str | type[BaseStorage] def get_skip_admin_log(self) -> bool: ... def get_tmp_storage_class(self) -> type[BaseStorage]: ... + def get_tmp_storage_class_kwargs(self) -> dict[str, Any]: ... def has_import_permission(self, request: HttpRequest) -> bool: ... def get_urls(self) -> list[URLPattern]: ... def process_import(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... From 69223372158535e0d66c25c9154adc7bb46ad275 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:17:09 +0100 Subject: [PATCH 15/38] Tackle https://github.com/django-import-export/django-import-export/pull/1727 --- stubs/django-import-export/import_export/admin.pyi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index f0703341228b..2910eaeae7a9 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -1,7 +1,7 @@ from _typeshed import Incomplete -from collections.abc import Callable +from collections.abc import Callable, Sequence from logging import Logger -from typing import Any, TypeVar +from typing import Any, Literal, TypeVar from typing_extensions import TypeAlias from django.contrib import admin @@ -38,6 +38,7 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): import_form_class: type[Form] = ... confirm_form_class: type[Form] = ... from_encoding: str + import_error_display: Sequence[Literal["message", "row", "traceback"]] skip_admin_log: bool | None tmp_storage_class: str | type[BaseStorage] def get_skip_admin_log(self) -> bool: ... From e83a31f0e9962be6cadcf5825ae68b07ef9bcc5a Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:24:44 +0100 Subject: [PATCH 16/38] Tackle https://github.com/django-import-export/django-import-export/pull/1729 --- .../import_export/exceptions.pyi | 8 ++++++++ stubs/django-import-export/import_export/results.pyi | 12 +++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/exceptions.pyi b/stubs/django-import-export/import_export/exceptions.pyi index f8a69dfbb6d4..2637e7b41451 100644 --- a/stubs/django-import-export/import_export/exceptions.pyi +++ b/stubs/django-import-export/import_export/exceptions.pyi @@ -1,2 +1,10 @@ +from typing import Any + class ImportExportError(Exception): ... class FieldError(ImportExportError): ... + +class ImportError(ImportExportError): + error: Exception + number: int | None + row: dict[str, Any] | None + def __init__(self, error: Exception, number: int | None = None, row: dict[str, Any] | None = None) -> None: ... diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 41b5fa6f659c..0cb199303a9e 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -13,7 +13,10 @@ class Error: error: Exception traceback: str row: dict[str, Any] - def __init__(self, error: Exception, traceback: str | None = None, row: dict[str, Any] | None = None) -> None: ... + number: int | None + def __init__( + self, error: Exception, traceback: str | None = None, row: dict[str, Any] | None = None, number: int | None = None + ) -> None: ... _ImportType: TypeAlias = Literal["update", "new", "delete", "skip", "error", "invalid"] @@ -37,6 +40,11 @@ class RowResult: def __init__(self) -> None: ... def add_instance_info(self, instance: Model) -> None: ... +class ErrorRow: + number: int + errors: list[Error] + def __init__(self, number: int, errors: list[Error]) -> None: ... + class InvalidRow: number: int error: ValidationError @@ -55,6 +63,7 @@ class Result: diff_headers: list[str] rows: list[RowResult] invalid_rows: list[InvalidRow] + error_rows: list[ErrorRow] failed_dataset: Dataset totals: OrderedDict[_ImportType, int] total_rows: int @@ -65,6 +74,7 @@ class Result: def add_dataset_headers(self, headers: list[str] | None) -> None: ... def append_failed_row(self, row: dict[str, Any], error: Exception) -> None: ... def append_invalid_row(self, number: int, row: dict[str, Any], validation_error: ValidationError) -> None: ... + def append_error_row(self, number: int, row: dict[str, Any], errors: list[Error]) -> None: ... def increment_row_result_total(self, row_result: RowResult) -> None: ... def row_errors(self) -> list[tuple[int, Any]]: ... def has_errors(self) -> bool: ... From 9d3b7520b1fb59d3bcc58a37f383b654a7ea2819 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:31:47 +0100 Subject: [PATCH 17/38] Tackle https://github.com/django-import-export/django-import-export/pull/1734 --- stubs/django-import-export/import_export/forms.pyi | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/stubs/django-import-export/import_export/forms.pyi b/stubs/django-import-export/import_export/forms.pyi index 9391685f4762..fd00afd1e115 100644 --- a/stubs/django-import-export/import_export/forms.pyi +++ b/stubs/django-import-export/import_export/forms.pyi @@ -1,10 +1,10 @@ -from collections.abc import Sequence +from collections.abc import Iterable, Sequence from typing import Any from django import forms from .formats.base_formats import Format -from .resources import Resource +from .resources import ModelResource, Resource class ImportExportFormBase(forms.Form): resource: forms.ChoiceField @@ -27,3 +27,12 @@ class ConfirmImportForm(forms.Form): class ExportForm(ImportExportFormBase): export_items: forms.MultipleChoiceField + +class SelectableFieldsExportForm(ExportForm): + resources: Iterable[ModelResource[Any]] + is_selectable_fields_form: bool + resource_fields: dict[str, list[str]] + @staticmethod + def create_boolean_field_name(resource: ModelResource[Any], field_name: str) -> str: ... + def get_selected_resource(self) -> ModelResource[Any]: ... + def get_selected_resource_export_fields(self) -> list[str]: ... From 75cda849be5aeaf25175c6dd760b1150b07562f9 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:38:11 +0100 Subject: [PATCH 18/38] Tackle https://github.com/django-import-export/django-import-export/pull/1787 --- stubs/django-import-export/import_export/admin.pyi | 14 +++++++------- stubs/django-import-export/import_export/forms.pyi | 2 +- .../django-import-export/import_export/mixins.pyi | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 2910eaeae7a9..57f154a68ca7 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -46,10 +46,8 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): def get_tmp_storage_class_kwargs(self) -> dict[str, Any]: ... def has_import_permission(self, request: HttpRequest) -> bool: ... def get_urls(self) -> list[URLPattern]: ... - def process_import(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse: ... - def process_dataset( - self, dataset: Dataset, confirm_form: Form, request: HttpRequest, *args: Any, **kwargs: Any - ) -> Result: ... + def process_import(self, request: HttpRequest, **kwargs: Any) -> HttpResponse: ... + def process_dataset(self, dataset: Dataset, form: Form, request: HttpRequest, **kwargs: Any) -> Result: ... def process_result(self, result: Result, request: HttpRequest) -> HttpResponse: ... def generate_log_entries(self, result: Result, request: HttpRequest) -> None: ... def add_success_message(self, result: Result, request: HttpRequest) -> None: ... @@ -63,10 +61,10 @@ class ImportMixin(BaseImportMixin[_ModelT], ImportExportMixinBase): def get_confirm_form_class(self, request: HttpRequest) -> type[Form]: ... def get_confirm_form_kwargs(self, request: HttpRequest, import_form: Form | None = None) -> dict[str, Any]: ... def get_confirm_form_initial(self, request: HttpRequest, import_form: Form | None) -> dict[str, Any]: ... - def get_import_data_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ... + def get_import_data_kwargs(self, **kwargs: Any) -> dict[str, Any]: ... def write_to_tmp_storage(self, import_file: File[bytes], input_format: Format) -> BaseStorage: ... def add_data_read_fail_error_to_form(self, form: Form, e: Exception) -> None: ... - def import_action(self, request: HttpRequest, *args: Any, **kwargs: Any) -> TemplateResponse: ... + def import_action(self, request: HttpRequest, **kwargs: Any) -> TemplateResponse: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): @@ -77,7 +75,9 @@ class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): def get_urls(self) -> list[URLPattern]: ... def has_export_permission(self, request: HttpRequest) -> bool: ... def get_export_queryset(self, request: HttpRequest) -> QuerySet[_ModelT]: ... - def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> str | bytes: ... + def get_export_data( + self, file_format: Format, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any + ) -> str | bytes: ... def get_export_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_export_form_class(self) -> type[Form]: ... diff --git a/stubs/django-import-export/import_export/forms.pyi b/stubs/django-import-export/import_export/forms.pyi index fd00afd1e115..910554c49bbb 100644 --- a/stubs/django-import-export/import_export/forms.pyi +++ b/stubs/django-import-export/import_export/forms.pyi @@ -10,7 +10,7 @@ class ImportExportFormBase(forms.Form): resource: forms.ChoiceField format: forms.ChoiceField def __init__( - self, formats: list[type[Format]], resources: list[type[Resource[Any]]] | None = None, *args: Any, **kwargs: Any + self, formats: list[type[Format]], resources: list[type[Resource[Any]]] | None = None, **kwargs: Any ) -> None: ... class ImportForm(ImportExportFormBase): diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index d224123edf06..8da3654fa8c5 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -27,28 +27,28 @@ class BaseImportExportMixin(Generic[_ModelT]): @property def import_formats(self) -> list[type[Format]]: ... def check_resource_classes(self, resource_classes: SupportsGetItem[int, type[Resource[_ModelT]]]) -> None: ... - def get_resource_classes(self) -> list[type[Resource[_ModelT]]]: ... - def get_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ... + def get_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ... + def get_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... def get_resource_index(self, form: Form) -> int: ... class BaseImportMixin(BaseImportExportMixin[_ModelT]): - def get_import_resource_classes(self) -> list[type[Resource[_ModelT]]]: ... + def get_import_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ... def get_import_formats(self) -> list[Format]: ... def get_import_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... - def choose_import_resource_class(self, form: Form) -> type[Resource[_ModelT]]: ... + def choose_import_resource_class(self, form: Form, request: HttpRequest) -> type[Resource[_ModelT]]: ... class BaseExportMixin(BaseImportExportMixin[_ModelT]): model: Model def get_export_formats(self) -> list[Format]: ... - def get_export_resource_classes(self) -> list[Resource[_ModelT]]: ... - def choose_export_resource_class(self, form: Form) -> Resource[_ModelT]: ... + def get_export_resource_classes(self, request: HttpRequest) -> list[Resource[_ModelT]]: ... + def choose_export_resource_class(self, form: Form, request: HttpRequest) -> Resource[_ModelT]: ... def get_export_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any) -> Dataset: ... def get_export_filename(self, file_format: Format) -> str: ... class ExportViewMixin(BaseExportMixin[_ModelT]): form_class: type[BaseForm] = ... - def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], *args: Any, **kwargs: Any) -> str | bytes: ... + def get_export_data(self, file_format: Format, queryset: QuerySet[_ModelT], **kwargs: Any) -> str | bytes: ... def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_form_kwargs(self) -> dict[str, Any]: ... From e305305df49cc258099262390342c579951da67c Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:39:33 +0100 Subject: [PATCH 19/38] Tackle https://github.com/django-import-export/django-import-export/pull/1637 --- stubs/django-import-export/import_export/resources.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index d91247e01259..ffa720e94b22 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -181,7 +181,7 @@ class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): @classmethod def widget_from_django_field(cls, f: DjangoField[Any, Any], default: type[Widget] = ...) -> type[Widget]: ... @classmethod - def widget_kwargs_for_field(self, field_name: str) -> dict[str, Any]: ... + def widget_kwargs_for_field(cls, field_name: str, django_field: DjangoField[Any, Any]) -> dict[str, Any]: ... @classmethod def field_from_django_field(cls, field_name: str, django_field: DjangoField[Any, Any], readonly: bool) -> Field: ... def get_queryset(self) -> QuerySet[_ModelT]: ... From e9ba1a27b206ea5e3bacc8e0d31d029e374c5ba3 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:41:46 +0100 Subject: [PATCH 20/38] Tackle "Removed unused method `utils.original()`" --- stubs/django-import-export/import_export/utils.pyi | 6 ------ 1 file changed, 6 deletions(-) diff --git a/stubs/django-import-export/import_export/utils.pyi b/stubs/django-import-export/import_export/utils.pyi index 49985a35ada5..6c91909fb926 100644 --- a/stubs/django-import-export/import_export/utils.pyi +++ b/stubs/django-import-export/import_export/utils.pyi @@ -1,11 +1,7 @@ -from collections.abc import Callable from types import TracebackType -from typing import Any, TypeVar from django.db.transaction import Atomic -_C = TypeVar("_C", bound=Callable[..., Any]) - class atomic_if_using_transaction: using_transactions: bool context_manager: Atomic @@ -14,5 +10,3 @@ class atomic_if_using_transaction: def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None ) -> None: ... - -def original(method: _C) -> _C: ... From 3f09363e57d7ed59c7123f9d2a6d12e1e8ccbc66 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:44:21 +0100 Subject: [PATCH 21/38] Tackle https://github.com/django-import-export/django-import-export/pull/1674 --- stubs/django-import-export/import_export/results.pyi | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 0cb199303a9e..9a349f8a7a7c 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -39,6 +39,13 @@ class RowResult: original: Model def __init__(self) -> None: ... def add_instance_info(self, instance: Model) -> None: ... + def is_update(self) -> bool: ... + def is_new(self) -> bool: ... + def is_delete(self) -> bool: ... + def is_skip(self) -> bool: ... + def is_error(self) -> bool: ... + def is_invalid(self) -> bool: ... + def is_valid(self) -> bool: ... class ErrorRow: number: int From 67b03282e397f4928e1ca636978855c2ac2c3291 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:56:08 +0100 Subject: [PATCH 22/38] Tackle https://github.com/django-import-export/django-import-export/pull/1695 --- .../import_export/declarative.pyi | 11 ++++++ .../import_export/options.pyi | 32 ++++++++++++++++ .../import_export/resources.pyi | 38 ++----------------- .../import_export/utils.pyi | 7 ++++ 4 files changed, 53 insertions(+), 35 deletions(-) create mode 100644 stubs/django-import-export/import_export/declarative.pyi create mode 100644 stubs/django-import-export/import_export/options.pyi diff --git a/stubs/django-import-export/import_export/declarative.pyi b/stubs/django-import-export/import_export/declarative.pyi new file mode 100644 index 000000000000..e0c723239488 --- /dev/null +++ b/stubs/django-import-export/import_export/declarative.pyi @@ -0,0 +1,11 @@ +import _typeshed +from logging import Logger +from typing import Any + +logger: Logger + +class DeclarativeMetaclass(type): + def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... + +class ModelDeclarativeMetaclass(DeclarativeMetaclass): + def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... diff --git a/stubs/django-import-export/import_export/options.pyi b/stubs/django-import-export/import_export/options.pyi new file mode 100644 index 000000000000..6ddc523acc85 --- /dev/null +++ b/stubs/django-import-export/import_export/options.pyi @@ -0,0 +1,32 @@ +from collections.abc import Sequence +from typing import Any, Generic, TypeVar + +from django.db.models import Model + +from .instance_loaders import BaseInstanceLoader + +_ModelT = TypeVar("_ModelT", bound=Model) + +class ResourceOptions(Generic[_ModelT]): + model: _ModelT | str + fields: Sequence[str] | None + exclude: Sequence[str] | None + instance_loader_class: type[BaseInstanceLoader] | None + import_id_fields: Sequence[str] + export_order: Sequence[str] | None + import_order: Sequence[str] | None + widgets: dict[str, Any] | None + use_transactions: bool | None + skip_unchanged: bool + report_skipped: bool + clean_model_instances: bool + chunk_size: int | None + skip_diff: bool + skip_html_diff: bool + use_bulk: bool + batch_size: int + force_init_instance: bool + using_db: str | None + store_row_values: bool + store_instance: bool + use_natural_foreign_keys: bool diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index ffa720e94b22..012e17a02250 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -6,50 +6,21 @@ from logging import Logger from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeVar, overload from typing_extensions import TypeAlias -from django.db.models import Field as DjangoField, ForeignObjectRel, Model, QuerySet +from django.db.models import Field as DjangoField, Model, QuerySet from django.utils.safestring import SafeString +from .declarative import DeclarativeMetaclass, ModelDeclarativeMetaclass from .fields import Field from .instance_loaders import BaseInstanceLoader +from .options import ResourceOptions from .results import Error, Result, RowResult from .widgets import ForeignKeyWidget, ManyToManyWidget, Widget Dataset: TypeAlias = _typeshed.Incomplete # tablib.Dataset logger: Logger -@overload -def get_related_model(field: ForeignObjectRel) -> Model: ... -@overload -def get_related_model(field: DjangoField[Any, Any]) -> Model | None: ... def has_natural_foreign_key(model: Model) -> bool: ... -class ResourceOptions(Generic[_ModelT]): - model: _ModelT | str - fields: Sequence[str] | None - exclude: Sequence[str] | None - instance_loader_class: type[BaseInstanceLoader] | None - import_id_fields: Sequence[str] - export_order: Sequence[str] | None - import_order: Sequence[str] | None - widgets: dict[str, Any] | None - use_transactions: bool | None - skip_unchanged: bool - report_skipped: bool - clean_model_instances: bool - chunk_size: int | None - skip_diff: bool - skip_html_diff: bool - use_bulk: bool - batch_size: int - force_init_instance: bool - using_db: str | None - store_row_values: bool - store_instance: bool - use_natural_foreign_keys: bool - -class DeclarativeMetaclass(type): - def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... - class Diff: left: list[str] right: list[str] @@ -168,9 +139,6 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def iter_queryset(self, queryset: QuerySet[_ModelT]) -> Iterator[_ModelT]: ... def export(self, queryset: QuerySet[_ModelT] | None = None, **kwargs: Any) -> Dataset: ... -class ModelDeclarativeMetaclass(DeclarativeMetaclass): - def __new__(cls: type[_typeshed.Self], name: str, bases: tuple[type[Any], ...], attrs: dict[str, Any]) -> _typeshed.Self: ... - class ModelResource(Resource[_ModelT], metaclass=ModelDeclarativeMetaclass): DEFAULT_RESOURCE_FIELD: ClassVar[type[Field]] = ... WIDGETS_MAP: ClassVar[dict[str, type[Widget]]] diff --git a/stubs/django-import-export/import_export/utils.pyi b/stubs/django-import-export/import_export/utils.pyi index 6c91909fb926..d4b968a3f3f7 100644 --- a/stubs/django-import-export/import_export/utils.pyi +++ b/stubs/django-import-export/import_export/utils.pyi @@ -1,5 +1,7 @@ from types import TracebackType +from typing import Any, overload +from django.db.models import Field as DjangoField, ForeignObjectRel, Model from django.db.transaction import Atomic class atomic_if_using_transaction: @@ -10,3 +12,8 @@ class atomic_if_using_transaction: def __exit__( self, exc_type: type[BaseException] | None, exc_value: BaseException | None, exc_tb: TracebackType | None ) -> None: ... + +@overload +def get_related_model(field: ForeignObjectRel) -> Model: ... +@overload +def get_related_model(field: DjangoField[Any, Any]) -> Model | None: ... From 1f79c4eb285f8f00a013b4ea937ef6c12a16bf72 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 13:58:21 +0100 Subject: [PATCH 23/38] Tackle https://github.com/django-import-export/django-import-export/pull/1717 --- stubs/django-import-export/import_export/widgets.pyi | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index 4e339d80458c..5aad01db8f35 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -59,8 +59,11 @@ _ModelT = TypeVar("_ModelT", bound=Model) class ForeignKeyWidget(Widget, Generic[_ModelT]): model: _ModelT field: str + key_is_id: bool use_natural_foreign_keys: bool - def __init__(self, model: _ModelT, field: str = "pk", use_natural_foreign_keys: bool = False, **kwargs: Any) -> None: ... + def __init__( + self, model: _ModelT, field: str = "pk", use_natural_foreign_keys: bool = False, key_is_id: bool = False, **kwargs: Any + ) -> None: ... def get_queryset(self, value: Any, row: Mapping[str, Any], *args: Any, **kwargs: Any) -> QuerySet[_ModelT]: ... def get_lookup_kwargs(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any): ... From c0ee80c0bdb420943a205bf2d7add2296401e5d1 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:00:28 +0100 Subject: [PATCH 24/38] Tackle https://github.com/django-import-export/django-import-export/pull/1824 --- stubs/django-import-export/import_export/exceptions.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/exceptions.pyi b/stubs/django-import-export/import_export/exceptions.pyi index 2637e7b41451..3f6b99db52d9 100644 --- a/stubs/django-import-export/import_export/exceptions.pyi +++ b/stubs/django-import-export/import_export/exceptions.pyi @@ -2,6 +2,7 @@ from typing import Any class ImportExportError(Exception): ... class FieldError(ImportExportError): ... +class WidgetError(ImportExportError): ... class ImportError(ImportExportError): error: Exception From 358b74ac9eb0588a75254f5619cbad53dcca3ce1 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:02:20 +0100 Subject: [PATCH 25/38] Tackle https://github.com/django-import-export/django-import-export/pull/1827 --- stubs/django-import-export/import_export/admin.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 57f154a68ca7..691ed780b034 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -82,6 +82,7 @@ class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_export_form_class(self) -> type[Form]: ... def export_action(self, request: HttpRequest) -> TemplateResponse: ... + def get_valid_export_item_pks(self, request: HttpRequest) -> list[str]: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... def get_export_filename(self, request: HttpRequest, queryset: QuerySet[_ModelT], file_format: Format) -> str: ... # type: ignore[override] def init_request_context_data(self, request: HttpRequest, form: Form) -> dict[str, Any]: ... From 51bfef21f683f5be5ba0beb6e53a04316663d7c4 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:04:39 +0100 Subject: [PATCH 26/38] Tackle https://github.com/django-import-export/django-import-export/pull/1837 --- stubs/django-import-export/import_export/mixins.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index 8da3654fa8c5..7e832a48fc11 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -28,7 +28,7 @@ class BaseImportExportMixin(Generic[_ModelT]): def import_formats(self) -> list[type[Format]]: ... def check_resource_classes(self, resource_classes: SupportsGetItem[int, type[Resource[_ModelT]]]) -> None: ... def get_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ... - def get_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... + def get_resource_kwargs(self, request: HttpRequest, *args: Any, **kwargs: Any) -> dict[str, Any]: ... def get_resource_index(self, form: Form) -> int: ... class BaseImportMixin(BaseImportExportMixin[_ModelT]): From 3081f93361238798670720dcbaf486e6421b1b71 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 14:08:15 +0100 Subject: [PATCH 27/38] Tackle https://github.com/django-import-export/django-import-export/pull/1867 --- stubs/django-import-export/import_export/mixins.pyi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/stubs/django-import-export/import_export/mixins.pyi b/stubs/django-import-export/import_export/mixins.pyi index 7e832a48fc11..947753288e53 100644 --- a/stubs/django-import-export/import_export/mixins.pyi +++ b/stubs/django-import-export/import_export/mixins.pyi @@ -32,19 +32,25 @@ class BaseImportExportMixin(Generic[_ModelT]): def get_resource_index(self, form: Form) -> int: ... class BaseImportMixin(BaseImportExportMixin[_ModelT]): + skip_import_confirm: bool def get_import_resource_classes(self, request: HttpRequest) -> list[type[Resource[_ModelT]]]: ... def get_import_formats(self) -> list[Format]: ... def get_import_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... def choose_import_resource_class(self, form: Form, request: HttpRequest) -> type[Resource[_ModelT]]: ... + def is_skip_import_confirm_enabled(self) -> bool: ... class BaseExportMixin(BaseImportExportMixin[_ModelT]): model: Model + skip_export_form: bool + skip_export_form_from_action: bool def get_export_formats(self) -> list[Format]: ... def get_export_resource_classes(self, request: HttpRequest) -> list[Resource[_ModelT]]: ... def choose_export_resource_class(self, form: Form, request: HttpRequest) -> Resource[_ModelT]: ... def get_export_resource_kwargs(self, request: HttpRequest, **kwargs: Any) -> dict[str, Any]: ... def get_data_for_export(self, request: HttpRequest, queryset: QuerySet[_ModelT], **kwargs: Any) -> Dataset: ... def get_export_filename(self, file_format: Format) -> str: ... + def is_skip_export_form_enabled(self) -> bool: ... + def is_skip_export_form_from_action_enabled(self) -> bool: ... class ExportViewMixin(BaseExportMixin[_ModelT]): form_class: type[BaseForm] = ... From ae79eab7746a53f11a9df1b07ae192db8a85392d Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:57:15 +0100 Subject: [PATCH 28/38] Tackle https://github.com/django-import-export/django-import-export/pull/1882 --- stubs/django-import-export/import_export/results.pyi | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 9a349f8a7a7c..47ecd5c159e5 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -1,6 +1,7 @@ from _typeshed import Incomplete from collections import OrderedDict from collections.abc import Iterator +from functools import cached_property from typing import Any, ClassVar, Literal from typing_extensions import TypeAlias @@ -11,12 +12,12 @@ Dataset: TypeAlias = Incomplete # tablib.Dataset class Error: error: Exception - traceback: str row: dict[str, Any] number: int | None - def __init__( - self, error: Exception, traceback: str | None = None, row: dict[str, Any] | None = None, number: int | None = None - ) -> None: ... + def __init__(self, error: Exception, row: dict[str, Any] | None = None, number: int | None = None) -> None: ... + def __repr__(self) -> str: ... + @cached_property + def traceback(self) -> str: ... _ImportType: TypeAlias = Literal["update", "new", "delete", "skip", "error", "invalid"] From 8d88e2655e5d9c1b85358f3187a3165d36454d2d Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:58:32 +0100 Subject: [PATCH 29/38] Tackle https://github.com/django-import-export/django-import-export/pull/1886 --- stubs/django-import-export/import_export/resources.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 012e17a02250..34fdd54e9ee5 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -4,7 +4,7 @@ from collections.abc import Iterator, Sequence from functools import partial from logging import Logger from typing import Any, ClassVar, Generic, Literal, NoReturn, TypeVar, overload -from typing_extensions import TypeAlias +from typing_extensions import TypeAlias, deprecated from django.db.models import Field as DjangoField, Model, QuerySet from django.utils.safestring import SafeString @@ -50,6 +50,7 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def get_db_connection_name(self) -> str: ... def get_use_transactions(self) -> bool: ... def get_chunk_size(self) -> int: ... + @deprecated("The 'get_fields()' method is deprecated and will be removed in a future release.") def get_fields(self, **kwargs: Any) -> list[Field]: ... def get_field_name(self, field: Field) -> str: ... def init_instance(self, row: dict[str, Any] | None = None) -> _ModelT: ... From 591cf20722ab0e888edfdc378074f266a8e67a3b Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:01:58 +0100 Subject: [PATCH 30/38] Tackle https://github.com/django-import-export/django-import-export/pull/1890 --- stubs/django-import-export/import_export/admin.pyi | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/stubs/django-import-export/import_export/admin.pyi b/stubs/django-import-export/import_export/admin.pyi index 691ed780b034..9f02027f90cc 100644 --- a/stubs/django-import-export/import_export/admin.pyi +++ b/stubs/django-import-export/import_export/admin.pyi @@ -2,7 +2,7 @@ from _typeshed import Incomplete from collections.abc import Callable, Sequence from logging import Logger from typing import Any, Literal, TypeVar -from typing_extensions import TypeAlias +from typing_extensions import TypeAlias, deprecated from django.contrib import admin from django.contrib.admin.helpers import ActionForm @@ -82,6 +82,10 @@ class ExportMixin(BaseExportMixin[_ModelT], ImportExportMixinBase): def get_context_data(self, **kwargs: Any) -> dict[str, Any]: ... def get_export_form_class(self) -> type[Form]: ... def export_action(self, request: HttpRequest) -> TemplateResponse: ... + @deprecated( + "The 'get_valid_export_item_pks()' method is deprecated and will be removed in a future release. " + "Overwrite 'get_queryset()' or 'get_export_queryset()' instead." + ) def get_valid_export_item_pks(self, request: HttpRequest) -> list[str]: ... def changelist_view(self, request: HttpRequest, extra_context: dict[str, Any] | None = None) -> HttpResponse: ... def get_export_filename(self, request: HttpRequest, queryset: QuerySet[_ModelT], file_format: Format) -> str: ... # type: ignore[override] From c69c4928e8a1c935b3daeb84bf2d8dbd5e03a0ee Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:20:55 +0100 Subject: [PATCH 31/38] Tackle https://github.com/django-import-export/django-import-export/pull/1903 --- stubs/django-import-export/import_export/resources.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index 34fdd54e9ee5..de47114547b8 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -132,9 +132,9 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def after_export(self, queryset: QuerySet[_ModelT], dataset: Dataset, **kwargs: Any) -> None: ... def filter_export(self, queryset: QuerySet[_ModelT], **kwargs: Any) -> QuerySet[_ModelT]: ... def export_field(self, field: Field, instance: _ModelT) -> str: ... - def get_export_fields(self) -> list[Field]: ... - def export_resource(self, instance: _ModelT) -> list[str]: ... - def get_export_headers(self) -> list[str]: ... + def get_export_fields(self, selected_fields: Sequence[str] | None = None) -> list[Field]: ... + def export_resource(self, instance: _ModelT, selected_fields: Sequence[str] | None = None) -> list[str]: ... + def get_export_headers(self, selected_fields: Sequence[str] | None = None) -> list[str]: ... def get_user_visible_headers(self) -> list[str]: ... def get_user_visible_fields(self) -> list[str]: ... def iter_queryset(self, queryset: QuerySet[_ModelT]) -> Iterator[_ModelT]: ... From 9d402dc811f5ad7c70352dd295b4057a7e5c2b15 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:28:17 +0100 Subject: [PATCH 32/38] Tackle https://github.com/django-import-export/django-import-export/pull/1939 --- stubs/django-import-export/import_export/fields.pyi | 2 +- .../import_export/formats/base_formats.pyi | 1 + stubs/django-import-export/import_export/resources.pyi | 4 ++-- stubs/django-import-export/import_export/widgets.pyi | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/stubs/django-import-export/import_export/fields.pyi b/stubs/django-import-export/import_export/fields.pyi index 4d4e1d6efdf1..d17fb1d7e2eb 100644 --- a/stubs/django-import-export/import_export/fields.pyi +++ b/stubs/django-import-export/import_export/fields.pyi @@ -30,5 +30,5 @@ class Field: def clean(self, row: Mapping[str, Any], **kwargs: Any) -> Any: ... def get_value(self, instance: Model) -> Any: ... def save(self, instance: Model, row: Mapping[str, Any], is_m2m: bool = False, **kwargs: Any) -> None: ... - def export(self, instance: Model) -> str: ... + def export(self, instance: Model, **kwargs: Any) -> str: ... def get_dehydrate_method(self, field_name: str | None = None) -> str: ... diff --git a/stubs/django-import-export/import_export/formats/base_formats.pyi b/stubs/django-import-export/import_export/formats/base_formats.pyi index 2e3659a079da..1f06fecda739 100644 --- a/stubs/django-import-export/import_export/formats/base_formats.pyi +++ b/stubs/django-import-export/import_export/formats/base_formats.pyi @@ -54,3 +54,4 @@ class XLSX(TablibFormat): def create_dataset(self, in_stream: ReadableBuffer) -> Dataset: ... # type: ignore[override] DEFAULT_FORMATS: list[type[Format]] +BINARY_FORMATS: list[type[Format]] diff --git a/stubs/django-import-export/import_export/resources.pyi b/stubs/django-import-export/import_export/resources.pyi index de47114547b8..1c5a5e7f1b24 100644 --- a/stubs/django-import-export/import_export/resources.pyi +++ b/stubs/django-import-export/import_export/resources.pyi @@ -131,9 +131,9 @@ class Resource(Generic[_ModelT], metaclass=DeclarativeMetaclass): def before_export(self, queryset: QuerySet[_ModelT], **kwargs: Any) -> None: ... def after_export(self, queryset: QuerySet[_ModelT], dataset: Dataset, **kwargs: Any) -> None: ... def filter_export(self, queryset: QuerySet[_ModelT], **kwargs: Any) -> QuerySet[_ModelT]: ... - def export_field(self, field: Field, instance: _ModelT) -> str: ... + def export_field(self, field: Field, instance: _ModelT, **kwargs: Any) -> str: ... def get_export_fields(self, selected_fields: Sequence[str] | None = None) -> list[Field]: ... - def export_resource(self, instance: _ModelT, selected_fields: Sequence[str] | None = None) -> list[str]: ... + def export_resource(self, instance: _ModelT, selected_fields: Sequence[str] | None = None, **kwargs: Any) -> list[str]: ... def get_export_headers(self, selected_fields: Sequence[str] | None = None) -> list[str]: ... def get_user_visible_headers(self) -> list[str]: ... def get_user_visible_fields(self) -> list[str]: ... diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index 5aad01db8f35..c37466718162 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -13,9 +13,9 @@ class Widget: def clean(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any) -> Any: ... @overload @deprecated("The 'obj' parameter is deprecated and will be removed in a future release.") - def render(self, value: Any, obj: Model) -> Any: ... + def render(self, value: Any, obj: Model, **kwargs: Any) -> Any: ... @overload - def render(self, value: Any, obj: None = None) -> Any: ... + def render(self, value: Any, obj: None = None, **kwargs: Any) -> Any: ... class NumberWidget(Widget): def is_empty(self, value: Any) -> bool: ... From ea4698c02f45312d7b5572e0919e48ff60955f6d Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:45:43 +0100 Subject: [PATCH 33/38] Tackle https://github.com/django-import-export/django-import-export/pull/1992 --- .../import_export/command_utils.pyi | 12 ++++++++++++ stubs/django-import-export/management/__init__.pyi | 0 .../management/commands/__init__.pyi | 0 .../management/commands/export.pyi | 3 +++ .../management/commands/import.pyi | 3 +++ 5 files changed, 18 insertions(+) create mode 100644 stubs/django-import-export/import_export/command_utils.pyi create mode 100644 stubs/django-import-export/management/__init__.pyi create mode 100644 stubs/django-import-export/management/commands/__init__.pyi create mode 100644 stubs/django-import-export/management/commands/export.pyi create mode 100644 stubs/django-import-export/management/commands/import.pyi diff --git a/stubs/django-import-export/import_export/command_utils.pyi b/stubs/django-import-export/import_export/command_utils.pyi new file mode 100644 index 000000000000..a3c1fb5e4236 --- /dev/null +++ b/stubs/django-import-export/import_export/command_utils.pyi @@ -0,0 +1,12 @@ +from _typeshed import StrPath +from typing import Any + +from .formats.base_formats import Format +from .resources import ModelResource + +def get_resource_class(model_or_resource_class: str) -> ModelResource[Any]: ... + +MIME_TYPE_FORMAT_MAPPING: dict[str, type[Format]] + +def get_format_class(format_name: str, file_name: StrPath, encoding: str | None = None) -> Format: ... +def get_default_format_names() -> str: ... diff --git a/stubs/django-import-export/management/__init__.pyi b/stubs/django-import-export/management/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/django-import-export/management/commands/__init__.pyi b/stubs/django-import-export/management/commands/__init__.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/stubs/django-import-export/management/commands/export.pyi b/stubs/django-import-export/management/commands/export.pyi new file mode 100644 index 000000000000..8d75fb4d613f --- /dev/null +++ b/stubs/django-import-export/management/commands/export.pyi @@ -0,0 +1,3 @@ +from django.core.management.base import BaseCommand + +class Command(BaseCommand): ... diff --git a/stubs/django-import-export/management/commands/import.pyi b/stubs/django-import-export/management/commands/import.pyi new file mode 100644 index 000000000000..8d75fb4d613f --- /dev/null +++ b/stubs/django-import-export/management/commands/import.pyi @@ -0,0 +1,3 @@ +from django.core.management.base import BaseCommand + +class Command(BaseCommand): ... From 38166f5d99d97047b6e5f6387e62c55e4e606893 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:46:44 +0100 Subject: [PATCH 34/38] Tackle https://github.com/django-import-export/django-import-export/pull/2001 --- .../import_export/formats/base_formats.pyi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/stubs/django-import-export/import_export/formats/base_formats.pyi b/stubs/django-import-export/import_export/formats/base_formats.pyi index 1f06fecda739..a2206683b830 100644 --- a/stubs/django-import-export/import_export/formats/base_formats.pyi +++ b/stubs/django-import-export/import_export/formats/base_formats.pyi @@ -1,9 +1,12 @@ from _typeshed import Incomplete, ReadableBuffer +from logging import Logger from typing import IO, Any, ClassVar from typing_extensions import Self, TypeAlias Dataset: TypeAlias = Incomplete # tablib.Dataset +logger: Logger + class Format: def get_title(self) -> type[Self]: ... def create_dataset(self, in_stream: str | bytes | IO[Any]) -> Dataset: ... From ade85ffcb0d45875928ec76927c81d8addf82230 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:47:24 +0100 Subject: [PATCH 35/38] Tackle https://github.com/django-import-export/django-import-export/pull/2003 --- stubs/django-import-export/import_export/results.pyi | 1 + 1 file changed, 1 insertion(+) diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 47ecd5c159e5..13938de5cf7d 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -59,6 +59,7 @@ class InvalidRow: values: tuple[Any, ...] error_dict: dict[str, list[str]] def __init__(self, number: int, validation_error: ValidationError, values: tuple[Any, ...]) -> None: ... + def __repr__(self) -> str: ... @property def field_specific_errors(self) -> dict[str, list[str]]: ... @property From 35b34ad10bab1be84fd8804a859353ccae5e5c9e Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 19 Jan 2025 18:58:22 +0100 Subject: [PATCH 36/38] Fixes --- stubs/django-import-export/import_export/results.pyi | 2 -- stubs/django-import-export/import_export/widgets.pyi | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/stubs/django-import-export/import_export/results.pyi b/stubs/django-import-export/import_export/results.pyi index 13938de5cf7d..509d94436403 100644 --- a/stubs/django-import-export/import_export/results.pyi +++ b/stubs/django-import-export/import_export/results.pyi @@ -15,7 +15,6 @@ class Error: row: dict[str, Any] number: int | None def __init__(self, error: Exception, row: dict[str, Any] | None = None, number: int | None = None) -> None: ... - def __repr__(self) -> str: ... @cached_property def traceback(self) -> str: ... @@ -59,7 +58,6 @@ class InvalidRow: values: tuple[Any, ...] error_dict: dict[str, list[str]] def __init__(self, number: int, validation_error: ValidationError, values: tuple[Any, ...]) -> None: ... - def __repr__(self) -> str: ... @property def field_specific_errors(self) -> dict[str, list[str]]: ... @property diff --git a/stubs/django-import-export/import_export/widgets.pyi b/stubs/django-import-export/import_export/widgets.pyi index c37466718162..16296912b39b 100644 --- a/stubs/django-import-export/import_export/widgets.pyi +++ b/stubs/django-import-export/import_export/widgets.pyi @@ -65,7 +65,7 @@ class ForeignKeyWidget(Widget, Generic[_ModelT]): self, model: _ModelT, field: str = "pk", use_natural_foreign_keys: bool = False, key_is_id: bool = False, **kwargs: Any ) -> None: ... def get_queryset(self, value: Any, row: Mapping[str, Any], *args: Any, **kwargs: Any) -> QuerySet[_ModelT]: ... - def get_lookup_kwargs(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any): ... + def get_lookup_kwargs(self, value: Any, row: Mapping[str, Any] | None = None, **kwargs: Any) -> dict[str, Any]: ... class ManyToManyWidget(Widget, Generic[_ModelT]): model: _ModelT From 1aa4152184aca121987aaea12365db2bb10583b4 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Tue, 21 Jan 2025 17:00:40 +0100 Subject: [PATCH 37/38] Try importing tablib --- .../import_export/formats/base_formats.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/django-import-export/import_export/formats/base_formats.pyi b/stubs/django-import-export/import_export/formats/base_formats.pyi index a2206683b830..bd4871e60496 100644 --- a/stubs/django-import-export/import_export/formats/base_formats.pyi +++ b/stubs/django-import-export/import_export/formats/base_formats.pyi @@ -1,9 +1,9 @@ -from _typeshed import Incomplete, ReadableBuffer +from _typeshed import ReadableBuffer from logging import Logger from typing import IO, Any, ClassVar -from typing_extensions import Self, TypeAlias +from typing_extensions import Self -Dataset: TypeAlias = Incomplete # tablib.Dataset +from tablib import Dataset # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] logger: Logger From dca9a55c1a6916220238014d7f5ffc1d6a448c55 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Sun, 2 Feb 2025 12:37:11 +0100 Subject: [PATCH 38/38] Revert import --- .../import_export/formats/base_formats.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/django-import-export/import_export/formats/base_formats.pyi b/stubs/django-import-export/import_export/formats/base_formats.pyi index bd4871e60496..a2206683b830 100644 --- a/stubs/django-import-export/import_export/formats/base_formats.pyi +++ b/stubs/django-import-export/import_export/formats/base_formats.pyi @@ -1,9 +1,9 @@ -from _typeshed import ReadableBuffer +from _typeshed import Incomplete, ReadableBuffer from logging import Logger from typing import IO, Any, ClassVar -from typing_extensions import Self +from typing_extensions import Self, TypeAlias -from tablib import Dataset # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] +Dataset: TypeAlias = Incomplete # tablib.Dataset logger: Logger