Skip to content

Commit fb7fc62

Browse files
authored
Merge pull request #150 from saritasa-nest/feature/add-field-selection-to-export-in-admin-page
Add field selection to admin export confirmation page
2 parents d1b505e + fdb70ef commit fb7fc62

File tree

4 files changed

+59
-3
lines changed

4 files changed

+59
-3
lines changed

HISTORY.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ unreleased
88
* Improve filterset class initialization during fetching export queryset
99
* Add ability to customize the order of operation for export queryset
1010
* Add ability to set dataset title
11+
* Add field selection to the export confirmation page in the admin panel
1112

1213
1.8.0 (2025-06-30)
1314
------------------

import_export_extensions/admin/mixins/export_mixin.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from django.utils.translation import gettext_lazy as _
1313

1414
from import_export import admin as import_export_admin
15+
from import_export import forms as import_export_forms
1516
from import_export import mixins as import_export_mixins
16-
from import_export.forms import ExportForm
1717

1818
from ... import models
1919
from . import base_mixin, types
@@ -43,7 +43,9 @@ class CeleryExportAdminMixin(
4343
# export data encoding
4444
to_encoding = "utf-8"
4545

46-
export_form_class: type[ExportForm] = ExportForm
46+
export_form_class: type[import_export_forms.ExportForm] = (
47+
import_export_forms.SelectableFieldsExportForm
48+
)
4749

4850
# template used to display ExportForm
4951
celery_export_template_name = "admin/import_export/export.html"
@@ -68,6 +70,7 @@ class CeleryExportAdminMixin(
6870
import_export_admin.ExportMixin.has_export_permission
6971
)
7072
get_export_form_class = import_export_admin.ExportMixin.get_export_form_class # noqa
73+
get_export_resource_fields_from_form = import_export_admin.ExportMixin.get_export_resource_fields_from_form # noqa
7174

7275
def get_export_context_data(self, **kwargs):
7376
"""Get context data for export."""
@@ -136,6 +139,10 @@ def celery_export_action(self, request, *args, **kwargs):
136139
)
137140
if request.method == "POST" and form.is_valid():
138141
file_format = formats[int(form.cleaned_data["format"])]
142+
# Get the selected export fields from the form
143+
resource_kwargs["export_fields"] = (
144+
self.get_export_resource_fields_from_form(form)
145+
)
139146
# create ExportJob and redirect to page with it's status
140147
job = self.create_export_job(
141148
request=request,

import_export_extensions/models/export_job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def cancel_export(self) -> None:
239239

240240
def _export_data_inner(self) -> None:
241241
"""Run export process with saving to file."""
242-
self.result = self.resource.export()
242+
self.result = self.resource.export(**self.resource_kwargs)
243243
self.save(update_fields=["result"])
244244

245245
# `export_data` may be bytes (base formats such as xlsx, csv, etc.) or

test_project/tests/integration_tests/test_admin/test_export/test_export.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ def test_export_using_admin_model(client: Client, superuser: User):
4545
path=reverse("admin:fake_app_artist_export"),
4646
data={
4747
"format": 0,
48+
"artistresourcewithm2m_id": "on",
49+
"artistresourcewithm2m_name": "on",
50+
"artistresourcewithm2m_bands": "on",
51+
"artistresourcewithm2m_instrument": "on",
4852
},
4953
)
5054
assert start_export_response.status_code == status.HTTP_302_FOUND
@@ -63,6 +67,46 @@ def test_export_using_admin_model(client: Client, superuser: User):
6367
)
6468

6569

70+
@pytest.mark.usefixtures("existing_artist")
71+
@pytest.mark.django_db(transaction=True)
72+
def test_export_using_admin_with_select_fields(
73+
client: Client,
74+
superuser: User,
75+
):
76+
"""Test that only selected fields are exported."""
77+
client.force_login(superuser)
78+
79+
# Make get request to admin export page
80+
export_get_response = client.get(
81+
path=reverse("admin:fake_app_artist_export"),
82+
)
83+
assert export_get_response.status_code == status.HTTP_200_OK
84+
85+
response = client.post(
86+
path=reverse("admin:fake_app_artist_export"),
87+
follow=True,
88+
data={
89+
"format": 0,
90+
"artistresourcewithm2m_id": "on",
91+
"artistresourcewithm2m_name": "on",
92+
"artistresourcewithm2m_bands": "on",
93+
},
94+
)
95+
assert response.status_code == status.HTTP_200_OK
96+
97+
with pathlib.Path(
98+
response.context["export_job"].data_file.path,
99+
).open() as file:
100+
content = list(csv.reader(file))
101+
102+
expected_fields_count = 3
103+
content_headers = content[0]
104+
exported_artist = content[1]
105+
assert len(content_headers) == expected_fields_count
106+
assert len(exported_artist) == expected_fields_count
107+
assert "instrument" not in content_headers
108+
109+
66110
@pytest.mark.parametrize(
67111
argnames=["view_name", "path_kwargs"],
68112
argvalues=[
@@ -259,6 +303,10 @@ def test_export_using_get_params(
259303
reverse("admin:fake_app_artist_export"),
260304
data={
261305
"format": 0,
306+
"artistresourcewithm2m_id": "on",
307+
"artistresourcewithm2m_name": "on",
308+
"artistresourcewithm2m_bands": "on",
309+
"artistresourcewithm2m_instrument": "on",
262310
},
263311
follow=True,
264312
QUERY_STRING=f"q={search_value}&instrument__title={instrument_title}",

0 commit comments

Comments
 (0)