From cd0b65bcf79dc61481d94a415a1598bb510d21c9 Mon Sep 17 00:00:00 2001 From: Brian Rosner Date: Fri, 29 Aug 2008 16:46:46 +0000 Subject: [PATCH] Fixed #7982 -- Corrected ModelAdmin url dispatching to ensure it matching exactly what it needs and doesn't stomp on primary key space. 'add' is a lost cause for now. This originated from #6470. Thanks jdetaeye for the original patch and basith for providing test cases. git-svn-id: http://code.djangoproject.com/svn/django/trunk@8704 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/options.py | 6 +++--- tests/regressiontests/admin_views/tests.py | 25 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 9eaa9e5851f..c0cfc2fad61 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -186,11 +186,11 @@ class ModelAdmin(BaseModelAdmin): # Delegate to the appropriate method, based on the URL. if url is None: return self.changelist_view(request) - elif url.endswith('add'): + elif url == "add": return self.add_view(request) - elif url.endswith('history'): + elif url.endswith('/history'): return self.history_view(request, unquote(url[:-8])) - elif url.endswith('delete'): + elif url.endswith('/delete'): return self.delete_view(request, unquote(url[:-7])) else: return self.change_view(request, unquote(url)) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index d16889f45a7..56937d8462a 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -458,6 +458,31 @@ class AdminViewStringPrimaryKeyTest(TestCase): response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk)) should_contain = """%s""" % (quote(self.pk), escape(self.pk)) self.assertContains(response, should_contain) + + def test_url_conflicts_with_add(self): + "A model with a primary key that ends with add should be visible" + add_model = ModelWithStringPrimaryKey(id="i have something to add") + add_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(add_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + + def test_url_conflicts_with_delete(self): + "A model with a primary key that ends with delete should be visible" + delete_model = ModelWithStringPrimaryKey(id="delete") + delete_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(delete_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + + def test_url_conflicts_with_history(self): + "A model with a primary key that ends with history should be visible" + history_model = ModelWithStringPrimaryKey(id="history") + history_model.save() + response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(history_model.pk)) + should_contain = """

Change model with string primary key

""" + self.assertContains(response, should_contain) + class SecureViewTest(TestCase): fixtures = ['admin-views-users.xml']