Skip to content

Commit

Permalink
Adjustments to ValidationError test.
Browse files Browse the repository at this point in the history
  • Loading branch information
carltongibson committed May 16, 2018
1 parent 723ae14 commit c750d8a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 deletions.
17 changes: 11 additions & 6 deletions django/contrib/admin/options.py
Expand Up @@ -1590,6 +1590,16 @@ def get_edited_object_pks(self, request, prefix):
value for key, value in request.POST.items() if pk_pattern.match(key)
]

def get_list_editable_queryset(self, request, prefix):
object_pks = self.get_edited_object_pks(request, prefix)
modified_objects = self.get_queryset(request).filter(pk__in=object_pks)
try:
# Force evaluate queryset to verify that pks are valid
list(modified_objects)
except ValidationError:
raise ValidationError("Invalid Primary Key Provided")
return modified_objects

@csrf_protect_m
def changelist_view(self, request, extra_context=None):
"""
Expand Down Expand Up @@ -1664,12 +1674,7 @@ def changelist_view(self, request, extra_context=None):
# Handle POSTed bulk-edit data.
if request.method == 'POST' and cl.list_editable and '_save' in request.POST:
FormSet = self.get_changelist_formset(request)
object_pks = self.get_edited_object_pks(request, FormSet.get_default_prefix())
try:
# Verifies that the changed objects have valid pks
modified_objects = self.get_queryset(request).filter(pk__in=object_pks)
except Exception:
raise ValidationError("Invalid Primary Key Provided")
modified_objects = self.get_list_editable_queryset(request, FormSet.get_default_prefix())
formset = cl.formset = FormSet(request.POST, request.FILES, queryset=modified_objects)
if formset.is_valid():
changecount = 0
Expand Down
9 changes: 4 additions & 5 deletions tests/admin_changelist/tests.py
Expand Up @@ -8,12 +8,13 @@
from django.contrib.admin.views.main import ALL_VAR, SEARCH_VAR
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.db.models import F
from django.db.models.fields import Field, IntegerField
from django.db.models.functions import Upper
from django.db.models.lookups import Contains, Exact
from django.template import Context, Template, TemplateSyntaxError
from django.test import TestCase, override_settings, skipUnlessDBFeature
from django.test import TestCase, override_settings
from django.test.client import RequestFactory
from django.urls import reverse
from django.utils import formats
Expand Down Expand Up @@ -762,7 +763,6 @@ def test_get_edited_object_ids(self):
pks = m.get_edited_object_pks(request, prefix='form')
self.assertEqual(sorted(pks), sorted([str(a.pk), str(b.pk), str(c.pk)]))

@skipUnlessDBFeature('has_native_uuid_field')
def test_type_error_on_invalid_pk_submission(self):
Swallow.objects.create(origin='Swallow A', load=4, speed=1)
data = {
Expand All @@ -771,16 +771,15 @@ def test_type_error_on_invalid_pk_submission(self):
'form-MIN_NUM_FORMS': '0',
'form-MAX_NUM_FORMS': '1000',
'form-0-uuid': 'INVALD_PRIMARY_KEY',
'_save': 'Save',
}

superuser = self._create_superuser('superuser')
self.client.force_login(superuser)
changelist_url = reverse('admin:admin_changelist_swallow_changelist')

self.assertRaises(
TypeError,
with self.assertRaisesMessage(ValidationError, "Invalid Primary Key Provided"):
self.client.post(changelist_url, data, follow=True, extra={'o': '-2'})
)

def test_deterministic_order_for_unordered_model(self):
"""
Expand Down

0 comments on commit c750d8a

Please sign in to comment.