Fixes #22397: Fix AttributeError exception for unauthentictaed users during bulk export

This commit is contained in:
Fabi 2026-06-14 10:34:51 -04:00 committed by GitHub
parent 850aae2d35
commit bf1a27b89c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 2 deletions

View File

@ -408,6 +408,9 @@ class BookmarkTestCase(
def test_list_objects_anonymous(self):
return
def test_export_objects_anonymous(self):
return
def test_list_objects_with_constrained_permission(self):
return
@ -962,6 +965,9 @@ class SubscriptionTestCase(
login_url = reverse('login')
self.assertRedirects(self.client.get(url), f'{login_url}?next={url}')
def test_export_objects_anonymous(self):
return
def test_list_objects_with_permission(self):
return
@ -1070,6 +1076,9 @@ class NotificationTestCase(
login_url = reverse('login')
self.assertRedirects(self.client.get(url), f'{login_url}?next={url}')
def test_export_objects_anonymous(self):
return
def test_list_objects_with_permission(self):
return

View File

@ -181,7 +181,7 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
if request.GET['export'] == 'table':
table = self.get_table(self.queryset, request, has_table_actions)
columns = [name for name, _ in table.selected_columns]
delimiter = request.user.config.get('csv_delimiter')
delimiter = request.user.config.get('csv_delimiter') if request.user.is_authenticated else None
return self.export_table(table, columns, delimiter=delimiter)
# Render an ExportTemplate
@ -202,7 +202,7 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin):
# Fall back to default table/YAML export
table = self.get_table(self.queryset, request, has_table_actions)
delimiter = request.user.config.get('csv_delimiter')
delimiter = request.user.config.get('csv_delimiter') if request.user.is_authenticated else None
return self.export_table(table, delimiter=delimiter)
# Render the objects table

View File

@ -517,6 +517,31 @@ class ViewTestCases:
self.assertHttpStatus(response, 200)
self.assertEqual(response.get('Content-Type'), 'text/csv; charset=utf-8')
@override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], LOGIN_REQUIRED=False)
def test_export_objects_anonymous(self):
# Ensure we are logged out.
self.client.logout()
# Some models (e.g. the users model) always require to be logged in, so we skip them here.
ct = ContentType.objects.get_for_model(self.model)
if (ct.app_label, ct.model) in settings.EXEMPT_EXCLUDE_MODELS:
return
url = self._get_url('list')
# Test default CSV (or sometimes YAML) export
response = self.client.get(f'{url}?export')
self.assertHttpStatus(response, 200)
if hasattr(self.model, 'to_yaml'):
self.assertEqual(response.get('Content-Type'), 'text/yaml')
else:
self.assertEqual(response.get('Content-Type'), 'text/csv; charset=utf-8')
# Test table-based export
response = self.client.get(f'{url}?export=table')
self.assertHttpStatus(response, 200)
self.assertEqual(response.get('Content-Type'), 'text/csv; charset=utf-8')
class CreateMultipleObjectsViewTestCase(ModelViewTestCase):
"""
Create multiple instances using a single form. Expects the creation of three new instances by default.