Skip to content

Commit 3816ba2

Browse files
re-add resource_class deprecation warning (#1837)
* re-add resource_class deprecation warning * updated changelog
1 parent b2479b3 commit 3816ba2

File tree

4 files changed

+132
-4
lines changed

4 files changed

+132
-4
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.PHONY: clean-pyc clean-build docs help
22
.PHONY: lint test coverage test-codecov
33
.DEFAULT_GOAL := help
4-
RUN_TEST_COMMAND=PYTHONPATH=".:tests:${PYTHONPATH}" django-admin test core --settings=settings
4+
RUN_TEST_COMMAND=PYTHONPATH=".:tests:${PYTHONPATH}" python -W error -m django test core --settings=settings
55
help:
66
@grep '^[a-zA-Z]' $(MAKEFILE_LIST) | sort | awk -F ':.*?## ' 'NF==2 {printf "\033[36m %-25s\033[0m %s\n", $$1, $$2}'
77

docs/changelog.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Changelog
99
------------------
1010

1111
- Clarified documentation when importing with ``import_id_fields`` (`1836 <https://github.com/django-import-export/django-import-export/pull/1836>`_)
12+
- re-add ``resource_class`` deprecation warning (`1837 <https://github.com/django-import-export/django-import-export/pull/1837>`_)
1213

1314
4.0.2 (2024-05-13)
1415
------------------

import_export/mixins.py

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
import warnings
23
from warnings import warn
34

45
from django.conf import settings
@@ -20,6 +21,7 @@ class BaseImportExportMixin:
2021
interface.
2122
"""
2223

24+
resource_class = None
2325
resource_classes = []
2426

2527
@property
@@ -47,11 +49,30 @@ def get_resource_classes(self, request):
4749
:param request: The request object.
4850
:returns: The Resource classes.
4951
"""
50-
if not self.resource_classes:
52+
if self.resource_classes and self.resource_class:
53+
raise Exception(
54+
"Only one of 'resource_class' and 'resource_classes' can be set"
55+
)
56+
if hasattr(self, "get_resource_class"):
57+
warnings.warn(
58+
"The 'get_resource_class()' method has been deprecated. "
59+
"Please implement the new 'get_resource_classes()' method",
60+
DeprecationWarning,
61+
)
62+
return [self.get_resource_class()]
63+
if self.resource_class:
64+
warnings.warn(
65+
"The 'resource_class' field has been deprecated. "
66+
"Please implement the new 'resource_classes' field",
67+
DeprecationWarning,
68+
)
69+
if not self.resource_classes and not self.resource_class:
5170
return [modelresource_factory(self.model)]
52-
return self.resource_classes
71+
if self.resource_classes:
72+
return self.resource_classes
73+
return [self.resource_class]
5374

54-
def get_resource_kwargs(self, request, **kwargs):
75+
def get_resource_kwargs(self, request, *args, **kwargs):
5576
"""
5677
Return the kwargs which are to be passed to the Resource constructor.
5778
Can be overridden to provide additional kwarg params.
@@ -84,6 +105,13 @@ def get_import_resource_classes(self, request):
84105
:param request: The request object.
85106
Returns ResourceClass subscriptable (list, tuple, ...) to use for import.
86107
"""
108+
if hasattr(self, "get_import_resource_class"):
109+
warnings.warn(
110+
"The 'get_import_resource_class()' method has been deprecated. "
111+
"Please implement the new 'get_import_resource_classes()' method",
112+
DeprecationWarning,
113+
)
114+
return [self.get_import_resource_class()]
87115
resource_classes = self.get_resource_classes(request)
88116
self.check_resource_classes(resource_classes)
89117
return resource_classes
@@ -129,6 +157,13 @@ def get_export_resource_classes(self, request):
129157
:param request: The request object.
130158
:returns: The Resource classes.
131159
"""
160+
if hasattr(self, "get_export_resource_class"):
161+
warnings.warn(
162+
"The 'get_export_resource_class()' method has been deprecated. "
163+
"Please implement the new 'get_export_resource_classes()' method",
164+
DeprecationWarning,
165+
)
166+
return [self.get_export_resource_class()]
132167
resource_classes = self.get_resource_classes(request)
133168
self.check_resource_classes(resource_classes)
134169
return resource_classes

tests/core/tests/test_mixins.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,62 @@ def test_get_export_resource_kwargs_calls_self_get_resource_kwargs(self):
182182
admin.get_export_resource_kwargs(self.request)
183183
self.assertEqual(1, admin.call_count)
184184

185+
class BaseModelResourceClassTest(mixins.BaseImportMixin, mixins.BaseExportMixin):
186+
resource_class = resources.Resource
187+
export_call_count = 0
188+
import_call_count = 0
189+
190+
def get_export_resource_class(self):
191+
self.export_call_count += 1
192+
193+
def get_import_resource_class(self):
194+
self.import_call_count += 1
195+
196+
def test_deprecated_resource_class_raises_warning(self):
197+
"""Test that the mixin throws error if user didn't
198+
migrate to resource_classes"""
199+
admin = self.BaseModelResourceClassTest()
200+
with self.assertWarnsRegex(
201+
DeprecationWarning,
202+
r"^The 'get_export_resource_class\(\)' method has been deprecated. "
203+
r"Please implement the new 'get_export_resource_classes\(\)' method$",
204+
):
205+
admin.get_export_resource_classes(self.request)
206+
207+
with self.assertWarnsRegex(
208+
DeprecationWarning,
209+
r"^The 'get_import_resource_class\(\)' method has been deprecated. "
210+
r"Please implement the new 'get_import_resource_classes\(\)' method$",
211+
):
212+
admin.get_import_resource_classes(self.request)
213+
214+
with self.assertWarnsRegex(
215+
DeprecationWarning,
216+
r"^The 'resource_class' field has been deprecated. "
217+
r"Please implement the new 'resource_classes' field$",
218+
):
219+
self.assertEqual(
220+
admin.get_resource_classes(self.request), [resources.Resource]
221+
)
222+
223+
self.assertEqual(1, admin.export_call_count)
224+
self.assertEqual(1, admin.import_call_count)
225+
226+
class BaseModelGetExportResourceClassTest(mixins.BaseExportMixin):
227+
def get_resource_class(self):
228+
pass
229+
230+
def test_deprecated_get_resource_class_raises_warning(self):
231+
"""Test that the mixin throws error if user
232+
didn't migrate to resource_classes"""
233+
admin = self.BaseModelGetExportResourceClassTest()
234+
with self.assertWarnsRegex(
235+
DeprecationWarning,
236+
r"^The 'get_resource_class\(\)' method has been deprecated. "
237+
r"Please implement the new 'get_resource_classes\(\)' method$",
238+
):
239+
admin.get_resource_classes(self.request)
240+
185241
class BaseModelAdminFaultyResourceClassesTest(mixins.BaseExportMixin):
186242
resource_classes = resources.Resource
187243

@@ -199,6 +255,14 @@ class BaseModelAdminBothResourceTest(mixins.BaseExportMixin):
199255
resource_class = resources.Resource
200256
resource_classes = [resources.Resource]
201257

258+
def test_both_resource_class_raises_exception(self):
259+
"""Test fallback mechanism to old get_export_resource_class() method"""
260+
admin = self.BaseModelAdminBothResourceTest()
261+
with self.assertRaisesRegex(
262+
Exception, "Only one of 'resource_class' and 'resource_classes' can be set"
263+
):
264+
admin.get_export_resource_classes(self.request)
265+
202266
class BaseModelExportChooseTest(mixins.BaseExportMixin):
203267
resource_classes = [resources.Resource, FooResource]
204268

@@ -231,6 +295,34 @@ def test_choose_import_resource_class(self, form):
231295
form.cleaned_data = {"resource": 1}
232296
self.assertEqual(admin.choose_import_resource_class(form, request), FooResource)
233297

298+
class BaseModelResourceClassOldTest(mixins.BaseImportMixin, mixins.BaseExportMixin):
299+
def get_resource_class(self):
300+
return FooResource
301+
302+
def test_get_resource_class_old(self):
303+
"""
304+
Test that if only the old get_resource_class() method is defined,
305+
the get_export_resource_classes() and get_import_resource_classes()
306+
still return list of resources.
307+
"""
308+
admin = self.BaseModelResourceClassOldTest()
309+
with self.assertWarnsRegex(
310+
DeprecationWarning,
311+
r"^The 'get_resource_class\(\)' method has been deprecated. "
312+
r"Please implement the new 'get_resource_classes\(\)' method$",
313+
):
314+
self.assertEqual(
315+
admin.get_export_resource_classes(self.request), [FooResource]
316+
)
317+
with self.assertWarnsRegex(
318+
DeprecationWarning,
319+
r"^The 'get_resource_class\(\)' method has been deprecated. "
320+
r"Please implement the new 'get_resource_classes\(\)' method$",
321+
):
322+
self.assertEqual(
323+
admin.get_import_resource_classes(self.request), [FooResource]
324+
)
325+
234326

235327
class BaseExportMixinTest(TestCase):
236328
class TestBaseExportMixin(mixins.BaseExportMixin):

0 commit comments

Comments
 (0)