diff options
| author | Claude Paroz <claude@2xlibre.net> | 2015-02-06 23:25:15 +0100 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2015-02-08 20:55:09 +0100 |
| commit | 32e6a7d3a57b2287d55e8b8efa4e8cb7643b1720 (patch) | |
| tree | 305218f5ea11a368ae1c167d52bcd8d65da8b037 /tests | |
| parent | 9033003d97d29f7754b0840333f6f362c0cd31f7 (diff) | |
Replaced hardcoded URLs in admin_* tests
Refs #15779. This will allow easier admin URL changes, when needed.
Thanks Simon Charette for the review.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/admin_changelist/tests.py | 4 | ||||
| -rw-r--r-- | tests/admin_custom_urls/tests.py | 8 | ||||
| -rw-r--r-- | tests/admin_inlines/tests.py | 90 | ||||
| -rw-r--r-- | tests/admin_views/customadmin.py | 2 | ||||
| -rw-r--r-- | tests/admin_views/tests.py | 1195 | ||||
| -rw-r--r-- | tests/admin_views/urls.py | 4 | ||||
| -rw-r--r-- | tests/admin_widgets/tests.py | 35 |
7 files changed, 692 insertions, 646 deletions
diff --git a/tests/admin_changelist/tests.py b/tests/admin_changelist/tests.py index 8647ff7e2c..6d2e50a9d9 100644 --- a/tests/admin_changelist/tests.py +++ b/tests/admin_changelist/tests.py @@ -368,7 +368,7 @@ class ChangeListTests(TestCase): username='super', email='super@localhost', password='secret') self.client.login(username='super', password='secret') event = Event.objects.create(date=datetime.date.today()) - response = self.client.get('/admin/admin_changelist/event/') + response = self.client.get(reverse('admin:admin_changelist_event_changelist')) self.assertContains(response, formats.localize(event.date)) self.assertNotContains(response, six.text_type(event.date)) @@ -681,7 +681,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): """ self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/auth/user/')) + reverse('admin:auth_user_changelist'))) form_id = '#changelist-form' diff --git a/tests/admin_custom_urls/tests.py b/tests/admin_custom_urls/tests.py index 3260bc603c..c2d5ad4994 100644 --- a/tests/admin_custom_urls/tests.py +++ b/tests/admin_custom_urls/tests.py @@ -26,7 +26,9 @@ class AdminCustomUrlsTest(TestCase): """ Ensure GET on the add_view works. """ - response = self.client.get('/admin/admin_custom_urls/action/!add/') + add_url = reverse('admin:admin_custom_urls_action_add') + self.assertTrue(add_url.endswith('/!add/')) + response = self.client.get(add_url) self.assertIsInstance(response, TemplateResponse) self.assertEqual(response.status_code, 200) @@ -35,7 +37,7 @@ class AdminCustomUrlsTest(TestCase): Ensure GET on the add_view plus specifying a field value in the query string works. """ - response = self.client.get('/admin/admin_custom_urls/action/!add/', {'name': 'My Action'}) + response = self.client.get(reverse('admin:admin_custom_urls_action_add'), {'name': 'My Action'}) self.assertEqual(response.status_code, 200) self.assertContains(response, 'value="My Action"') @@ -48,7 +50,7 @@ class AdminCustomUrlsTest(TestCase): "name": 'Action added through a popup', "description": "Description of added action", } - response = self.client.post('/admin/admin_custom_urls/action/!add/', post_data) + response = self.client.post(reverse('admin:admin_custom_urls_action_add'), post_data) self.assertEqual(response.status_code, 200) self.assertContains(response, 'dismissAddRelatedObjectPopup') self.assertContains(response, 'Action added through a popup') diff --git a/tests/admin_inlines/tests.py b/tests/admin_inlines/tests.py index 78889be30e..bad1508948 100644 --- a/tests/admin_inlines/tests.py +++ b/tests/admin_inlines/tests.py @@ -7,6 +7,7 @@ from django.contrib.admin.helpers import InlineAdminForm from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.contrib.auth.models import Permission, User from django.contrib.contenttypes.models import ContentType +from django.core.urlresolvers import reverse from django.test import RequestFactory, TestCase, override_settings from django.utils.encoding import force_text @@ -31,7 +32,6 @@ class TestInline(TestCase): holder = Holder(dummy=13) holder.save() Inner(dummy=42, holder=holder).save() - self.change_url = '/admin/admin_inlines/holder/%i/' % holder.id result = self.client.login(username='super', password='secret') self.assertEqual(result, True) @@ -41,7 +41,10 @@ class TestInline(TestCase): """ can_delete should be passed to inlineformset factory. """ - response = self.client.get(self.change_url) + holder = Holder.objects.get(dummy=13) + response = self.client.get( + reverse('admin:admin_inlines_holder_change', args=(holder.id,)) + ) inner_formset = response.context['inline_admin_formsets'][0].formset expected = InnerInline.can_delete actual = inner_formset.can_delete @@ -51,13 +54,14 @@ class TestInline(TestCase): """Bug #13174.""" holder = Holder.objects.create(dummy=42) Inner.objects.create(holder=holder, dummy=42, readonly='') - response = self.client.get('/admin/admin_inlines/holder/%i/' - % holder.id) + response = self.client.get( + reverse('admin:admin_inlines_holder_change', args=(holder.id,)) + ) self.assertContains(response, '<label>Inner readonly label:</label>') def test_many_to_many_inlines(self): "Autogenerated many-to-many inlines are displayed correctly (#13407)" - response = self.client.get('/admin/admin_inlines/author/add/') + response = self.client.get(reverse('admin:admin_inlines_author_add')) # The heading for the m2m inline block uses the right text self.assertContains(response, '<h2>Author-book relationships</h2>') # The "add another" label is correct @@ -78,7 +82,7 @@ class TestInline(TestCase): 'max_weight': 0, 'shoppingweakness_set-0-item': item.id, } - response = self.client.post('/admin/admin_inlines/fashionista/add/', data) + response = self.client.post(reverse('admin:admin_inlines_fashionista_add'), data) self.assertEqual(response.status_code, 302) self.assertEqual(len(Fashionista.objects.filter(person__firstname='Imelda')), 1) @@ -95,7 +99,7 @@ class TestInline(TestCase): 'title_set-0-title1': 'a title', 'title_set-0-title2': 'a different title', } - response = self.client.post('/admin/admin_inlines/titlecollection/add/', data) + response = self.client.post(reverse('admin:admin_inlines_titlecollection_add'), data) # Here colspan is "4": two fields (title1 and title2), one hidden field and the delete checkbox. self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>The two titles must be the same</li></ul></td></tr>') @@ -103,14 +107,14 @@ class TestInline(TestCase): """Admin inline `readonly_field` shouldn't invoke parent ModelAdmin callable""" # Identically named callable isn't present in the parent ModelAdmin, # rendering of the add view shouldn't explode - response = self.client.get('/admin/admin_inlines/novel/add/') + response = self.client.get(reverse('admin:admin_inlines_novel_add')) self.assertEqual(response.status_code, 200) # View should have the child inlines section self.assertContains(response, '<div class="inline-group" id="chapter_set-group">') def test_callable_lookup(self): """Admin inline should invoke local callable when its name is listed in readonly_fields""" - response = self.client.get('/admin/admin_inlines/poll/add/') + response = self.client.get(reverse('admin:admin_inlines_poll_add')) self.assertEqual(response.status_code, 200) # Add parent object view should have the child inlines section self.assertContains(response, '<div class="inline-group" id="question_set-group">') @@ -124,11 +128,11 @@ class TestInline(TestCase): using both the stacked and tabular layouts. Ref #8190. """ - response = self.client.get('/admin/admin_inlines/holder4/add/') + response = self.client.get(reverse('admin:admin_inlines_holder4_add')) self.assertContains(response, '<p class="help">Awesome stacked help text is awesome.</p>', 4) self.assertContains(response, '<img src="/static/admin/img/icon-unknown.gif" class="help help-tooltip" width="10" height="10" alt="(Awesome tabular help text is awesome.)" title="Awesome tabular help text is awesome." />', 1) # ReadOnly fields - response = self.client.get('/admin/admin_inlines/capofamiglia/add/') + response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add')) self.assertContains(response, '<img src="/static/admin/img/icon-unknown.gif" class="help help-tooltip" width="10" height="10" alt="(Help text for ReadOnlyInline)" title="Help text for ReadOnlyInline" />', 1) def test_inline_hidden_field_no_column(self): @@ -136,7 +140,7 @@ class TestInline(TestCase): parent = SomeParentModel.objects.create(name='a') SomeChildModel.objects.create(name='b', position='0', parent=parent) SomeChildModel.objects.create(name='c', position='1', parent=parent) - response = self.client.get('/admin/admin_inlines/someparentmodel/%s/' % parent.pk) + response = self.client.get(reverse('admin:admin_inlines_someparentmodel_change', args=(parent.pk,))) self.assertNotContains(response, '<td class="field-position">') self.assertContains(response, ( '<input id="id_somechildmodel_set-1-position" ' @@ -147,7 +151,7 @@ class TestInline(TestCase): Ensure that multiple inlines with related_name='+' have correct form prefixes. Bug #16838. """ - response = self.client.get('/admin/admin_inlines/capofamiglia/add/') + response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add')) self.assertContains(response, '<input type="hidden" name="-1-0-id" id="id_-1-0-id" />', html=True) @@ -173,7 +177,7 @@ class TestInline(TestCase): """ holder = Holder.objects.create(pk=123456789, dummy=42) inner = Inner.objects.create(pk=987654321, holder=holder, dummy=42, readonly='') - response = self.client.get('/admin/admin_inlines/holder/%i/' % holder.id) + response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.id,))) inner_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(inner).pk, inner.pk) self.assertContains(response, inner_shortcut) @@ -185,7 +189,7 @@ class TestInline(TestCase): parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo") child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) child2 = ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent) - response = self.client.get('/admin/admin_inlines/parentmodelwithcustompk/foo/') + response = self.client.get(reverse('admin:admin_inlines_parentmodelwithcustompk_change', args=('foo',))) child1_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child1).pk, child1.pk) child2_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child2).pk, child2.pk) self.assertContains(response, child1_shortcut) @@ -204,7 +208,7 @@ class TestInline(TestCase): 'sighting_set-0-place': 'Zone 51', '_save': 'Save', } - response = self.client.post('/admin/admin_inlines/extraterrestrial/add/', data) + response = self.client.post(reverse('admin:admin_inlines_extraterrestrial_add'), data) self.assertEqual(response.status_code, 302) self.assertEqual(Sighting.objects.filter(et__name='Martian').count(), 1) @@ -218,11 +222,11 @@ class TestInline(TestCase): # The total number of forms will remain the same in either case total_forms_hidden = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="2" />' - response = self.client.get('/admin/admin_inlines/binarytree/add/') + response = self.client.get(reverse('admin:admin_inlines_binarytree_add')) self.assertContains(response, max_forms_input % 3) self.assertContains(response, total_forms_hidden) - response = self.client.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id) + response = self.client.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,))) self.assertContains(response, max_forms_input % 2) self.assertContains(response, total_forms_hidden) @@ -241,7 +245,7 @@ class TestInline(TestCase): min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="2" />' total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="5" />' - request = self.factory.get('/admin/admin_inlines/binarytree/add/') + request = self.factory.get(reverse('admin:admin_inlines_binarytree_add')) request.user = User(username='super', is_superuser=True) response = modeladmin.changeform_view(request) self.assertContains(response, min_forms) @@ -269,20 +273,20 @@ class TestInline(TestCase): min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="%d" />' total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="%d" />' - request = self.factory.get('/admin/admin_inlines/binarytree/add/') + request = self.factory.get(reverse('admin:admin_inlines_binarytree_add')) request.user = User(username='super', is_superuser=True) response = modeladmin.changeform_view(request) self.assertContains(response, min_forms % 2) self.assertContains(response, total_forms % 5) - request = self.factory.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id) + request = self.factory.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,))) request.user = User(username='super', is_superuser=True) response = modeladmin.changeform_view(request, object_id=str(bt_head.id)) self.assertContains(response, min_forms % 5) self.assertContains(response, total_forms % 8) def test_inline_nonauto_noneditable_pk(self): - response = self.client.get('/admin/admin_inlines/author/add/') + response = self.client.get(reverse('admin:admin_inlines_author_add')) self.assertContains(response, '<input id="id_nonautopkbook_set-0-rand_pk" name="nonautopkbook_set-0-rand_pk" type="hidden" />', html=True) @@ -291,7 +295,7 @@ class TestInline(TestCase): html=True) def test_inline_editable_pk(self): - response = self.client.get('/admin/admin_inlines/author/add/') + response = self.client.get(reverse('admin:admin_inlines_author_add')) self.assertContains(response, '<input class="vIntegerField" id="id_editablepkbook_set-0-manual_pk" name="editablepkbook_set-0-manual_pk" type="text" />', html=True, count=1) @@ -302,7 +306,7 @@ class TestInline(TestCase): def test_stacked_inline_edit_form_contains_has_original_class(self): holder = Holder.objects.create(dummy=1) holder.inner_set.create(dummy=1) - response = self.client.get('/admin/admin_inlines/holder/%s/' % holder.pk) + response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.pk,))) self.assertContains( response, '<div class="inline-related has_original" id="inner_set-0">', @@ -323,10 +327,10 @@ class TestInline(TestCase): ('inner4stacked', item1.pk), ('inner4tabular', item2.pk), ) - response = self.client.get('/admin/admin_inlines/holder4/%s/' % holder.pk) + response = self.client.get(reverse('admin:admin_inlines_holder4_change', args=(holder.pk,))) self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model) for model, pk in items: - url = '/admin/admin_inlines/%s/%s/' % (model, pk) + url = reverse('admin:admin_inlines_%s_change' % model, args=(pk,)) self.assertContains(response, '<a href="%s" %s' % (url, INLINE_CHANGELINK_HTML)) def test_inlines_show_change_link_unregistered(self): @@ -334,7 +338,7 @@ class TestInline(TestCase): parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo") ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent) - response = self.client.get('/admin/admin_inlines/parentmodelwithcustompk/foo/') + response = self.client.get(reverse('admin:admin_inlines_parentmodelwithcustompk_change', args=('foo',))) self.assertFalse(response.context['inline_admin_formset'].opts.has_registered_model) self.assertNotContains(response, INLINE_CHANGELINK_HTML) @@ -342,7 +346,7 @@ class TestInline(TestCase): "Inlines `show_change_link` disabled by default." poll = Poll.objects.create(name="New poll") Question.objects.create(poll=poll) - response = self.client.get('/admin/admin_inlines/poll/%s/' % poll.pk) + response = self.client.get(reverse('admin:admin_inlines_poll_change', args=(poll.pk,))) self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model) self.assertNotContains(response, INLINE_CHANGELINK_HTML) @@ -361,7 +365,7 @@ class TestInlineMedia(TestCase): holder = Holder(dummy=13) holder.save() Inner(dummy=42, holder=holder).save() - change_url = '/admin/admin_inlines/holder/%i/' % holder.id + change_url = reverse('admin:admin_inlines_holder_change', args=(holder.id,)) response = self.client.get(change_url) self.assertContains(response, 'my_awesome_admin_scripts.js') @@ -369,7 +373,7 @@ class TestInlineMedia(TestCase): holder = Holder3(dummy=13) holder.save() Inner3(dummy=42, holder=holder).save() - change_url = '/admin/admin_inlines/holder3/%i/' % holder.id + change_url = reverse('admin:admin_inlines_holder3_change', args=(holder.id,)) response = self.client.get(change_url) self.assertContains(response, 'my_awesome_inline_scripts.js') @@ -377,7 +381,7 @@ class TestInlineMedia(TestCase): holder = Holder2(dummy=13) holder.save() Inner2(dummy=42, holder=holder).save() - change_url = '/admin/admin_inlines/holder2/%i/' % holder.id + change_url = reverse('admin:admin_inlines_holder2_change', args=(holder.id,)) response = self.client.get(change_url) self.assertContains(response, 'my_awesome_admin_scripts.js') self.assertContains(response, 'my_awesome_inline_scripts.js') @@ -438,7 +442,7 @@ class TestInlineProtectedOnDelete(TestCase): chapter = Chapter.objects.create(novel=lotr, name='Many Meetings') foot_note = FootNote.objects.create(chapter=chapter, note='yadda yadda') - change_url = '/admin/admin_inlines/novel/%i/' % lotr.id + change_url = reverse('admin:admin_inlines_novel_change', args=(lotr.id,)) response = self.client.get(change_url) data = { 'name': lotr.name, @@ -492,14 +496,14 @@ class TestInlinePermissions(TestCase): author = Author.objects.create(pk=1, name='The Author') book = author.books.create(name='The inline Book') - self.author_change_url = '/admin/admin_inlines/author/%i/' % author.id + self.author_change_url = reverse('admin:admin_inlines_author_change', args=(author.id,)) # Get the ID of the automatically created intermediate model for the Author-Book m2m author_book_auto_m2m_intermediate = Author.books.through.objects.get(author=author, book=book) self.author_book_auto_m2m_intermediate_id = author_book_auto_m2m_intermediate.pk holder = Holder2.objects.create(dummy=13) inner2 = Inner2.objects.create(dummy=42, holder=holder) - self.holder_change_url = '/admin/admin_inlines/holder2/%i/' % holder.id + self.holder_change_url = reverse('admin:admin_inlines_holder2_change', args=(holder.id,)) self.inner2_id = inner2.id self.assertEqual( @@ -507,14 +511,14 @@ class TestInlinePermissions(TestCase): True) def test_inline_add_m2m_noperm(self): - response = self.client.get('/admin/admin_inlines/author/add/') + response = self.client.get(reverse('admin:admin_inlines_author_add')) # No change permission on books, so no inline self.assertNotContains(response, '<h2>Author-book relationships</h2>') self.assertNotContains(response, 'Add another Author-Book Relationship') self.assertNotContains(response, 'id="id_Author_books-TOTAL_FORMS"') def test_inline_add_fk_noperm(self): - response = self.client.get('/admin/admin_inlines/holder2/add/') + response = self.client.get(reverse('admin:admin_inlines_holder2_add')) # No permissions on Inner2s, so no inline self.assertNotContains(response, '<h2>Inner2s</h2>') self.assertNotContains(response, 'Add another Inner2') @@ -537,7 +541,7 @@ class TestInlinePermissions(TestCase): def test_inline_add_m2m_add_perm(self): permission = Permission.objects.get(codename='add_book', content_type=self.book_ct) self.user.user_permissions.add(permission) - response = self.client.get('/admin/admin_inlines/author/add/') + response = self.client.get(reverse('admin:admin_inlines_author_add')) # No change permission on Books, so no inline self.assertNotContains(response, '<h2>Author-book relationships</h2>') self.assertNotContains(response, 'Add another Author-Book Relationship') @@ -546,7 +550,7 @@ class TestInlinePermissions(TestCase): def test_inline_add_fk_add_perm(self): permission = Permission.objects.get(codename='add_inner2', content_type=self.inner_ct) self.user.user_permissions.add(permission) - response = self.client.get('/admin/admin_inlines/holder2/add/') + response = self.client.get(reverse('admin:admin_inlines_holder2_add')) # Add permission on inner2s, so we get the inline self.assertContains(response, '<h2>Inner2s</h2>') self.assertContains(response, 'Add another Inner2') @@ -666,7 +670,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): """ self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/admin_inlines/holder4/add/')) + reverse('admin:admin_inlines_holder4_add'))) inline_id = '#inner4stacked_set-group' rows_length = lambda: len(self.selenium.find_elements_by_css_selector( @@ -682,7 +686,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): def test_delete_stackeds(self): self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/admin_inlines/holder4/add/')) + reverse('admin:admin_inlines_holder4_add'))) inline_id = '#inner4stacked_set-group' rows_length = lambda: len(self.selenium.find_elements_by_css_selector( @@ -707,7 +711,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): """ self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/admin_inlines/profilecollection/add/')) + reverse('admin:admin_inlines_profilecollection_add'))) # Check that there's only one inline to start with and that it has the # correct ID. @@ -764,7 +768,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): def test_delete_inlines(self): self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/admin_inlines/profilecollection/add/')) + reverse('admin:admin_inlines_profilecollection_add'))) # Add a few inlines self.selenium.find_element_by_link_text('Add another Profile').click() @@ -802,7 +806,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): def test_alternating_rows(self): self.admin_login(username='super', password='secret') self.selenium.get('%s%s' % (self.live_server_url, - '/admin/admin_inlines/profilecollection/add/')) + reverse('admin:admin_inlines_profilecollection_add'))) # Add a few inlines self.selenium.find_element_by_link_text('Add another Profile').click() diff --git a/tests/admin_views/customadmin.py b/tests/admin_views/customadmin.py index 7941b7c897..644bbedae7 100644 --- a/tests/admin_views/customadmin.py +++ b/tests/admin_views/customadmin.py @@ -27,7 +27,7 @@ class Admin2(admin.AdminSite): def get_urls(self): return [ - url(r'^my_view/$', self.admin_view(self.my_view)), + url(r'^my_view/$', self.admin_view(self.my_view), name='my_view'), ] + super(Admin2, self).get_urls() def my_view(self, request): diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 7faa2d4e4f..f4a2bc77e7 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -69,11 +69,6 @@ class AdminViewBasicTestCase(TestCase): fixtures = ['admin-views-users.xml', 'admin-views-colors.xml', 'admin-views-fabrics.xml', 'admin-views-books.xml'] - # Store the bit of the URL where the admin is registered as a class - # variable. That way we can test a second AdminSite just by subclassing - # this test case and changing urlbit. - urlbit = 'admin' - def setUp(self): self.client.login(username='super', password='secret') @@ -95,10 +90,9 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """ If you leave off the trailing slash, app should redirect and add it. """ - response = self.client.get('/test_admin/%s/admin_views/article/add' % self.urlbit) - self.assertRedirects(response, - '/test_admin/%s/admin_views/article/add/' % self.urlbit, - status_code=301) + add_url = reverse('admin:admin_views_article_add') + response = self.client.get(add_url[:-1]) + self.assertRedirects(response, add_url, status_code=301) def test_admin_static_template_tag(self): """ @@ -116,12 +110,12 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """ A smoke test to ensure GET on the add_view works. """ - response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_section_add')) self.assertIsInstance(response, TemplateResponse) self.assertEqual(response.status_code, 200) def test_add_with_GET_args(self): - response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit, {'name': 'My Section'}) + response = self.client.get(reverse('admin:admin_views_section_add'), {'name': 'My Section'}) self.assertEqual(response.status_code, 200) self.assertContains(response, 'value="My Section"', msg_prefix="Couldn't find an input with the right value in the response") @@ -130,7 +124,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """ A smoke test to ensure GET on the change_view works. """ - response = self.client.get('/test_admin/%s/admin_views/section/1/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_section_change', args=(1,))) self.assertIsInstance(response, TemplateResponse) self.assertEqual(response.status_code, 200) @@ -140,7 +134,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): #11191) when passing a string as the PK argument for a model with an integer PK field. """ - response = self.client.get('/test_admin/%s/admin_views/section/abc/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_section_change', args=('abc',))) self.assertEqual(response.status_code, 404) def test_basic_inheritance_GET_string_PK(self): @@ -149,7 +143,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): HTTP 404 error, see #19951) when passing a string as the PK argument for a model with an integer PK field. """ - response = self.client.get('/test_admin/%s/admin_views/supervillain/abc/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_supervillain_change', args=('abc',))) self.assertEqual(response.status_code, 404) def test_basic_add_POST(self): @@ -163,7 +157,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): "article_set-INITIAL_FORMS": "0", "article_set-MAX_NUM_FORMS": "0", } - response = self.client.post('/test_admin/%s/admin_views/section/add/' % self.urlbit, post_data) + response = self.client.post(reverse('admin:admin_views_section_add'), post_data) self.assertEqual(response.status_code, 302) # redirect somewhere def test_popup_add_POST(self): @@ -177,7 +171,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): 'date_0': '2010-09-10', 'date_1': '14:55:39', } - response = self.client.post('/test_admin/%s/admin_views/article/add/' % self.urlbit, post_data) + response = self.client.post(reverse('admin:admin_views_article_add'), post_data) self.assertEqual(response.status_code, 200) self.assertContains(response, 'dismissAddRelatedObjectPopup') self.assertContains(response, 'title with a new\\u000Aline') @@ -227,7 +221,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """ A smoke test to ensure POST on edit_view works. """ - response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, self.inline_post_data) + response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), self.inline_post_data) self.assertEqual(response.status_code, 302) # redirect somewhere def test_edit_save_as(self): @@ -243,7 +237,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): "article_set-4-section": "1", "article_set-5-section": "1", }) - response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data) + response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), post_data) self.assertEqual(response.status_code, 302) # redirect somewhere def test_edit_save_as_delete_inline(self): @@ -258,7 +252,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): "article_set-2-DELETE": "1", "article_set-3-section": "1", }) - response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data) + response = self.client.post(reverse('admin:admin_views_section_change', args=(1,)), post_data) self.assertEqual(response.status_code, 302) # started with 3 articles, one was deleted. self.assertEqual(Section.objects.latest('id').article_set.count(), 2) @@ -268,7 +262,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Ensure we can sort on a list_display field that is a callable (column 2 is callable_year in ArticleAdmin) """ - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': 2}) + response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': 2}) self.assertContentBefore(response, 'Oldest content', 'Middle content', "Results of sorting on callable are out of order.") self.assertContentBefore(response, 'Middle content', 'Newest content', @@ -279,7 +273,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Ensure we can sort on a list_display field that is a Model method (column 3 is 'model_year' in ArticleAdmin) """ - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '-3'}) + response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '-3'}) self.assertContentBefore(response, 'Newest content', 'Middle content', "Results of sorting on Model method are out of order.") self.assertContentBefore(response, 'Middle content', 'Oldest content', @@ -290,7 +284,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Ensure we can sort on a list_display field that is a ModelAdmin method (column 4 is 'modeladmin_year' in ArticleAdmin) """ - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '4'}) + response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '4'}) self.assertContentBefore(response, 'Oldest content', 'Middle content', "Results of sorting on ModelAdmin method are out of order.") self.assertContentBefore(response, 'Middle content', 'Newest content', @@ -302,14 +296,14 @@ class AdminViewBasicTest(AdminViewBasicTestCase): method in reverse order (i.e. admin_order_field uses the '-' prefix) (column 6 is 'model_year_reverse' in ArticleAdmin) """ - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '6'}) + response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '6'}) self.assertContentBefore(response, '2009', '2008', "Results of sorting on ModelAdmin method are out of order.") self.assertContentBefore(response, '2008', '2000', "Results of sorting on ModelAdmin method are out of order.") # Let's make sure the ordering is right and that we don't get a # FieldError when we change to descending order - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'o': '-6'}) + response = self.client.get(reverse('admin:admin_views_article_changelist'), {'o': '-6'}) self.assertContentBefore(response, '2000', '2008', "Results of sorting on ModelAdmin method are out of order.") self.assertContentBefore(response, '2008', '2009', @@ -324,14 +318,12 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link3 = reverse('admin:admin_views_person_change', args=(p3.pk,)) # Sort by name, gender - # This hard-codes the URL because it'll fail if it runs against the - # 'admin2' custom admin (which doesn't have the Person model). - response = self.client.get('/test_admin/admin/admin_views/person/', {'o': '1.2'}) + response = self.client.get(reverse('admin:admin_views_person_changelist'), {'o': '1.2'}) self.assertContentBefore(response, link3, link1) self.assertContentBefore(response, link1, link2) # Sort by gender descending, name - response = self.client.get('/test_admin/admin/admin_views/person/', {'o': '-2.1'}) + response = self.client.get(reverse('admin:admin_views_person_changelist'), {'o': '-2.1'}) self.assertContentBefore(response, link2, link3) self.assertContentBefore(response, link3, link1) @@ -349,9 +341,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link2 = reverse('admin:admin_views_person_change', args=(p2.pk,)) link3 = reverse('admin:admin_views_person_change', args=(p3.pk,)) - # This hard-codes the URL because it'll fail if it runs against the - # 'admin2' custom admin (which doesn't have the Person model). - response = self.client.get('/test_admin/admin/admin_views/person/', {}) + response = self.client.get(reverse('admin:admin_views_person_changelist'), {}) self.assertContentBefore(response, link3, link2) self.assertContentBefore(response, link2, link1) @@ -363,11 +353,11 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link1 = reverse('admin:admin_views_language_change', args=(quote(l1.pk),)) link2 = reverse('admin:admin_views_language_change', args=(quote(l2.pk),)) - response = self.client.get('/test_admin/admin/admin_views/language/', {}) + response = self.client.get(reverse('admin:admin_views_language_changelist'), {}) self.assertContentBefore(response, link2, link1) # Test we can override with query string - response = self.client.get('/test_admin/admin/admin_views/language/', {'o': '-1'}) + response = self.client.get(reverse('admin:admin_views_language_changelist'), {'o': '-1'}) self.assertContentBefore(response, link1, link2) def test_change_list_sorting_override_model_admin(self): @@ -378,7 +368,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link1 = reverse('admin:admin_views_podcast_change', args=(p1.pk,)) link2 = reverse('admin:admin_views_podcast_change', args=(p2.pk,)) - response = self.client.get('/test_admin/admin/admin_views/podcast/', {}) + response = self.client.get(reverse('admin:admin_views_podcast_changelist'), {}) self.assertContentBefore(response, link1, link2) def test_multiple_sort_same_field(self): @@ -390,7 +380,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link1 = reverse('admin:admin_views_podcast_change', args=(quote(p1.pk),)) link2 = reverse('admin:admin_views_podcast_change', args=(quote(p2.pk),)) - response = self.client.get('/test_admin/admin/admin_views/podcast/', {}) + response = self.client.get(reverse('admin:admin_views_podcast_changelist'), {}) self.assertContentBefore(response, link1, link2) p1 = ComplexSortedPerson.objects.create(name="Bob", age=10) @@ -398,7 +388,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): link1 = reverse('admin:admin_views_complexsortedperson_change', args=(p1.pk,)) link2 = reverse('admin:admin_views_complexsortedperson_change', args=(p2.pk,)) - response = self.client.get('/test_admin/admin/admin_views/complexsortedperson/', {}) + response = self.client.get(reverse('admin:admin_views_complexsortedperson_changelist'), {}) # Should have 5 columns (including action checkbox col) self.assertContains(response, '<th scope="col"', count=5) @@ -425,7 +415,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): model.objects.create(stuff='The Last Item', order=3) model.objects.create(stuff='The First Item', order=1) model.objects.create(stuff='The Middle Item', order=2) - response = self.client.get('/test_admin/admin/admin_views/%s/' % url, {}) + response = self.client.get(reverse('admin:admin_views_%s_changelist' % url), {}) self.assertEqual(response.status_code, 200) # Should have 3 columns including action checkbox col. self.assertContains(response, '<th scope="col"', count=3, msg_prefix=url) @@ -441,7 +431,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """Ensure admin changelist filters do not contain objects excluded via limit_choices_to. This also tests relation-spanning filters (e.g. 'color__value'). """ - response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_thing_changelist')) self.assertEqual(response.status_code, 200) self.assertContains(response, '<div id="changelist-filter">', msg_prefix="Expected filter not found in changelist view") @@ -449,8 +439,8 @@ class AdminViewBasicTest(AdminViewBasicTestCase): msg_prefix="Changelist filter not correctly limited by limit_choices_to") def test_relation_spanning_filters(self): - response = self.client.get('/test_admin/%s/admin_views/chapterxtra1/' % - self.urlbit) + changelist_url = reverse('admin:admin_views_chapterxtra1_changelist') + response = self.client.get(changelist_url) self.assertEqual(response.status_code, 200) self.assertContains(response, '<div id="changelist-filter">') filters = { @@ -479,9 +469,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): # ensure filter link exists self.assertContains(response, '<a href="?%s">' % query_string) # ensure link works - filtered_response = self.client.get( - '/test_admin/%s/admin_views/chapterxtra1/?%s' % ( - self.urlbit, query_string)) + filtered_response = self.client.get('%s?%s' % (changelist_url, query_string)) self.assertEqual(filtered_response.status_code, 200) # ensure changelist contains only valid objects for obj in filtered_response.context['cl'].queryset.all(): @@ -489,38 +477,40 @@ class AdminViewBasicTest(AdminViewBasicTestCase): def test_incorrect_lookup_parameters(self): """Ensure incorrect lookup parameters are handled gracefully.""" - response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'notarealfield': '5'}) - self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) + changelist_url = reverse('admin:admin_views_thing_changelist') + response = self.client.get(changelist_url, {'notarealfield': '5'}) + self.assertRedirects(response, '%s?e=1' % changelist_url) # Spanning relationships through a nonexistent related object (Refs #16716) - response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'notarealfield__whatever': '5'}) - self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) + response = self.client.get(changelist_url, {'notarealfield__whatever': '5'}) + self.assertRedirects(response, '%s?e=1' % changelist_url) - response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'color__id__exact': 'StringNotInteger!'}) - self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) + response = self.client.get(changelist_url, {'color__id__exact': 'StringNotInteger!'}) + self.assertRedirects(response, '%s?e=1' % changelist_url) # Regression test for #18530 - response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit, {'pub_date__gte': 'foo'}) - self.assertRedirects(response, '/test_admin/%s/admin_views/thing/?e=1' % self.urlbit) + response = self.client.get(changelist_url, {'pub_date__gte': 'foo'}) + self.assertRedirects(response, '%s?e=1' % changelist_url) def test_isnull_lookups(self): """Ensure is_null is handled correctly.""" Article.objects.create(title="I Could Go Anywhere", content="Versatile", date=datetime.datetime.now()) - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit) + changelist_url = reverse('admin:admin_views_article_changelist') + response = self.client.get(changelist_url) self.assertContains(response, '4 articles') - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'false'}) + response = self.client.get(changelist_url, {'section__isnull': 'false'}) self.assertContains(response, '3 articles') - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': '0'}) + response = self.client.get(changelist_url, {'section__isnull': '0'}) self.assertContains(response, '3 articles') - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': 'true'}) + response = self.client.get(changelist_url, {'section__isnull': 'true'}) self.assertContains(response, '1 article') - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'section__isnull': '1'}) + response = self.client.get(changelist_url, {'section__isnull': '1'}) self.assertContains(response, '1 article') def test_logout_and_password_change_URLs(self): - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit) - self.assertContains(response, '<a href="/test_admin/%s/logout/">' % self.urlbit) - self.assertContains(response, '<a href="/test_admin/%s/password_change/">' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_article_changelist')) + self.assertContains(response, '<a href="%s">' % reverse('admin:logout')) + self.assertContains(response, '<a href="%s">' % reverse('admin:password_change')) def test_named_group_field_choices_change_list(self): """ @@ -528,9 +518,9 @@ class AdminViewBasicTest(AdminViewBasicTestCase): for rows corresponding to instances of a model in which a named group has been used in the choices option of a field. """ - link1 = reverse('admin:admin_views_fabric_change', args=(1,), current_app=self.urlbit) - link2 = reverse('admin:admin_views_fabric_change', args=(2,), current_app=self.urlbit) - response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit) + link1 = reverse('admin:admin_views_fabric_change', args=(1,)) + link2 = reverse('admin:admin_views_fabric_change', args=(2,)) + response = self.client.get(reverse('admin:admin_views_fabric_changelist')) fail_msg = "Changelist table isn't showing the right human-readable values set by a model field 'choices' option named group." self.assertContains(response, '<a href="%s">Horizontal</a>' % link1, msg_prefix=fail_msg, html=True) self.assertContains(response, '<a href="%s">Vertical</a>' % link2, msg_prefix=fail_msg, html=True) @@ -540,7 +530,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Ensures the filter UI shows correctly when at least one named group has been used in the choices option of a model field. """ - response = self.client.get('/test_admin/%s/admin_views/fabric/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_fabric_changelist')) fail_msg = "Changelist filter isn't showing options contained inside a model field 'choices' option named group." self.assertContains(response, '<div id="changelist-filter">') self.assertContains(response, @@ -550,10 +540,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): def test_change_list_null_boolean_display(self): Post.objects.create(public=None) - # This hard-codes the URl because it'll fail if it runs - # against the 'admin2' custom admin (which doesn't have the - # Post model). - response = self.client.get("/test_admin/admin/admin_views/post/") + response = self.client.get(reverse('admin:admin_views_post_changelist')) self.assertContains(response, 'icon-unknown.gif') def test_i18n_language_non_english_default(self): @@ -563,7 +550,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): is English. See #13388 and #3594 for more details. """ with self.settings(LANGUAGE_CODE='fr'), translation.override('en-us'): - response = self.client.get('/test_admin/admin/jsi18n/') + response = self.client.get(reverse('admin:jsi18n')) self.assertNotContains(response, 'Choisir une heure') def test_i18n_language_non_english_fallback(self): @@ -572,7 +559,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): in cases where the selected language cannot be found. """ with self.settings(LANGUAGE_CODE='fr'), translation.override('none'): - response = self.client.get('/test_admin/admin/jsi18n/') + response = self.client.get(reverse('admin:jsi18n')) self.assertContains(response, 'Choisir une heure') def test_L10N_deactivated(self): @@ -581,87 +568,91 @@ class AdminViewBasicTest(AdminViewBasicTestCase): return localized date/time formats. Refs #14824. """ with self.settings(LANGUAGE_CODE='ru', USE_L10N=False), translation.override('none'): - response = self.client.get('/test_admin/admin/jsi18n/') + response = self.client.get(reverse('admin:jsi18n')) self.assertNotContains(response, '%d.%m.%Y %H:%M:%S') self.assertContains(response, '%Y-%m-%d %H:%M:%S') def test_disallowed_filtering(self): with patch_logger('django.security.DisallowedModelAdminLookup', 'error') as calls: - response = self.client.get("/test_admin/admin/admin_views/album/?owner__email__startswith=fuzzy") + response = self.client.get( + "%s?owner__email__startswith=fuzzy" % reverse('admin:admin_views_album_changelist') + ) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) # Filters are allowed if explicitly included in list_filter - response = self.client.get("/test_admin/admin/admin_views/thing/?color__value__startswith=red") + response = self.client.get("%s?color__value__startswith=red" % reverse('admin:admin_views_thing_changelist')) self.assertEqual(response.status_code, 200) - response = self.client.get("/test_admin/admin/admin_views/thing/?color__value=red") + response = self.client.get("%s?color__value=red" % reverse('admin:admin_views_thing_changelist')) self.assertEqual(response.status_code, 200) # Filters should be allowed if they involve a local field without the # need to whitelist them in list_filter or date_hierarchy. - response = self.client.get("/test_admin/admin/admin_views/person/?age__gt=30") + response = self.client.get("%s?age__gt=30" % reverse('admin:admin_views_person_changelist')) self.assertEqual(response.status_code, 200) e1 = Employee.objects.create(name='Anonymous', gender=1, age=22, alive=True, code='123') e2 = Employee.objects.create(name='Visitor', gender=2, age=19, alive=True, code='124') WorkHour.objects.create(datum=datetime.datetime.now(), employee=e1) WorkHour.objects.create(datum=datetime.datetime.now(), employee=e2) - response = self.client.get("/test_admin/admin/admin_views/workhour/") + response = self.client.get(reverse('admin:admin_views_workhour_changelist')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'employee__person_ptr__exact') - response = self.client.get("/test_admin/admin/admin_views/workhour/?employee__person_ptr__exact=%d" % e1.pk) + response = self.client.get("%s?employee__person_ptr__exact=%d" % ( + reverse('admin:admin_views_workhour_changelist'), e1.pk) + ) self.assertEqual(response.status_code, 200) def test_disallowed_to_field(self): with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: - response = self.client.get("/test_admin/admin/admin_views/section/", {TO_FIELD_VAR: 'missing_field'}) + response = self.client.get(reverse('admin:admin_views_section_changelist'), {TO_FIELD_VAR: 'missing_field'}) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) # Specifying a field that is not referred by any other model registered # to this admin site should raise an exception. with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: - response = self.client.get("/test_admin/admin/admin_views/section/", {TO_FIELD_VAR: 'name'}) + response = self.client.get(reverse('admin:admin_views_section_changelist'), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) # #23839 - Primary key should always be allowed, even if the referenced model isn't registered. - response = self.client.get("/test_admin/admin/admin_views/notreferenced/", {TO_FIELD_VAR: 'id'}) + response = self.client.get(reverse('admin:admin_views_notreferenced_changelist'), {TO_FIELD_VAR: 'id'}) self.assertEqual(response.status_code, 200) # #23915 - Specifying a field referenced by another model though a m2m should be allowed. - response = self.client.get("/test_admin/admin/admin_views/recipe/", {TO_FIELD_VAR: 'rname'}) + response = self.client.get(reverse('admin:admin_views_recipe_changelist'), {TO_FIELD_VAR: 'rname'}) self.assertEqual(response.status_code, 200) # #23604, #23915 - Specifying a field referenced through a reverse m2m relationship should be allowed. - response = self.client.get("/test_admin/admin/admin_views/ingredient/", {TO_FIELD_VAR: 'iname'}) + response = self.client.get(reverse('admin:admin_views_ingredient_changelist'), {TO_FIELD_VAR: 'iname'}) self.assertEqual(response.status_code, 200) # #23329 - Specifying a field that is not referred by any other model directly registered # to this admin site but registered through inheritance should be allowed. - response = self.client.get("/test_admin/admin/admin_views/referencedbyparent/", {TO_FIELD_VAR: 'name'}) + response = self.client.get(reverse('admin:admin_views_referencedbyparent_changelist'), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 200) # #23431 - Specifying a field that is only referred to by a inline of a registered # model should be allowed. - response = self.client.get("/test_admin/admin/admin_views/referencedbyinline/", {TO_FIELD_VAR: 'name'}) + response = self.client.get(reverse('admin:admin_views_referencedbyinline_changelist'), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 200) # We also want to prevent the add, change, and delete views from # leaking a disallowed field value. with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: - response = self.client.post("/test_admin/admin/admin_views/section/add/", {TO_FIELD_VAR: 'name'}) + response = self.client.post(reverse('admin:admin_views_section_add'), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) section = Section.objects.create() with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: - response = self.client.post("/test_admin/admin/admin_views/section/%d/" % section.pk, {TO_FIELD_VAR: 'name'}) + response = self.client.post(reverse('admin:admin_views_section_change', args=(section.pk,)), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) with patch_logger('django.security.DisallowedModelAdminToField', 'error') as calls: - response = self.client.post("/test_admin/admin/admin_views/section/%d/delete/" % section.pk, {TO_FIELD_VAR: 'name'}) + response = self.client.post(reverse('admin:admin_views_section_delete', args=(section.pk,)), {TO_FIELD_VAR: 'name'}) self.assertEqual(response.status_code, 400) self.assertEqual(len(calls), 1) @@ -672,7 +663,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): can break. """ # Filters should be allowed if they are defined on a ForeignKey pointing to this model - response = self.client.get("/test_admin/admin/admin_views/inquisition/?leader__name=Palin&leader__age=27") + response = self.client.get("%s?leader__name=Palin&leader__age=27" % reverse('admin:admin_views_inquisition_changelist')) self.assertEqual(response.status_code, 200) def test_popup_dismiss_related(self): @@ -680,7 +671,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Regression test for ticket 20664 - ensure the pk is properly quoted. """ actor = Actor.objects.create(name="Palin", age=27) - response = self.client.get("/test_admin/admin/admin_views/actor/?%s" % IS_POPUP_VAR) + response = self.client.get("%s?%s" % (reverse('admin:admin_views_actor_changelist'), IS_POPUP_VAR)) self.assertContains(response, "opener.dismissRelatedLookupPopup(window, '%s')" % actor.pk) def test_hide_change_password(self): @@ -693,7 +684,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): user.set_unusable_password() user.save() - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) self.assertNotContains(response, reverse('admin:password_change'), msg_prefix='The "change password" link should not be displayed if a user does not have a usable password.') @@ -704,8 +695,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Refs #10057. """ instance = UndeletableObject.objects.create(name='foo') - response = self.client.get('/test_admin/%s/admin_views/undeletableobject/%d/' % - (self.urlbit, instance.pk)) + response = self.client.get(reverse('admin:admin_views_undeletableobject_change', args=(instance.pk,))) self.assertNotContains(response, 'deletelink') def test_allows_attributeerror_to_bubble_up(self): @@ -719,7 +709,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): """ Simple.objects.create() with self.assertRaises(AttributeError): - self.client.get('/test_admin/%s/admin_views/simple/' % self.urlbit) + self.client.get(reverse('admin:admin_views_simple_changelist')) def test_changelist_with_no_change_url(self): """ @@ -729,7 +719,7 @@ class AdminViewBasicTest(AdminViewBasicTestCase): Regression test for #20934 """ UnchangeableObject.objects.create() - response = self.client.get('/test_admin/admin/admin_views/unchangeableobject/') + response = self.client.get(reverse('admin:admin_views_unchangeableobject_changelist')) self.assertEqual(response.status_code, 200) # Check the format of the shown object -- shouldn't contain a change link self.assertContains(response, '<th class="field-__str__">UnchangeableObject object</th>', html=True) @@ -817,7 +807,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): Ensure that the admin/change_form.html template uses block.super in the bodyclass block. """ - response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_section_add')) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_template_change_password(self): @@ -826,7 +816,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): super in the bodyclass block. """ user = User.objects.get(username='super') - response = self.client.get('/test_admin/%s/auth/user/%s/password/' % (self.urlbit, user.id)) + response = self.client.get(reverse('admin:auth_user_password_change', args=(user.id,))) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_template_index(self): @@ -834,7 +824,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): Ensure that the admin/index.html template uses block.super in the bodyclass block. """ - response = self.client.get('/test_admin/%s/' % self.urlbit) + response = self.client.get(reverse('admin:index')) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_change_list(self): @@ -842,7 +832,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): Ensure that the admin/change_list.html' template uses block.super in the bodyclass block. """ - response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_article_changelist')) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_template_login(self): @@ -851,7 +841,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): bodyclass block. """ self.client.logout() - response = self.client.get('/test_admin/%s/login/' % self.urlbit) + response = self.client.get(reverse('admin:login')) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_template_delete_confirmation(self): @@ -860,7 +850,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): block.super in the bodyclass block. """ group = Group.objects.create(name="foogroup") - response = self.client.get('/test_admin/%s/auth/group/%s/delete/' % (self.urlbit, group.id)) + response = self.client.get(reverse('admin:auth_group_delete', args=(group.id,))) self.assertContains(response, 'bodyclass_consistency_check ') def test_extended_bodyclass_template_delete_selected_confirmation(self): @@ -875,7 +865,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): 'index': '0', '_selected_action': group.id } - response = self.client.post('/test_admin/%s/auth/group/' % (self.urlbit), post_data) + response = self.client.post(reverse('admin:auth_group_changelist'), post_data) self.assertEqual(response.context['site_header'], 'Django administration') self.assertContains(response, 'bodyclass_consistency_check ') @@ -884,7 +874,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): Ensure that one can use a custom template to render an admin filter. Refs #17515. """ - response = self.client.get("/test_admin/admin/admin_views/color2/") + response = self.client.get(reverse('admin:admin_views_color2_changelist')) self.assertTemplateUsed(response, 'custom_filter_template.html') @@ -892,7 +882,7 @@ class AdminCustomTemplateTests(AdminViewBasicTestCase): ROOT_URLCONF="admin_views.urls") class AdminViewFormUrlTest(TestCase): fixtures = ["admin-views-users.xml"] - urlbit = "admin3" + current_app = "admin3" def setUp(self): self.client.login(username='super', password='secret') @@ -901,7 +891,9 @@ class AdminViewFormUrlTest(TestCase): """ Tests whether change_view has form_url in response.context """ - response = self.client.get('/test_admin/%s/admin_views/section/1/' % self.urlbit) + response = self.client.get( + reverse('admin:admin_views_section_change', args=(1,), current_app=self.current_app) + ) self.assertIn('form_url', response.context, msg='form_url not present in response.context') self.assertEqual(response.context['form_url'], 'pony') @@ -912,7 +904,10 @@ class AdminViewFormUrlTest(TestCase): Usually, the initial value is set via the GET params. """ - response = self.client.get('/test_admin/%s/admin_views/restaurant/add/' % self.urlbit, {'name': 'test_value'}) + response = self.client.get( + reverse('admin:admin_views_restaurant_add', current_app=self.current_app), + {'name': 'test_value'} + ) # this would be the usual behaviour self.assertNotContains(response, 'value="test_value"') # this is the overridden behaviour @@ -934,8 +929,7 @@ class AdminJavaScriptTest(TestCase): Refs #17521. """ with override_settings(DEBUG=False): - response = self.client.get( - '/test_admin/%s/admin_views/section/add/' % 'admin') + response = self.client.get(reverse('admin:admin_views_section_add')) self.assertNotContains(response, 'jquery.js') self.assertContains(response, 'jquery.min.js') self.assertNotContains(response, 'prepopulate.js') @@ -947,8 +941,7 @@ class AdminJavaScriptTest(TestCase): self.assertNotContains(response, 'inlines.js') self.assertContains(response, 'inlines.min.js') with override_settings(DEBUG=True): - response = self.client.get( - '/test_admin/%s/admin_views/section/add/' % 'admin') + response = self.client.get(reverse('admin:admin_views_section_add')) self.assertContains(response, 'jquery.js') self.assertNotContains(response, 'jquery.min.js') self.assertContains(response, 'prepopulate.js') @@ -972,7 +965,7 @@ class SaveAsTests(TestCase): def test_save_as_duplication(self): """Ensure save as actually creates a new person""" post_data = {'_saveasnew': '', 'name': 'John M', 'gender': 1, 'age': 42} - self.client.post('/test_admin/admin/admin_views/person/1/', post_data) + self.client.post(reverse('admin:admin_views_person_change', args=(1,)), post_data) self.assertEqual(len(Person.objects.filter(name='John M')), 1) self.assertEqual(len(Person.objects.filter(id=1)), 1) @@ -982,24 +975,24 @@ class SaveAsTests(TestCase): invalid data aside save_as_new will not show us a form to overwrite the initial model. """ - response = self.client.get('/test_admin/admin/admin_views/person/1/') + change_url = reverse('admin:admin_views_person_change', args=(1,)) + response = self.client.get(change_url) self.assertTrue(response.context['save_as']) post_data = {'_saveasnew': '', 'name': 'John M', 'gender': 3, 'alive': 'checked'} - response = self.client.post('/test_admin/admin/admin_views/person/1/', post_data) - self.assertEqual(response.context['form_url'], '/test_admin/admin/admin_views/person/add/') + response = self.client.post(change_url, post_data) + self.assertEqual(response.context['form_url'], reverse('admin:admin_views_person_add')) @override_settings(ROOT_URLCONF="admin_views.urls") class CustomModelAdminTest(AdminViewBasicTestCase): - urlbit = "admin2" def test_custom_admin_site_login_form(self): self.client.logout() - response = self.client.get('/test_admin/admin2/', follow=True) + response = self.client.get(reverse('admin2:index'), follow=True) self.assertIsInstance(response, TemplateResponse) self.assertEqual(response.status_code, 200) - login = self.client.post('/test_admin/admin2/login/', { - REDIRECT_FIELD_NAME: '/test_admin/admin2/', + login = self.client.post(reverse('admin2:login'), { + REDIRECT_FIELD_NAME: reverse('admin2:index'), 'username': 'customform', 'password': 'secret', }, follow=True) @@ -1009,20 +1002,20 @@ class CustomModelAdminTest(AdminViewBasicTestCase): def test_custom_admin_site_login_template(self): self.client.logout() - response = self.client.get('/test_admin/admin2/', follow=True) + response = self.client.get(reverse('admin2:index'), follow=True) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/login.html') self.assertContains(response, 'Hello from a custom login template') def test_custom_admin_site_logout_template(self): - response = self.client.get('/test_admin/admin2/logout/') + response = self.client.get(reverse('admin2:logout')) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/logout.html') self.assertContains(response, 'Hello from a custom logout template') def test_custom_admin_site_index_view_and_template(self): try: - response = self.client.get('/test_admin/admin2/') + response = self.client.get(reverse('admin2:index')) except TypeError: self.fail('AdminSite.index_template should accept a list of template paths') self.assertIsInstance(response, TemplateResponse) @@ -1030,39 +1023,41 @@ class CustomModelAdminTest(AdminViewBasicTestCase): self.assertContains(response, 'Hello from a custom index template *bar*') def test_custom_admin_site_app_index_view_and_template(self): - response = self.client.get('/test_admin/admin2/admin_views/') + response = self.client.get(reverse('admin2:app_list', args=('admin_views',))) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/app_index.html') self.assertContains(response, 'Hello from a custom app_index template') def test_custom_admin_site_password_change_template(self): - response = self.client.get('/test_admin/admin2/password_change/') + response = self.client.get(reverse('admin2:password_change')) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/password_change_form.html') self.assertContains(response, 'Hello from a custom password change form template') def test_custom_admin_site_password_change_with_extra_context(self): - response = self.client.get('/test_admin/admin2/password_change/') + response = self.client.get(reverse('admin2:password_change')) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/password_change_form.html') self.assertContains(response, 'eggs') def test_custom_admin_site_password_change_done_template(self): - response = self.client.get('/test_admin/admin2/password_change/done/') + response = self.client.get(reverse('admin2:password_change_done')) self.assertIsInstance(response, TemplateResponse) self.assertTemplateUsed(response, 'custom_admin/password_change_done.html') self.assertContains(response, 'Hello from a custom password change done template') def test_custom_admin_site_view(self): self.client.login(username='super', password='secret') - response = self.client.get('/test_admin/%s/my_view/' % self.urlbit) + response = self.client.get(reverse('admin2:my_view')) self.assertEqual(response.content, b"Django is a magical pony!") def test_pwd_change_custom_template(self): self.client.login(username='super', password='secret') su = User.objects.get(username='super') try: - response = self.client.get('/test_admin/admin4/auth/user/%s/password/' % su.pk) + response = self.client.get( + reverse('admin4:auth_user_password_change', args=(su.pk,)) + ) except TypeError: self.fail('ModelAdmin.change_user_password_template should accept a list of template paths') self.assertEqual(response.status_code, 200) @@ -1111,48 +1106,49 @@ class AdminViewPermissionsTest(TestCase): get_permission_codename('delete', Section._meta))) # login POST dicts + self.index_url = reverse('admin:index') self.super_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'super', 'password': 'secret', } self.super_email_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'super@example.com', 'password': 'secret', } self.super_email_bad_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'super@example.com', 'password': 'notsecret', } self.adduser_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'adduser', 'password': 'secret', } self.changeuser_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'changeuser', 'password': 'secret', } self.deleteuser_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'deleteuser', 'password': 'secret', } self.nostaff_login = { - REDIRECT_FIELD_NAME: '/test_admin/has_permission_admin/', + REDIRECT_FIELD_NAME: reverse('has_permission_admin:index'), 'username': 'nostaff', 'password': 'secret', } self.joepublic_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'username': 'joepublic', 'password': 'secret', } self.no_username_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: self.index_url, 'password': 'secret', } @@ -1164,17 +1160,17 @@ class AdminViewPermissionsTest(TestCase): Unsuccessful attempts will continue to render the login page with a 200 status code. """ - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) # Super User - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.super_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Test if user enters email address - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.super_email_login) self.assertContains(login, ERROR_MESSAGE) @@ -1188,38 +1184,38 @@ class AdminViewPermissionsTest(TestCase): self.assertContains(login, ERROR_MESSAGE) # Add User - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.adduser_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Change User - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.changeuser_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Delete User - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.deleteuser_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Regular User should not be able to login. - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.joepublic_login) self.assertEqual(login.status_code, 200) self.assertContains(login, ERROR_MESSAGE) # Requests without username should not return 500 errors. - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) login = self.client.post(login_url, self.no_username_login) self.assertEqual(login.status_code, 200) @@ -1228,37 +1224,37 @@ class AdminViewPermissionsTest(TestCase): def test_login_has_permission(self): # Regular User should not be able to login. - response = self.client.get('/test_admin/has_permission_admin/') + response = self.client.get(reverse('has_permission_admin:index')) self.assertEqual(response.status_code, 302) - login = self.client.post('/test_admin/has_permission_admin/login/', self.joepublic_login) + login = self.client.post(reverse('has_permission_admin:login'), self.joepublic_login) self.assertEqual(login.status_code, 200) self.assertContains(login, 'permission denied') # User with permissions should be able to login. - response = self.client.get('/test_admin/has_permission_admin/') + response = self.client.get(reverse('has_permission_admin:index')) self.assertEqual(response.status_code, 302) - login = self.client.post('/test_admin/has_permission_admin/login/', self.nostaff_login) - self.assertRedirects(login, '/test_admin/has_permission_admin/') + login = self.client.post(reverse('has_permission_admin:login'), self.nostaff_login) + self.assertRedirects(login, reverse('has_permission_admin:index')) self.assertFalse(login.context) - self.client.get('/test_admin/has_permission_admin/logout/') + self.client.get(reverse('has_permission_admin:logout')) # Staff should be able to login. - response = self.client.get('/test_admin/has_permission_admin/') + response = self.client.get(reverse('has_permission_admin:index')) self.assertEqual(response.status_code, 302) - login = self.client.post('/test_admin/has_permission_admin/login/', { - REDIRECT_FIELD_NAME: '/test_admin/has_permission_admin/', + login = self.client.post(reverse('has_permission_admin:login'), { + REDIRECT_FIELD_NAME: reverse('has_permission_admin:index'), 'username': 'deleteuser', 'password': 'secret', }) - self.assertRedirects(login, '/test_admin/has_permission_admin/') + self.assertRedirects(login, reverse('has_permission_admin:index')) self.assertFalse(login.context) - self.client.get('/test_admin/has_permission_admin/logout/') + self.client.get(reverse('has_permission_admin:logout')) def test_login_successfully_redirects_to_original_URL(self): - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) query_string = 'the-answer=42' - redirect_url = '/test_admin/admin/?%s' % query_string + redirect_url = '%s?%s' % (self.index_url, query_string) new_next = {REDIRECT_FIELD_NAME: redirect_url} post_data = self.super_login.copy() post_data.pop(REDIRECT_FIELD_NAME) @@ -1269,14 +1265,14 @@ class AdminViewPermissionsTest(TestCase): def test_double_login_is_not_allowed(self): """Regression test for #19327""" - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertEqual(response.status_code, 302) # Establish a valid admin session login = self.client.post(login_url, self.super_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) # Logging in with non-admin user fails @@ -1286,67 +1282,67 @@ class AdminViewPermissionsTest(TestCase): # Establish a valid admin session login = self.client.post(login_url, self.super_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) # Logging in with admin user while already logged in login = self.client.post(login_url, self.super_login) - self.assertRedirects(login, '/test_admin/admin/') + self.assertRedirects(login, self.index_url) self.assertFalse(login.context) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_add_view(self): """Test add view restricts access and actually adds items.""" - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) add_dict = {'title': 'Døm ikke', 'content': '<p>great article</p>', 'date_0': '2008-03-18', 'date_1': '10:54:39', 'section': 1} # Change User should not have access to add articles - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.changeuser_login) # make sure the view removes test cookie self.assertEqual(self.client.session.test_cookie_worked(), False) - response = self.client.get('/test_admin/admin/admin_views/article/add/') + response = self.client.get(reverse('admin:admin_views_article_add')) self.assertEqual(response.status_code, 403) # Try POST just to make sure - post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict) + post = self.client.post(reverse('admin:admin_views_article_add'), add_dict) self.assertEqual(post.status_code, 403) self.assertEqual(Article.objects.all().count(), 3) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Add user may login and POST to add view, then redirect to admin root - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.adduser_login) - addpage = self.client.get('/test_admin/admin/admin_views/article/add/') - change_list_link = '› <a href="/test_admin/admin/admin_views/article/">Articles</a>' + addpage = self.client.get(reverse('admin:admin_views_article_add')) + change_list_link = '› <a href="%s">Articles</a>' % reverse('admin:admin_views_article_changelist') self.assertNotContains(addpage, change_list_link, msg_prefix='User restricted to add permission is given link to change list view in breadcrumbs.') - post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict) - self.assertRedirects(post, '/test_admin/admin/') + post = self.client.post(reverse('admin:admin_views_article_add'), add_dict) + self.assertRedirects(post, self.index_url) self.assertEqual(Article.objects.all().count(), 4) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Greetings from a created object') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Super can add too, but is redirected to the change list view - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.super_login) - addpage = self.client.get('/test_admin/admin/admin_views/article/add/') + addpage = self.client.get(reverse('admin:admin_views_article_add')) self.assertContains(addpage, change_list_link, msg_prefix='Unrestricted user is not given link to change list view in breadcrumbs.') - post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict) - self.assertRedirects(post, '/test_admin/admin/admin_views/article/') + post = self.client.post(reverse('admin:admin_views_article_add'), add_dict) + self.assertRedirects(post, reverse('admin:admin_views_article_changelist')) self.assertEqual(Article.objects.all().count(), 5) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # 8509 - if a normal user is already logged in, it is possible # to change user into the superuser without error self.client.login(username='joepublic', password='secret') # Check and make sure that if user expires, data still persists - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.super_login) # make sure the view removes test cookie self.assertEqual(self.client.session.test_cookie_worked(), False) @@ -1354,97 +1350,101 @@ class AdminViewPermissionsTest(TestCase): def test_change_view(self): """Change view should restrict access and allow users to edit items.""" - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) change_dict = {'title': 'Ikke fordømt', 'content': '<p>edited article</p>', 'date_0': '2008-03-18', 'date_1': '10:54:39', 'section': 1} + article_change_url = reverse('admin:admin_views_article_change', args=(1,)) + article_changelist_url = reverse('admin:admin_views_article_changelist') # add user should not be able to view the list of article or change any of them - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.adduser_login) - response = self.client.get('/test_admin/admin/admin_views/article/') + response = self.client.get(article_changelist_url) self.assertEqual(response.status_code, 403) - response = self.client.get('/test_admin/admin/admin_views/article/1/') + response = self.client.get(article_change_url) self.assertEqual(response.status_code, 403) - post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict) + post = self.client.post(article_change_url, change_dict) self.assertEqual(post.status_code, 403) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # change user can view all items and edit them - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.changeuser_login) - response = self.client.get('/test_admin/admin/admin_views/article/') + response = self.client.get(article_changelist_url) self.assertEqual(response.status_code, 200) - response = self.client.get('/test_admin/admin/admin_views/article/1/') + response = self.client.get(article_change_url) self.assertEqual(response.status_code, 200) - post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict) - self.assertRedirects(post, '/test_admin/admin/admin_views/article/') + post = self.client.post(article_change_url, change_dict) + self.assertRedirects(post, article_changelist_url) self.assertEqual(Article.objects.get(pk=1).content, '<p>edited article</p>') # one error in form should produce singular error message, multiple errors plural change_dict['title'] = '' - post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict) + post = self.client.post(article_change_url, change_dict) self.assertContains(post, 'Please correct the error below.', msg_prefix='Singular error message not found in response to post with one error') change_dict['content'] = '' - post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict) + post = self.client.post(article_change_url, change_dict) self.assertContains(post, 'Please correct the errors below.', msg_prefix='Plural error message not found in response to post with multiple errors') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Test redirection when using row-level change permissions. Refs #11513. - RowLevelChangePermissionModel.objects.create(id=1, name="odd id") - RowLevelChangePermissionModel.objects.create(id=2, name="even id") + r1 = RowLevelChangePermissionModel.objects.create(id=1, name="odd id") + r2 = RowLevelChangePermissionModel.objects.create(id=2, name="even id") + change_url_1 = reverse('admin:admin_views_rowlevelchangepermissionmodel_change', args=(r1.pk,)) + change_url_2 = reverse('admin:admin_views_rowlevelchangepermissionmodel_change', args=(r2.pk,)) for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]: self.client.post(login_url, login_dict) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/') + response = self.client.get(change_url_1) self.assertEqual(response.status_code, 403) - response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', {'name': 'changed'}) + response = self.client.post(change_url_1, {'name': 'changed'}) self.assertEqual(RowLevelChangePermissionModel.objects.get(id=1).name, 'odd id') self.assertEqual(response.status_code, 403) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/') + response = self.client.get(change_url_2) self.assertEqual(response.status_code, 200) - response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', {'name': 'changed'}) + response = self.client.post(change_url_2, {'name': 'changed'}) self.assertEqual(RowLevelChangePermissionModel.objects.get(id=2).name, 'changed') - self.assertRedirects(response, '/test_admin/admin/') - self.client.get('/test_admin/admin/logout/') + self.assertRedirects(response, self.index_url) + self.client.get(reverse('admin:logout')) for login_dict in [self.joepublic_login, self.no_username_login]: self.client.post(login_url, login_dict) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', follow=True) + response = self.client.get(change_url_1, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/', {'name': 'changed'}, follow=True) + response = self.client.post(change_url_1, {'name': 'changed'}, follow=True) self.assertEqual(RowLevelChangePermissionModel.objects.get(id=1).name, 'odd id') self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', follow=True) + response = self.client.get(change_url_2, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - response = self.client.post('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/', {'name': 'changed again'}, follow=True) + response = self.client.post(change_url_2, {'name': 'changed again'}, follow=True) self.assertEqual(RowLevelChangePermissionModel.objects.get(id=2).name, 'changed') self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_history_view(self): """History view should restrict access.""" - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) # add user should not be able to view the list of article or change any of them - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.adduser_login) - response = self.client.get('/test_admin/admin/admin_views/article/1/history/') + response = self.client.get(reverse('admin:admin_views_article_history', args=(1,))) self.assertEqual(response.status_code, 403) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # change user can view all items and edit them - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.changeuser_login) - response = self.client.get('/test_admin/admin/admin_views/article/1/history/') + response = self.client.get(reverse('admin:admin_views_article_history', args=(1,))) self.assertEqual(response.status_code, 200) # Test redirection when using row-level change permissions. Refs #11513. @@ -1452,33 +1452,37 @@ class AdminViewPermissionsTest(TestCase): RowLevelChangePermissionModel.objects.create(id=2, name="even id") for login_dict in [self.super_login, self.changeuser_login, self.adduser_login, self.deleteuser_login]: self.client.post(login_url, login_dict) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/') + response = self.client.get(reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(1,))) self.assertEqual(response.status_code, 403) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/') + response = self.client.get(reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(2,))) self.assertEqual(response.status_code, 200) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) for login_dict in [self.joepublic_login, self.no_username_login]: self.client.post(login_url, login_dict) - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/1/history/', follow=True) + response = self.client.get( + reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(1,)), follow=True + ) self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - response = self.client.get('/test_admin/admin/admin_views/rowlevelchangepermissionmodel/2/history/', follow=True) + response = self.client.get( + reverse('admin:admin_views_rowlevelchangepermissionmodel_history', args=(2,)), follow=True + ) self.assertEqual(response.status_code, 200) self.assertContains(response, 'login-form') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_conditionally_show_add_section_link(self): """ The foreign key widget should only show the "add related" button if the user has permission to add that related item. """ - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) # Set up and log in user. - url = '/test_admin/admin/admin_views/article/add/' + url = reverse('admin:admin_views_article_add') add_link_text = 'add_id_section' self.client.post(login_url, self.adduser_login) # The user can't add sections yet, so they shouldn't see the "add @@ -1503,7 +1507,7 @@ class AdminViewPermissionsTest(TestCase): login_url = reverse('admin:login') # Set up and log in user. - url = '/test_admin/admin/admin_views/article/add/' + url = reverse('admin:admin_views_article_add') change_link_text = 'change_id_section' self.client.post(login_url, self.adduser_login) # The user can't change sections yet, so they shouldn't see the "change @@ -1530,9 +1534,9 @@ class AdminViewPermissionsTest(TestCase): login_url = reverse('admin:login') # Set up and log in user. - url = '/test_admin/admin/admin_views/article/add/' + url = reverse('admin:admin_views_article_add') delete_link_text = 'delete_id_sub_section' - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.adduser_login) # The user can't delete sections yet, so they shouldn't see the "delete # section" link. @@ -1549,85 +1553,86 @@ class AdminViewPermissionsTest(TestCase): self.assertContains(response, delete_link_text) def test_custom_model_admin_templates(self): - login_url = reverse('admin:login') + '?next=/test_admin/admin/' - self.client.get('/test_admin/admin/') + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) + self.client.get(self.index_url) self.client.post(login_url, self.super_login) # Test custom change list template with custom extra context - response = self.client.get('/test_admin/admin/admin_views/customarticle/') + response = self.client.get(reverse('admin:admin_views_customarticle_changelist')) self.assertContains(response, "var hello = 'Hello!';") self.assertTemplateUsed(response, 'custom_admin/change_list.html') # Test custom add form template - response = self.client.get('/test_admin/admin/admin_views/customarticle/add/') + response = self.client.get(reverse('admin:admin_views_customarticle_add')) self.assertTemplateUsed(response, 'custom_admin/add_form.html') # Add an article so we can test delete, change, and history views - post = self.client.post('/test_admin/admin/admin_views/customarticle/add/', { + post = self.client.post(reverse('admin:admin_views_customarticle_add'), { 'content': '<p>great article</p>', 'date_0': '2008-03-18', 'date_1': '10:54:39' }) - self.assertRedirects(post, '/test_admin/admin/admin_views/customarticle/') + self.assertRedirects(post, reverse('admin:admin_views_customarticle_changelist')) self.assertEqual(CustomArticle.objects.all().count(), 1) article_pk = CustomArticle.objects.all()[0].pk # Test custom delete, change, and object history templates # Test custom change form template - response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/' % article_pk) + response = self.client.get(reverse('admin:admin_views_customarticle_change', args=(article_pk,))) self.assertTemplateUsed(response, 'custom_admin/change_form.html') - response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/delete/' % article_pk) + response = self.client.get(reverse('admin:admin_views_customarticle_delete', args=(article_pk,))) self.assertTemplateUsed(response, 'custom_admin/delete_confirmation.html') - response = self.client.post('/test_admin/admin/admin_views/customarticle/', data={ + response = self.client.post(reverse('admin:admin_views_customarticle_changelist'), data={ 'index': 0, 'action': ['delete_selected'], '_selected_action': ['1'], }) self.assertTemplateUsed(response, 'custom_admin/delete_selected_confirmation.html') - response = self.client.get('/test_admin/admin/admin_views/customarticle/%d/history/' % article_pk) + response = self.client.get(reverse('admin:admin_views_customarticle_history', args=(article_pk,))) self.assertTemplateUsed(response, 'custom_admin/object_history.html') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_delete_view(self): """Delete view should restrict access and actually delete items.""" - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) delete_dict = {'post': 'yes'} + delete_url = reverse('admin:admin_views_article_delete', args=(1,)) # add user should not be able to delete articles - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.adduser_login) - response = self.client.get('/test_admin/admin/admin_views/article/1/delete/') + response = self.client.get(delete_url) self.assertEqual(response.status_code, 403) - post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict) + post = self.client.post(delete_url, delete_dict) self.assertEqual(post.status_code, 403) self.assertEqual(Article.objects.all().count(), 3) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) # Delete user can delete - self.client.get('/test_admin/admin/') + self.client.get(self.index_url) self.client.post(login_url, self.deleteuser_login) - response = self.client.get('/test_admin/admin/admin_views/section/1/delete/') + response = self.client.get(reverse('admin:admin_views_section_delete', args=(1,))) self.assertContains(response, "<h2>Summary</h2>") self.assertContains(response, "<li>Articles: 3</li>") # test response contains link to related Article self.assertContains(response, "admin_views/article/1/") - response = self.client.get('/test_admin/admin/admin_views/article/1/delete/') + response = self.client.get(delete_url) self.assertContains(response, "admin_views/article/1/") self.assertContains(response, "<h2>Summary</h2>") self.assertContains(response, "<li>Articles: 1</li>") self.assertEqual(response.status_code, 200) - post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict) - self.assertRedirects(post, '/test_admin/admin/') + post = self.client.post(delete_url, delete_dict) + self.assertRedirects(post, self.index_url) self.assertEqual(Article.objects.all().count(), 2) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Greetings from a deleted object') article_ct = ContentType.objects.get_for_model(Article) logged = LogEntry.objects.get(content_type=article_ct, action_flag=DELETION) self.assertEqual(logged.object_id, '1') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_disabled_permissions_when_logged_in(self): self.client.login(username='super', password='secret') @@ -1635,11 +1640,11 @@ class AdminViewPermissionsTest(TestCase): superuser.is_active = False superuser.save() - response = self.client.get('/test_admin/admin/', follow=True) + response = self.client.get(self.index_url, follow=True) self.assertContains(response, 'id="login-form"') self.assertNotContains(response, 'Log out') - response = self.client.get('/test_admin/admin/secure-view/', follow=True) + response = self.client.get(reverse('secure_view'), follow=True) self.assertContains(response, 'id="login-form"') def test_disabled_staff_permissions_when_logged_in(self): @@ -1648,11 +1653,11 @@ class AdminViewPermissionsTest(TestCase): superuser.is_staff = False superuser.save() - response = self.client.get('/test_admin/admin/', follow=True) + response = self.client.get(self.index_url, follow=True) self.assertContains(response, 'id="login-form"') self.assertNotContains(response, 'Log out') - response = self.client.get('/test_admin/admin/secure-view/', follow=True) + response = self.client.get(reverse('secure_view'), follow=True) self.assertContains(response, 'id="login-form"') def test_app_index_fail_early(self): @@ -1660,7 +1665,7 @@ class AdminViewPermissionsTest(TestCase): If a user has no module perms, avoid iterating over all the modeladmins in the registry. """ - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) opts = Article._meta change_user = User.objects.get(username='changeuser') permission = get_perm(Article, get_permission_codename('change', opts)) @@ -1669,12 +1674,12 @@ class AdminViewPermissionsTest(TestCase): # the user has no module permissions, because this module doesn't exist change_user.user_permissions.remove(permission) - response = self.client.get('/test_admin/admin/admin_views/') + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertEqual(response.status_code, 403) # the user now has module permissions change_user.user_permissions.add(permission) - response = self.client.get('/test_admin/admin/admin_views/') + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertEqual(response.status_code, 200) def test_shortcut_view_only_available_to_staff(self): @@ -1683,7 +1688,7 @@ class AdminViewPermissionsTest(TestCase): """ model_ctype = ContentType.objects.get_for_model(ModelWithStringPrimaryKey) obj = ModelWithStringPrimaryKey.objects.create(string_pk='foo') - shortcut_url = "/test_admin/admin/r/%s/%s/" % (model_ctype.pk, obj.pk) + shortcut_url = reverse('admin:view_on_site', args=(model_ctype.pk, obj.pk)) # Not logged in: we should see the login page. response = self.client.get(shortcut_url, follow=True) @@ -1703,31 +1708,31 @@ class AdminViewPermissionsTest(TestCase): have any permission for that module (add, change, or delete), so that the module is displayed on the admin index page. """ - login_url = reverse('admin:login') + '?next=/test_admin/admin/' + login_url = '%s?next=%s' % (reverse('admin:login'), reverse('admin:index')) self.client.post(login_url, self.super_login) - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertContains(response, 'admin_views') self.assertContains(response, 'Articles') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) self.client.post(login_url, self.adduser_login) - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertContains(response, 'admin_views') self.assertContains(response, 'Articles') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) self.client.post(login_url, self.changeuser_login) - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertContains(response, 'admin_views') self.assertContains(response, 'Articles') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) self.client.post(login_url, self.deleteuser_login) - response = self.client.get('/test_admin/admin/') + response = self.client.get(self.index_url) self.assertContains(response, 'admin_views') self.assertContains(response, 'Articles') - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) def test_overriding_has_module_permission(self): """ @@ -1735,31 +1740,32 @@ class AdminViewPermissionsTest(TestCase): In this case, it always returns False, so the module should not be displayed on the admin index page for any users. """ - login_url = reverse('admin:login') + '?next=/test_admin/admin7/' + login_url = '%s?next=%s' % (reverse('admin7:login'), reverse('admin7:index')) + index_url = reverse('admin7:index') self.client.post(login_url, self.super_login) - response = self.client.get('/test_admin/admin7/') + response = self.client.get(index_url) self.assertNotContains(response, 'admin_views') self.assertNotContains(response, 'Articles') - self.client.get('/test_admin/admin7/logout/') + self.client.get(reverse('admin7:logout')) self.client.post(login_url, self.adduser_login) - response = self.client.get('/test_admin/admin7/') + response = self.client.get(index_url) self.assertNotContains(response, 'admin_views') self.assertNotContains(response, 'Articles') - self.client.get('/test_admin/admin7/logout/') + self.client.get(reverse('admin7:logout')) self.client.post(login_url, self.changeuser_login) - response = self.client.get('/test_admin/admin7/') + response = self.client.get(index_url) self.assertNotContains(response, 'admin_views') self.assertNotContains(response, 'Articles') - self.client.get('/test_admin/admin7/logout/') + self.client.get(reverse('admin7:logout')) self.client.post(login_url, self.deleteuser_login) - response = self.client.get('/test_admin/admin7/') + response = self.client.get(index_url) self.assertNotContains(response, 'admin_views') self.assertNotContains(response, 'Articles') - self.client.get('/test_admin/admin7/logout/') + self.client.get(reverse('admin7:logout')) @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], @@ -1778,19 +1784,19 @@ class AdminViewsNoUrlTest(TestCase): # login POST dict self.changeuser_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: reverse('admin:index'), 'username': 'changeuser', 'password': 'secret', } def test_no_standard_modeladmin_urls(self): """Admin index views don't break when user's ModelAdmin removes standard urls""" - self.client.get('/test_admin/admin/') + self.client.get(reverse('admin:index')) r = self.client.post(reverse('admin:login'), self.changeuser_login) - r = self.client.get('/test_admin/admin/') + r = self.client.get(reverse('admin:index')) # we shouldn't get a 500 error caused by a NoReverseMatch self.assertEqual(r.status_code, 200) - self.client.get('/test_admin/admin/logout/') + self.client.get(reverse('admin:logout')) @skipUnlessDBFeature('can_defer_constraint_checks') @@ -1807,8 +1813,12 @@ class AdminViewDeletedObjectsTest(TestCase): Objects should be nested to display the relationships that cause them to be scheduled for deletion. """ - pattern = re.compile(br"""<li>Plot: <a href=".+/admin_views/plot/1/">World Domination</a>\s*<ul>\s*<li>Plot details: <a href=".+/admin_views/plotdetails/1/">almost finished</a>""") - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1)) + pattern = re.compile(force_bytes( + r'<li>Plot: <a href="%s">World Domination</a>\s*<ul>\s*<li>Plot details: <a href="%s">almost finished</a>' % ( + reverse('admin:admin_views_plot_change', args=(1,)), + reverse('admin:admin_views_plotdetails_change', args=(1,))) + )) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,))) six.assertRegex(self, response.content, pattern) def test_cyclic(self): @@ -1817,9 +1827,13 @@ class AdminViewDeletedObjectsTest(TestCase): listed once. """ - one = """<li>Cyclic one: <a href="/test_admin/admin/admin_views/cyclicone/1/">I am recursive</a>""" - two = """<li>Cyclic two: <a href="/test_admin/admin/admin_views/cyclictwo/1/">I am recursive too</a>""" - response = self.client.get('/test_admin/admin/admin_views/cyclicone/%s/delete/' % quote(1)) + one = '<li>Cyclic one: <a href="%s">I am recursive</a>' % ( + reverse('admin:admin_views_cyclicone_change', args=(1,)), + ) + two = '<li>Cyclic two: <a href="%s">I am recursive too</a>' % ( + reverse('admin:admin_views_cyclictwo_change', args=(1,)), + ) + response = self.client.get(reverse('admin:admin_views_cyclicone_delete', args=(1,))) self.assertContains(response, one, 1) self.assertContains(response, two, 1) @@ -1833,7 +1847,7 @@ class AdminViewDeletedObjectsTest(TestCase): self.assertTrue(self.client.login(username='deleteuser', password='secret')) - response = self.client.get('/test_admin/admin/admin_views/plot/%s/delete/' % quote(1)) + response = self.client.get(reverse('admin:admin_views_plot_delete', args=(1,))) self.assertContains(response, "your account doesn't have permission to delete the following types of objects") self.assertContains(response, "<li>plot details</li>") @@ -1842,14 +1856,20 @@ class AdminViewDeletedObjectsTest(TestCase): a1 = Answer.objects.create(question=q, answer="Because.") a2 = Answer.objects.create(question=q, answer="Yes.") - response = self.client.get("/test_admin/admin/admin_views/question/%s/delete/" % quote(q.pk)) + response = self.client.get(reverse('admin:admin_views_question_delete', args=(q.pk,))) self.assertContains(response, "would require deleting the following protected related objects") - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk) - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk) + self.assertContains( + response, + '<li>Answer: <a href="%s">Because.</a></li>' % reverse('admin:admin_views_answer_change', args=(a1.pk,)) + ) + self.assertContains( + response, + '<li>Answer: <a href="%s">Yes.</a></li>' % reverse('admin:admin_views_answer_change', args=(a2.pk,)) + ) def test_not_registered(self): should_contain = """<li>Secret hideout: underground bunker""" - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1)) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,))) self.assertContains(response, should_contain, 1) def test_multiple_fkeys_to_same_model(self): @@ -1859,10 +1879,12 @@ class AdminViewDeletedObjectsTest(TestCase): objects to delete. """ - should_contain = """<li>Plot: <a href="/test_admin/admin/admin_views/plot/1/">World Domination</a>""" - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(1)) + should_contain = '<li>Plot: <a href="%s">World Domination</a>' % reverse( + 'admin:admin_views_plot_change', args=(1,) + ) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(1,))) self.assertContains(response, should_contain) - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(2)) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(2,))) self.assertContains(response, should_contain) def test_multiple_fkeys_to_same_instance(self): @@ -1872,8 +1894,10 @@ class AdminViewDeletedObjectsTest(TestCase): once. """ - should_contain = """<li>Plot: <a href="/test_admin/admin/admin_views/plot/2/">World Peace</a></li>""" - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(2)) + should_contain = '<li>Plot: <a href="%s">World Peace</a></li>' % reverse( + 'admin:admin_views_plot_change', args=(2,) + ) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(2,))) self.assertContains(response, should_contain, 1) def test_inheritance(self): @@ -1884,15 +1908,15 @@ class AdminViewDeletedObjectsTest(TestCase): """ should_contain = [ - """<li>Villain: <a href="/test_admin/admin/admin_views/villain/3/">Bob</a>""", - """<li>Super villain: <a href="/test_admin/admin/admin_views/supervillain/3/">Bob</a>""", - """<li>Secret hideout: floating castle""", - """<li>Super secret hideout: super floating castle!""" + '<li>Villain: <a href="%s">Bob</a>' % reverse('admin:admin_views_villain_change', args=(3,)), + '<li>Super villain: <a href="%s">Bob</a>' % reverse('admin:admin_views_supervillain_change', args=(3,)), + '<li>Secret hideout: floating castle', + '<li>Super secret hideout: super floating castle!', ] - response = self.client.get('/test_admin/admin/admin_views/villain/%s/delete/' % quote(3)) + response = self.client.get(reverse('admin:admin_views_villain_delete', args=(3,))) for should in should_contain: self.assertContains(response, should, 1) - response = self.client.get('/test_admin/admin/admin_views/supervillain/%s/delete/' % quote(3)) + response = self.client.get(reverse('admin:admin_views_supervillain_delete', args=(3,))) for should in should_contain: self.assertContains(response, should, 1) @@ -1904,8 +1928,9 @@ class AdminViewDeletedObjectsTest(TestCase): """ plot = Plot.objects.get(pk=3) tag = FunkyTag.objects.create(content_object=plot, name='hott') - should_contain = """<li>Funky tag: <a href="/test_admin/admin/admin_views/funkytag/%s/">hott""" % tag.id - response = self.client.get('/test_admin/admin/admin_views/plot/%s/delete/' % quote(3)) + should_contain = '<li>Funky tag: <a href="%s">hott' % reverse( + 'admin:admin_views_funkytag_change', args=(tag.id,)) + response = self.client.get(reverse('admin:admin_views_plot_delete', args=(3,))) self.assertContains(response, should_contain) @@ -1920,7 +1945,7 @@ class TestGenericRelations(TestCase): def test_generic_content_object_in_list_display(self): plot = Plot.objects.get(pk=3) FunkyTag.objects.create(content_object=plot, name='hott') - response = self.client.get('/test_admin/admin/admin_views/funkytag/') + response = self.client.get(reverse('admin:admin_views_funkytag_changelist')) self.assertContains(response, "%s</td>" % plot) @@ -1944,36 +1969,38 @@ class AdminViewStringPrimaryKeyTest(TestCase): key should work. Refs #12349, #18550. """ - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/history/' % quote(self.pk)) + response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_history', args=(self.pk,))) self.assertContains(response, escape(self.pk)) self.assertContains(response, 'Changed something') self.assertEqual(response.status_code, 200) def test_get_change_view(self): "Retrieving the object using urlencoded form of primary key should work" - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(self.pk)) + response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_change', args=(self.pk,))) self.assertContains(response, escape(self.pk)) self.assertEqual(response.status_code, 200) def test_changelist_to_changeform_link(self): "Link to the changeform of the object in changelist should use reverse() and be quoted -- #18072" - prefix = '/test_admin/admin/admin_views/modelwithstringprimarykey/' - response = self.client.get(prefix) + response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_changelist')) # this URL now comes through reverse(), thus url quoting and iri_to_uri encoding pk_final_url = escape(iri_to_uri(quote(self.pk))) - should_contain = """<th class="field-__str__"><a href="%s%s/">%s</a></th>""" % (prefix, pk_final_url, escape(self.pk)) + change_url = reverse( + 'admin:admin_views_modelwithstringprimarykey_change', args=('__fk__',) + ).replace('__fk__', pk_final_url) + should_contain = '<th class="field-__str__"><a href="%s">%s</a></th>' % (change_url, escape(self.pk)) self.assertContains(response, should_contain) def test_recentactions_link(self): "The link from the recent actions list referring to the changeform of the object should be quoted" - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) link = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),)) should_contain = """<a href="%s">%s</a>""" % (escape(link), escape(self.pk)) self.assertContains(response, should_contain) def test_recentactions_without_content_type(self): "If a LogEntry is missing content_type it will not display it in span tag under the hyperlink." - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) link = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),)) should_contain = """<a href="%s">%s</a>""" % (escape(link), escape(self.pk)) self.assertContains(response, should_contain) @@ -1987,7 +2014,7 @@ class AdminViewStringPrimaryKeyTest(TestCase): logentry.save() counted_presence_before = response.content.count(force_bytes(should_contain)) - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) counted_presence_after = response.content.count(force_bytes(should_contain)) self.assertEqual(counted_presence_before - 1, counted_presence_after) @@ -1996,25 +2023,31 @@ class AdminViewStringPrimaryKeyTest(TestCase): "LogEntry.get_admin_url returns a URL to edit the entry's object or None for non-existent (possibly deleted) models" log_entry_model = "modelwithstringprimarykey" # capitalized in Recent Actions logentry = LogEntry.objects.get(content_type__model__iexact=log_entry_model) - model = "modelwithstringprimarykey" - desired_admin_url = "/test_admin/admin/admin_views/%s/%s/" % (model, iri_to_uri(quote(self.pk))) + desired_admin_url = reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(self.pk),)) + self.assertEqual(logentry.get_admin_url(), desired_admin_url) + self.assertIn(iri_to_uri(quote(self.pk)), logentry.get_admin_url()) logentry.content_type.model = "non-existent" self.assertEqual(logentry.get_admin_url(), None) def test_deleteconfirmation_link(self): "The link from the delete confirmation page referring back to the changeform of the object should be quoted" - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk)) + response = self.client.get(reverse('admin:admin_views_modelwithstringprimarykey_delete', args=(quote(self.pk),))) # this URL now comes through reverse(), thus url quoting and iri_to_uri encoding - should_contain = """/%s/">%s</a>""" % (escape(iri_to_uri(quote(self.pk))), escape(self.pk)) + change_url = reverse( + 'admin:admin_views_modelwithstringprimarykey_change', args=('__fk__',) + ).replace('__fk__', escape(iri_to_uri(quote(self.pk)))) + should_contain = '<a href="%s">%s</a>' % (change_url, 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(pk="i have something to add") add_model.save() - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(add_model.pk)) + response = self.client.get( + reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(add_model.pk),)) + ) should_contain = """<h1>Change model with string primary key</h1>""" self.assertContains(response, should_contain) @@ -2022,7 +2055,9 @@ class AdminViewStringPrimaryKeyTest(TestCase): "A model with a primary key that ends with delete should be visible" delete_model = ModelWithStringPrimaryKey(pk="delete") delete_model.save() - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(delete_model.pk)) + response = self.client.get( + reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(delete_model.pk),)) + ) should_contain = """<h1>Change model with string primary key</h1>""" self.assertContains(response, should_contain) @@ -2030,7 +2065,9 @@ class AdminViewStringPrimaryKeyTest(TestCase): "A model with a primary key that ends with history should be visible" history_model = ModelWithStringPrimaryKey(pk="history") history_model.save() - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(history_model.pk)) + response = self.client.get( + reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(history_model.pk),)) + ) should_contain = """<h1>Change model with string primary key</h1>""" self.assertContains(response, should_contain) @@ -2038,7 +2075,9 @@ class AdminViewStringPrimaryKeyTest(TestCase): "'View on site should' work properly with char fields" model = ModelWithStringPrimaryKey(pk='abc_123') model.save() - response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(model.pk)) + response = self.client.get( + reverse('admin:admin_views_modelwithstringprimarykey_change', args=(quote(model.pk),)) + ) should_contain = '/%s/" class="viewsitelink">' % model.pk self.assertContains(response, should_contain) @@ -2062,7 +2101,7 @@ class AdminViewStringPrimaryKeyTest(TestCase): like slash or underscore, these characters must be escaped (see #22266) """ response = self.client.post( - '/test_admin/admin/admin_views/modelwithstringprimarykey/add/', + reverse('admin:admin_views_modelwithstringprimarykey_add'), { 'string_pk': '123/history', "_continue": "1", # Save and continue editing @@ -2070,13 +2109,7 @@ class AdminViewStringPrimaryKeyTest(TestCase): ) self.assertEqual(response.status_code, 302) # temporary redirect - self.assertEqual( - response['location'], - ( - 'http://testserver/test_admin/admin/admin_views/' - 'modelwithstringprimarykey/123_2Fhistory/' # PK is quoted - ) - ) + self.assertIn('/123_2Fhistory/', response['location']) # PK is quoted @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], @@ -2091,7 +2124,7 @@ class SecureViewTests(TestCase): """ Ensure that we see the admin login form. """ - secure_url = '/test_admin/admin/secure-view/' + secure_url = reverse('secure_view') response = self.client.get(secure_url) self.assertRedirects(response, '%s?next=%s' % (reverse('admin:login'), secure_url)) response = self.client.get(secure_url, follow=True) @@ -2137,7 +2170,7 @@ class AdminViewUnicodeTest(TestCase): "chapter_set-5-content": "", } - response = self.client.post('/test_admin/admin/admin_views/book/1/', post_data) + response = self.client.post(reverse('admin:admin_views_book_change', args=(1,)), post_data) self.assertEqual(response.status_code, 302) # redirect somewhere def test_unicode_delete(self): @@ -2145,10 +2178,11 @@ class AdminViewUnicodeTest(TestCase): Ensure that the delete_view handles non-ASCII characters """ delete_dict = {'post': 'yes'} - response = self.client.get('/test_admin/admin/admin_views/book/1/delete/') + delete_url = reverse('admin:admin_views_book_delete', args=(1,)) + response = self.client.get(delete_url) self.assertEqual(response.status_code, 200) - response = self.client.post('/test_admin/admin/admin_views/book/1/delete/', delete_dict) - self.assertRedirects(response, '/test_admin/admin/admin_views/book/') + response = self.client.post(delete_url, delete_dict) + self.assertRedirects(response, reverse('admin:admin_views_book_changelist')) @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], @@ -2162,21 +2196,21 @@ class AdminViewListEditable(TestCase): def test_inheritance(self): Podcast.objects.create(name="This Week in Django", release_date=datetime.date.today()) - response = self.client.get('/test_admin/admin/admin_views/podcast/') + response = self.client.get(reverse('admin:admin_views_podcast_changelist')) self.assertEqual(response.status_code, 200) def test_inheritance_2(self): Vodcast.objects.create(name="This Week in Django", released=True) - response = self.client.get('/test_admin/admin/admin_views/vodcast/') + response = self.client.get(reverse('admin:admin_views_vodcast_changelist')) self.assertEqual(response.status_code, 200) def test_custom_pk(self): Language.objects.create(iso='en', name='English', english_name='English') - response = self.client.get('/test_admin/admin/admin_views/language/') + response = self.client.get(reverse('admin:admin_views_language_changelist')) self.assertEqual(response.status_code, 200) def test_changelist_input_html(self): - response = self.client.get('/test_admin/admin/admin_views/person/') + response = self.client.get(reverse('admin:admin_views_person_changelist')) # 2 inputs per object(the field and the hidden id field) = 6 # 4 management hidden fields = 4 # 4 action inputs (3 regular checkboxes, 1 checkbox to select all) @@ -2209,7 +2243,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/person/', + response = self.client.post(reverse('admin:admin_views_person_changelist'), data, follow=True) self.assertEqual(len(response.context['messages']), 1) @@ -2231,7 +2265,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - self.client.post('/test_admin/admin/admin_views/person/', data) + self.client.post(reverse('admin:admin_views_person_changelist'), data) self.assertEqual(Person.objects.get(name="John Mauchly").alive, False) self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 2) @@ -2252,7 +2286,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - self.client.post('/test_admin/admin/admin_views/person/?gender__exact=1', data) + self.client.post(reverse('admin:admin_views_person_changelist') + '?gender__exact=1', data) self.assertEqual(Person.objects.get(name="John Mauchly").alive, True) @@ -2267,7 +2301,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - self.client.post('/test_admin/admin/admin_views/person/?q=john', data) + self.client.post(reverse('admin:admin_views_person_changelist') + '?q=john', data) self.assertEqual(Person.objects.get(name="John Mauchly").alive, False) @@ -2302,8 +2336,14 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data) - self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 1, html=True) + response = self.client.post(reverse('admin:admin_views_fooddelivery_changelist'), data) + self.assertContains( + response, + '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery ' + 'with this Driver and Restaurant already exists.</li></ul></td></tr>', + 1, + html=True + ) data = { "form-TOTAL_FORMS": "3", @@ -2329,8 +2369,14 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/fooddelivery/', data) - self.assertContains(response, '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery with this Driver and Restaurant already exists.</li></ul></td></tr>', 2, html=True) + response = self.client.post(reverse('admin:admin_views_fooddelivery_changelist'), data) + self.assertContains( + response, + '<tr><td colspan="4"><ul class="errorlist nonfield"><li>Food delivery ' + 'with this Driver and Restaurant already exists.</li></ul></td></tr>', + 2, + html=True + ) def test_non_form_errors(self): # test if non-form errors are handled; ticket #12716 @@ -2347,7 +2393,7 @@ class AdminViewListEditable(TestCase): # and not an action "Go". "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/person/', data) + response = self.client.post(reverse('admin:admin_views_person_changelist'), data) self.assertContains(response, "Grace is not a Zombie") def test_non_form_errors_is_errorlist(self): @@ -2363,7 +2409,7 @@ class AdminViewListEditable(TestCase): "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/person/', data) + response = self.client.post(reverse('admin:admin_views_person_changelist'), data) non_form_errors = response.context['cl'].formset.non_form_errors() self.assertIsInstance(non_form_errors, ErrorList) self.assertEqual(str(non_form_errors), str(ErrorList(["Grace is not a Zombie"]))) @@ -2402,7 +2448,7 @@ class AdminViewListEditable(TestCase): # and not an action "Go". "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/category/', data) + response = self.client.post(reverse('admin:admin_views_category_changelist'), data) # Successful post will redirect self.assertEqual(response.status_code, 302) @@ -2420,11 +2466,11 @@ class AdminViewListEditable(TestCase): UnorderedObject.objects.create(id=1, name='Unordered object #1') UnorderedObject.objects.create(id=2, name='Unordered object #2') UnorderedObject.objects.create(id=3, name='Unordered object #3') - response = self.client.get('/test_admin/admin/admin_views/unorderedobject/') + response = self.client.get(reverse('admin:admin_views_unorderedobject_changelist')) self.assertContains(response, 'Unordered object #3') self.assertContains(response, 'Unordered object #2') self.assertNotContains(response, 'Unordered object #1') - response = self.client.get('/test_admin/admin/admin_views/unorderedobject/?p=1') + response = self.client.get(reverse('admin:admin_views_unorderedobject_changelist') + '?p=1') self.assertNotContains(response, 'Unordered object #3') self.assertNotContains(response, 'Unordered object #2') self.assertContains(response, 'Unordered object #1') @@ -2451,7 +2497,7 @@ class AdminViewListEditable(TestCase): "_selected_action": ['3'], "action": ['', 'delete_selected'], } - self.client.post('/test_admin/admin/admin_views/person/', data) + self.client.post(reverse('admin:admin_views_person_changelist'), data) self.assertEqual(Person.objects.get(name="John Mauchly").alive, True) self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 1) @@ -2478,7 +2524,7 @@ class AdminViewListEditable(TestCase): "_selected_action": ['1'], "action": ['', 'delete_selected'], } - self.client.post('/test_admin/admin/admin_views/person/', data) + self.client.post(reverse('admin:admin_views_person_changelist'), data) self.assertEqual(Person.objects.get(name="John Mauchly").alive, False) self.assertEqual(Person.objects.get(name="Grace Hopper").gender, 2) @@ -2487,9 +2533,9 @@ class AdminViewListEditable(TestCase): """ Fields should not be list-editable in popups. """ - response = self.client.get('/test_admin/admin/admin_views/person/') + response = self.client.get(reverse('admin:admin_views_person_changelist')) self.assertNotEqual(response.context['cl'].list_editable, ()) - response = self.client.get('/test_admin/admin/admin_views/person/?%s' % IS_POPUP_VAR) + response = self.client.get(reverse('admin:admin_views_person_changelist') + '?%s' % IS_POPUP_VAR) self.assertEqual(response.context['cl'].list_editable, ()) def test_pk_hidden_fields(self): @@ -2501,7 +2547,7 @@ class AdminViewListEditable(TestCase): """ story1 = Story.objects.create(title='The adventures of Guido', content='Once upon a time in Djangoland...') story2 = Story.objects.create(title='Crouching Tiger, Hidden Python', content='The Python was sneaking into...') - response = self.client.get('/test_admin/admin/admin_views/story/') + response = self.client.get(reverse('admin:admin_views_story_changelist')) self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table. self.assertContains(response, 'id="id_form-1-id"', 1) self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True) @@ -2517,7 +2563,7 @@ class AdminViewListEditable(TestCase): story2 = OtherStory.objects.create(title='Crouching Tiger, Hidden Python', content='The Python was sneaking into...') link1 = reverse('admin:admin_views_otherstory_change', args=(story1.pk,)) link2 = reverse('admin:admin_views_otherstory_change', args=(story2.pk,)) - response = self.client.get('/test_admin/admin/admin_views/otherstory/') + response = self.client.get(reverse('admin:admin_views_otherstory_changelist')) self.assertContains(response, 'id="id_form-0-id"', 1) # Only one hidden field, in a separate place than the table. self.assertContains(response, 'id="id_form-1-id"', 1) self.assertContains(response, '<div class="hiddenfields">\n<input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /><input type="hidden" name="form-1-id" value="%d" id="id_form-1-id" />\n</div>' % (story2.id, story1.id), html=True) @@ -2536,34 +2582,35 @@ class AdminSearchTest(TestCase): def test_search_on_sibling_models(self): "Check that a search that mentions sibling models" - response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar') + response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar') # confirm the search returned 1 object self.assertContains(response, "\n1 recommendation\n") def test_with_fk_to_field(self): - """Ensure that the to_field GET parameter is preserved when a search + """ + Ensure that the to_field GET parameter is preserved when a search is performed. Refs #10918. """ - response = self.client.get('/test_admin/admin/auth/user/?q=joe&%s=id' % TO_FIELD_VAR) + response = self.client.get(reverse('admin:auth_user_changelist') + '?q=joe&%s=id' % TO_FIELD_VAR) self.assertContains(response, "\n1 user\n") self.assertContains(response, '<input type="hidden" name="%s" value="id"/>' % TO_FIELD_VAR, html=True) def test_exact_matches(self): - response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar') + response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar') # confirm the search returned one object self.assertContains(response, "\n1 recommendation\n") - response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=ba') + response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=ba') # confirm the search returned zero objects self.assertContains(response, "\n0 recommendations\n") def test_beginning_matches(self): - response = self.client.get('/test_admin/admin/admin_views/person/?q=Gui') + response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=Gui') # confirm the search returned one object self.assertContains(response, "\n1 person\n") self.assertContains(response, "Guido") - response = self.client.get('/test_admin/admin/admin_views/person/?q=uido') + response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=uido') # confirm the search returned zero objects self.assertContains(response, "\n0 persons\n") self.assertNotContains(response, "Guido") @@ -2572,12 +2619,12 @@ class AdminSearchTest(TestCase): PluggableSearchPerson.objects.create(name="Bob", age=10) PluggableSearchPerson.objects.create(name="Amy", age=20) - response = self.client.get('/test_admin/admin/admin_views/pluggablesearchperson/?q=Bob') + response = self.client.get(reverse('admin:admin_views_pluggablesearchperson_changelist') + '?q=Bob') # confirm the search returned one object self.assertContains(response, "\n1 pluggable search person\n") self.assertContains(response, "Bob") - response = self.client.get('/test_admin/admin/admin_views/pluggablesearchperson/?q=20') + response = self.client.get(reverse('admin:admin_views_pluggablesearchperson_changelist') + '?q=20') # confirm the search returned one object self.assertContains(response, "\n1 pluggable search person\n") self.assertContains(response, "Amy") @@ -2590,7 +2637,7 @@ class AdminSearchTest(TestCase): # + 1 for filtered result + 1 for filtered count # + 1 for total count with self.assertNumQueries(5): - response = self.client.get('/test_admin/admin/admin_views/person/?q=Gui') + response = self.client.get(reverse('admin:admin_views_person_changelist') + '?q=Gui') self.assertContains(response, """<span class="small quiet">1 result (<a href="?">3 total</a>)</span>""", html=True) @@ -2603,7 +2650,7 @@ class AdminSearchTest(TestCase): # 1 query for session + 1 for fetching user # + 1 for filtered result + 1 for filtered count with self.assertNumQueries(4): - response = self.client.get('/test_admin/admin/admin_views/recommendation/?q=bar') + response = self.client.get(reverse('admin:admin_views_recommendation_changelist') + '?q=bar') self.assertContains(response, """<span class="small quiet">1 result (<a href="?">Show all</a>)</span>""", html=True) @@ -2626,7 +2673,7 @@ class AdminInheritedInlinesTest(TestCase): name_re = re.compile(b'name="(.*?)"') # test the add case - response = self.client.get('/test_admin/admin/admin_views/persona/add/') + response = self.client.get(reverse('admin:admin_views_persona_add')) names = name_re.findall(response.content) # make sure we have no duplicate HTML names self.assertEqual(len(names), len(set(names))) @@ -2645,7 +2692,7 @@ class AdminInheritedInlinesTest(TestCase): "accounts-2-0-username": bar_user, } - response = self.client.post('/test_admin/admin/admin_views/persona/add/', post_data) + response = self.client.post(reverse('admin:admin_views_persona_add'), post_data) self.assertEqual(response.status_code, 302) # redirect somewhere self.assertEqual(Persona.objects.count(), 1) self.assertEqual(FooAccount.objects.count(), 1) @@ -2660,7 +2707,7 @@ class AdminInheritedInlinesTest(TestCase): # test the edit case - response = self.client.get('/test_admin/admin/admin_views/persona/%d/' % persona_id) + response = self.client.get(reverse('admin:admin_views_persona_change', args=(persona_id,))) names = name_re.findall(response.content) # make sure we have no duplicate HTML names self.assertEqual(len(names), len(set(names))) @@ -2684,7 +2731,7 @@ class AdminInheritedInlinesTest(TestCase): "accounts-2-0-account_ptr": str(bar_id), "accounts-2-0-persona": str(persona_id), } - response = self.client.post('/test_admin/admin/admin_views/persona/%d/' % persona_id, post_data) + response = self.client.post(reverse('admin:admin_views_persona_change', args=(persona_id,)), post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Persona.objects.count(), 1) self.assertEqual(FooAccount.objects.count(), 1) @@ -2709,7 +2756,7 @@ class AdminActionsTest(TestCase): 'action': 'mail_admin', 'index': 0, } - self.client.post('/test_admin/admin/admin_views/subscriber/', action_data) + self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Greetings from a ModelAdmin action') @@ -2725,14 +2772,14 @@ class AdminActionsTest(TestCase): 'action': 'delete_selected', 'post': 'yes', } - confirmation = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data) + confirmation = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) self.assertIsInstance(confirmation, TemplateResponse) self.assertContains(confirmation, "Are you sure you want to delete the selected subscribers?") self.assertContains(confirmation, "<h2>Summary</h2>") self.assertContains(confirmation, "<li>Subscribers: 3</li>") self.assertContains(confirmation, "<li>External subscribers: 1</li>") self.assertContains(confirmation, ACTION_CHECKBOX_NAME, count=2) - self.client.post('/test_admin/admin/admin_views/subscriber/', delete_confirmation_data) + self.client.post(reverse('admin:admin_views_subscriber_changelist'), delete_confirmation_data) self.assertEqual(Subscriber.objects.count(), 0) @override_settings(USE_THOUSAND_SEPARATOR=True, USE_L10N=True) @@ -2749,7 +2796,7 @@ class AdminActionsTest(TestCase): 'action': 'delete_selected', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) self.assertTemplateUsed(response, 'admin/delete_selected_confirmation.html') self.assertContains(response, 'value="9999"') # Instead of 9,999 self.assertContains(response, 'value="2"') @@ -2770,11 +2817,19 @@ class AdminActionsTest(TestCase): 'index': 0, } - response = self.client.post("/test_admin/admin/admin_views/question/", action_data) + response = self.client.post(reverse('admin:admin_views_question_changelist'), action_data) self.assertContains(response, "would require deleting the following protected related objects") - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Because.</a></li>' % a1.pk, html=True) - self.assertContains(response, '<li>Answer: <a href="/test_admin/admin/admin_views/answer/%s/">Yes.</a></li>' % a2.pk, html=True) + self.assertContains( + response, + '<li>Answer: <a href="%s">Because.</a></li>' % reverse('admin:admin_views_answer_change', args=(a1.pk,)), + html=True + ) + self.assertContains( + response, + '<li>Answer: <a href="%s">Yes.</a></li>' % reverse('admin:admin_views_answer_change', args=(a2.pk,)), + html=True + ) def test_model_admin_default_delete_action_no_change_url(self): """ @@ -2788,7 +2843,7 @@ class AdminActionsTest(TestCase): "action": "delete_selected", "index": "0", } - response = self.client.post('/test_admin/admin/admin_views/unchangeableobject/', action_data) + response = self.client.post(reverse('admin:admin_views_unchangeableobject_changelist'), action_data) # No 500 caused by NoReverseMatch self.assertEqual(response.status_code, 200) # The page shouldn't display a link to the nonexistent change page @@ -2801,7 +2856,7 @@ class AdminActionsTest(TestCase): 'action': 'external_mail', 'index': 0, } - self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data) + self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, 'Greetings from a function action') @@ -2812,7 +2867,7 @@ class AdminActionsTest(TestCase): 'action': 'redirect_to', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) self.assertEqual(response.status_code, 302) def test_default_redirect(self): @@ -2826,7 +2881,7 @@ class AdminActionsTest(TestCase): 'action': 'external_mail', 'index': 0, } - url = '/test_admin/admin/admin_views/externalsubscriber/?o=1' + url = reverse('admin:admin_views_externalsubscriber_changelist') + '?o=1' response = self.client.post(url, action_data) self.assertRedirects(response, url) @@ -2837,7 +2892,7 @@ class AdminActionsTest(TestCase): 'action': 'download', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) content = b''.join(response.streaming_content) self.assertEqual(content, b'This is the content of the file') self.assertEqual(response.status_code, 200) @@ -2849,7 +2904,7 @@ class AdminActionsTest(TestCase): 'action': 'no_perm', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) self.assertEqual(response.status_code, 403) self.assertEqual(response.content, b'No permission to perform this action') @@ -2858,7 +2913,7 @@ class AdminActionsTest(TestCase): Ensure that actions are ordered as expected. Refs #15964. """ - response = self.client.get('/test_admin/admin/admin_views/externalsubscriber/') + response = self.client.get(reverse('admin:admin_views_externalsubscriber_changelist')) self.assertContains(response, '''<label>Action: <select name="action"> <option value="" selected="selected">---------</option> <option value="delete_selected">Delete selected external @@ -2872,7 +2927,7 @@ action)</option> def test_model_without_action(self): "Tests a ModelAdmin without any action" - response = self.client.get('/test_admin/admin/admin_views/oldsubscriber/') + response = self.client.get(reverse('admin:admin_views_oldsubscriber_changelist')) self.assertEqual(response.context["action_form"], None) self.assertNotContains(response, '<input type="checkbox" class="action-select"', msg_prefix="Found an unexpected action toggle checkboxbox in response") @@ -2880,14 +2935,14 @@ action)</option> def test_model_without_action_still_has_jquery(self): "Tests that a ModelAdmin without any actions still gets jQuery included in page" - response = self.client.get('/test_admin/admin/admin_views/oldsubscriber/') + response = self.client.get(reverse('admin:admin_views_oldsubscriber_changelist')) self.assertEqual(response.context["action_form"], None) self.assertContains(response, 'jquery.min.js', msg_prefix="jQuery missing from admin pages for model with no admin actions") def test_action_column_class(self): "Tests that the checkbox column class is present in the response" - response = self.client.get('/test_admin/admin/admin_views/subscriber/') + response = self.client.get(reverse('admin:admin_views_subscriber_changelist')) self.assertNotEqual(response.context["action_form"], None) self.assertContains(response, 'action-checkbox-column') @@ -2902,7 +2957,7 @@ action)</option> # ...but we clicked "go" on the top form. 'index': 0 } - self.client.post('/test_admin/admin/admin_views/externalsubscriber/', action_data) + self.client.post(reverse('admin:admin_views_externalsubscriber_changelist'), action_data) # Send mail, don't delete. self.assertEqual(len(mail.outbox), 1) @@ -2917,7 +2972,7 @@ action)</option> 'action': 'delete_selected', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) msg = """Items must be selected in order to perform actions on them. No items have been changed.""" self.assertContains(response, msg) self.assertEqual(Subscriber.objects.count(), 2) @@ -2931,7 +2986,7 @@ action)</option> 'action': '', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/subscriber/', action_data) + response = self.client.post(reverse('admin:admin_views_subscriber_changelist'), action_data) msg = """No action selected.""" self.assertContains(response, msg) self.assertEqual(Subscriber.objects.count(), 2) @@ -2940,15 +2995,15 @@ action)</option> """ Check if the selection counter is there. """ - response = self.client.get('/test_admin/admin/admin_views/subscriber/') + response = self.client.get(reverse('admin:admin_views_subscriber_changelist')) self.assertContains(response, '0 of 2 selected') def test_popup_actions(self): """ Actions should not be shown in popups. """ - response = self.client.get('/test_admin/admin/admin_views/subscriber/') + response = self.client.get(reverse('admin:admin_views_subscriber_changelist')) self.assertNotEqual(response.context["action_form"], None) response = self.client.get( - '/test_admin/admin/admin_views/subscriber/?%s' % IS_POPUP_VAR) + reverse('admin:admin_views_subscriber_changelist') + '?%s' % IS_POPUP_VAR) self.assertEqual(response.context["action_form"], None) def test_popup_template_response(self): @@ -2957,7 +3012,7 @@ action)</option> easy customization. """ response = self.client.post( - '/test_admin/admin/admin_views/actor/add/?%s=1' % IS_POPUP_VAR, + reverse('admin:admin_views_actor_add') + '?%s=1' % IS_POPUP_VAR, {'name': 'Troy McClure', 'age': '55', IS_POPUP_VAR: '1'}) self.assertEqual(response.status_code, 200) self.assertEqual(response.template_name, 'admin/popup_response.html') @@ -2967,7 +3022,6 @@ action)</option> ROOT_URLCONF="admin_views.urls") class TestCustomChangeList(TestCase): fixtures = ['admin-views-users.xml'] - urlbit = 'admin' def setUp(self): result = self.client.login(username='super', password='secret') @@ -2979,12 +3033,12 @@ class TestCustomChangeList(TestCase): """ # Insert some data post_data = {"name": "First Gadget"} - response = self.client.post('/test_admin/%s/admin_views/gadget/add/' % self.urlbit, post_data) + response = self.client.post(reverse('admin:admin_views_gadget_add'), post_data) self.assertEqual(response.status_code, 302) # redirect somewhere # Hit the page once to get messages out of the queue message list - response = self.client.get('/test_admin/%s/admin_views/gadget/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_gadget_changelist')) # Ensure that data is still not visible on the page - response = self.client.get('/test_admin/%s/admin_views/gadget/' % self.urlbit) + response = self.client.get(reverse('admin:admin_views_gadget_changelist')) self.assertEqual(response.status_code, 200) self.assertNotContains(response, 'First Gadget') @@ -3002,7 +3056,7 @@ class TestInlineNotEditable(TestCase): """ InlineModelAdmin broken? """ - response = self.client.get('/test_admin/admin/admin_views/parent/add/') + response = self.client.get(reverse('admin:admin_views_parent_add')) self.assertEqual(response.status_code, 200) @@ -3015,13 +3069,13 @@ class AdminCustomQuerysetTest(TestCase): self.client.login(username='super', password='secret') self.pks = [EmptyModel.objects.create().id for i in range(3)] self.super_login = { - REDIRECT_FIELD_NAME: '/test_admin/admin/', + REDIRECT_FIELD_NAME: reverse('admin:index'), 'username': 'super', 'password': 'secret', } def test_changelist_view(self): - response = self.client.get('/test_admin/admin/admin_views/emptymodel/') + response = self.client.get(reverse('admin:admin_views_emptymodel_changelist')) for i in self.pks: if i > 1: self.assertContains(response, 'Primary key = %s' % i) @@ -3032,33 +3086,34 @@ class AdminCustomQuerysetTest(TestCase): # create 2 Person objects Person.objects.create(name='person1', gender=1) Person.objects.create(name='person2', gender=2) + changelist_url = reverse('admin:admin_views_person_changelist') # 4 queries are expected: 1 for the session, 1 for the user, # 1 for the count and 1 for the objects on the page with self.assertNumQueries(4): - resp = self.client.get('/test_admin/admin/admin_views/person/') + resp = self.client.get(changelist_url) self.assertEqual(resp.context['selection_note'], '0 of 2 selected') self.assertEqual(resp.context['selection_note_all'], 'All 2 selected') # here one more count(*) query will run, because filters were applied with self.assertNumQueries(5): extra = {'q': 'not_in_name'} - resp = self.client.get('/test_admin/admin/admin_views/person/', extra) + resp = self.client.get(changelist_url, extra) self.assertEqual(resp.context['selection_note'], '0 of 0 selected') self.assertEqual(resp.context['selection_note_all'], 'All 0 selected') with self.assertNumQueries(5): extra = {'q': 'person'} - resp = self.client.get('/test_admin/admin/admin_views/person/', extra) + resp = self.client.get(changelist_url, extra) self.assertEqual(resp.context['selection_note'], '0 of 2 selected') self.assertEqual(resp.context['selection_note_all'], 'All 2 selected') with self.assertNumQueries(5): extra = {'gender__exact': '1'} - resp = self.client.get('/test_admin/admin/admin_views/person/', extra) + resp = self.client.get(changelist_url, extra) self.assertEqual(resp.context['selection_note'], '0 of 1 selected') self.assertEqual(resp.context['selection_note_all'], '1 selected') def test_change_view(self): for i in self.pks: - response = self.client.get('/test_admin/admin/admin_views/emptymodel/%s/' % i) + response = self.client.get(reverse('admin:admin_views_emptymodel_change', args=(i,))) if i > 1: self.assertEqual(response.status_code, 200) else: @@ -3074,7 +3129,7 @@ class AdminCustomQuerysetTest(TestCase): "author": "Candidate, Best", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/coverletter/add/', + response = self.client.post(reverse('admin:admin_views_coverletter_add'), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(CoverLetter.objects.count(), 1) @@ -3092,7 +3147,7 @@ class AdminCustomQuerysetTest(TestCase): "content": "What's this SMS thing?", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/shortmessage/add/', + response = self.client.post(reverse('admin:admin_views_shortmessage_add'), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(ShortMessage.objects.count(), 1) @@ -3113,7 +3168,7 @@ class AdminCustomQuerysetTest(TestCase): "title": "Urgent telegram", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/telegram/add/', + response = self.client.post(reverse('admin:admin_views_telegram_add'), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Telegram.objects.count(), 1) @@ -3131,7 +3186,7 @@ class AdminCustomQuerysetTest(TestCase): "title": "My Modified Paper Title", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/paper/add/', + response = self.client.post(reverse('admin:admin_views_paper_add'), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Paper.objects.count(), 1) @@ -3148,14 +3203,14 @@ class AdminCustomQuerysetTest(TestCase): # model has __unicode__ method cl = CoverLetter.objects.create(author="John Doe") self.assertEqual(CoverLetter.objects.count(), 1) - response = self.client.get('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk) + response = self.client.get(reverse('admin:admin_views_coverletter_change', args=(cl.pk,))) self.assertEqual(response.status_code, 200) # Emulate model instance edit via the admin post_data = { "author": "John Doe II", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/coverletter/%s/' % cl.pk, + response = self.client.post(reverse('admin:admin_views_coverletter_change', args=(cl.pk,)), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(CoverLetter.objects.count(), 1) @@ -3170,14 +3225,14 @@ class AdminCustomQuerysetTest(TestCase): # model has no __unicode__ method sm = ShortMessage.objects.create(content="This is expensive") self.assertEqual(ShortMessage.objects.count(), 1) - response = self.client.get('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk) + response = self.client.get(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,))) self.assertEqual(response.status_code, 200) # Emulate model instance edit via the admin post_data = { "content": "Too expensive", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/shortmessage/%s/' % sm.pk, + response = self.client.post(reverse('admin:admin_views_shortmessage_change', args=(sm.pk,)), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(ShortMessage.objects.count(), 1) @@ -3195,14 +3250,14 @@ class AdminCustomQuerysetTest(TestCase): # model has __unicode__ method t = Telegram.objects.create(title="Frist Telegram") self.assertEqual(Telegram.objects.count(), 1) - response = self.client.get('/test_admin/admin/admin_views/telegram/%s/' % t.pk) + response = self.client.get(reverse('admin:admin_views_telegram_change', args=(t.pk,))) self.assertEqual(response.status_code, 200) # Emulate model instance edit via the admin post_data = { "title": "Telegram without typo", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/telegram/%s/' % t.pk, + response = self.client.post(reverse('admin:admin_views_telegram_change', args=(t.pk,)), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Telegram.objects.count(), 1) @@ -3217,14 +3272,14 @@ class AdminCustomQuerysetTest(TestCase): # model has no __unicode__ method p = Paper.objects.create(title="My Paper Title") self.assertEqual(Paper.objects.count(), 1) - response = self.client.get('/test_admin/admin/admin_views/paper/%s/' % p.pk) + response = self.client.get(reverse('admin:admin_views_paper_change', args=(p.pk,))) self.assertEqual(response.status_code, 200) # Emulate model instance edit via the admin post_data = { "title": "My Modified Paper Title", "_save": "Save", } - response = self.client.post('/test_admin/admin/admin_views/paper/%s/' % p.pk, + response = self.client.post(reverse('admin:admin_views_paper_change', args=(p.pk,)), post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Paper.objects.count(), 1) @@ -3244,18 +3299,21 @@ class AdminCustomQuerysetTest(TestCase): self.client.post(reverse('admin:login'), self.super_login) FilteredManager.objects.create(pk=1) FilteredManager.objects.create(pk=2) - response = self.client.get('/test_admin/admin/admin_views/filteredmanager/') + response = self.client.get(reverse('admin:admin_views_filteredmanager_changelist')) self.assertContains(response, "PK=1") self.assertContains(response, "PK=2") - self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/1/history/').status_code, 200) - self.assertEqual(self.client.get('/test_admin/admin/admin_views/filteredmanager/2/history/').status_code, 200) + self.assertEqual( + self.client.get(reverse('admin:admin_views_filteredmanager_history', args=(1,))).status_code, 200 + ) + self.assertEqual( + self.client.get(reverse('admin:admin_views_filteredmanager_history', args=(2,))).status_code, 200 + ) @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], ROOT_URLCONF="admin_views.urls") class AdminInlineFileUploadTest(TestCase): fixtures = ['admin-views-users.xml', 'admin-views-actions.xml'] - urlbit = 'admin' def setUp(self): self.client.login(username='super', password='secret') @@ -3291,7 +3349,9 @@ class AdminInlineFileUploadTest(TestCase): "pictures-1-name": "Test Picture 2", "pictures-1-image": "", } - response = self.client.post('/test_admin/%s/admin_views/gallery/%d/' % (self.urlbit, self.gallery.id), post_data) + response = self.client.post( + reverse('admin:admin_views_gallery_change', args=(self.gallery.id,)), post_data + ) self.assertContains(response, b"Currently") @@ -3395,7 +3455,7 @@ class AdminInlineTests(TestCase): "A simple model can be saved as inlines" # First add a new inline self.post_data['widget_set-0-name'] = "Widget 1" - collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Widget.objects.count(), 1) @@ -3428,7 +3488,7 @@ class AdminInlineTests(TestCase): "A model with an explicit autofield primary key can be saved as inlines. Regression for #8093" # First add a new inline self.post_data['grommet_set-0-name'] = "Grommet 1" - collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Grommet.objects.count(), 1) @@ -3461,7 +3521,7 @@ class AdminInlineTests(TestCase): # First add a new inline self.post_data['doohickey_set-0-code'] = "DH1" self.post_data['doohickey_set-0-name'] = "Doohickey 1" - collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(DooHickey.objects.count(), 1) @@ -3494,20 +3554,21 @@ class AdminInlineTests(TestCase): # First add a new inline self.post_data['whatsit_set-0-index'] = "42" self.post_data['whatsit_set-0-name'] = "Whatsit 1" - response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data) + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) + response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Whatsit.objects.count(), 1) self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1") # Check that the PK link exists on the rendered form - response = self.client.get('/test_admin/admin/admin_views/collector/1/') + response = self.client.get(collector_url) self.assertContains(response, 'name="whatsit_set-0-index"') # Now resave that inline self.post_data['whatsit_set-INITIAL_FORMS'] = "1" self.post_data['whatsit_set-0-index'] = "42" self.post_data['whatsit_set-0-name'] = "Whatsit 1" - response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data) + response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Whatsit.objects.count(), 1) self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1") @@ -3516,7 +3577,7 @@ class AdminInlineTests(TestCase): self.post_data['whatsit_set-INITIAL_FORMS'] = "1" self.post_data['whatsit_set-0-index'] = "42" self.post_data['whatsit_set-0-name'] = "Whatsit 1 Updated" - response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data) + response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(Whatsit.objects.count(), 1) self.assertEqual(Whatsit.objects.all()[0].name, "Whatsit 1 Updated") @@ -3525,7 +3586,7 @@ class AdminInlineTests(TestCase): "An inherited model can be saved as inlines. Regression for #11042" # First add a new inline self.post_data['fancydoodad_set-0-name'] = "Fancy Doodad 1" - collector_url = '/test_admin/admin/admin_views/collector/%d/' % self.collector.pk + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) response = self.client.post(collector_url, self.post_data) self.assertEqual(response.status_code, 302) self.assertEqual(FancyDoodad.objects.count(), 1) @@ -3599,7 +3660,8 @@ class AdminInlineTests(TestCase): "category_set-6-id": "", "category_set-6-collector": "1", }) - response = self.client.post('/test_admin/admin/admin_views/collector/1/', self.post_data) + collector_url = reverse('admin:admin_views_collector_change', args=(self.collector.pk,)) + response = self.client.post(collector_url, self.post_data) # Successful post will redirect self.assertEqual(response.status_code, 302) @@ -3621,64 +3683,64 @@ class NeverCacheTests(TestCase): def test_admin_index(self): "Check the never-cache status of the main index" - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) self.assertEqual(get_max_age(response), 0) def test_app_index(self): "Check the never-cache status of an application index" - response = self.client.get('/test_admin/admin/admin_views/') + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertEqual(get_max_age(response), 0) def test_model_index(self): "Check the never-cache status of a model index" - response = self.client.get('/test_admin/admin/admin_views/fabric/') + response = self.client.get(reverse('admin:admin_views_fabric_changelist')) self.assertEqual(get_max_age(response), 0) def test_model_add(self): "Check the never-cache status of a model add page" - response = self.client.get('/test_admin/admin/admin_views/fabric/add/') + response = self.client.get(reverse('admin:admin_views_fabric_add')) self.assertEqual(get_max_age(response), 0) def test_model_view(self): "Check the never-cache status of a model edit page" - response = self.client.get('/test_admin/admin/admin_views/section/1/') + response = self.client.get(reverse('admin:admin_views_section_change', args=(1,))) self.assertEqual(get_max_age(response), 0) def test_model_history(self): "Check the never-cache status of a model history page" - response = self.client.get('/test_admin/admin/admin_views/section/1/history/') + response = self.client.get(reverse('admin:admin_views_section_history', args=(1,))) self.assertEqual(get_max_age(response), 0) def test_model_delete(self): "Check the never-cache status of a model delete page" - response = self.client.get('/test_admin/admin/admin_views/section/1/delete/') + response = self.client.get(reverse('admin:admin_views_section_delete', args=(1,))) self.assertEqual(get_max_age(response), 0) def test_login(self): "Check the never-cache status of login views" self.client.logout() - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) self.assertEqual(get_max_age(response), 0) def test_logout(self): "Check the never-cache status of logout view" - response = self.client.get('/test_admin/admin/logout/') + response = self.client.get(reverse('admin:logout')) self.assertEqual(get_max_age(response), 0) def test_password_change(self): "Check the never-cache status of the password change view" self.client.logout() - response = self.client.get('/test_admin/password_change/') + response = self.client.get(reverse('admin:password_change')) self.assertEqual(get_max_age(response), None) def test_password_change_done(self): "Check the never-cache status of the password change done view" - response = self.client.get('/test_admin/admin/password_change/done/') + response = self.client.get(reverse('admin:password_change_done')) self.assertEqual(get_max_age(response), None) def test_JS_i18n(self): "Check the never-cache status of the JavaScript i18n view" - response = self.client.get('/test_admin/admin/jsi18n/') + response = self.client.get(reverse('admin:jsi18n')) self.assertEqual(get_max_age(response), None) @@ -3691,14 +3753,14 @@ class PrePopulatedTest(TestCase): self.client.login(username='super', password='secret') def test_prepopulated_on(self): - response = self.client.get('/test_admin/admin/admin_views/prepopulatedpost/add/') + response = self.client.get(reverse('admin:admin_views_prepopulatedpost_add')) self.assertEqual(response.status_code, 200) self.assertContains(response, "id: '#id_slug',") self.assertContains(response, "field['dependency_ids'].push('#id_title');") self.assertContains(response, "id: '#id_prepopulatedsubpost_set-0-subslug',") def test_prepopulated_off(self): - response = self.client.get('/test_admin/admin/admin_views/prepopulatedpost/1/') + response = self.client.get(reverse('admin:admin_views_prepopulatedpost_change', args=(1,))) self.assertEqual(response.status_code, 200) self.assertContains(response, "A Long Title") self.assertNotContains(response, "id: '#id_slug'") @@ -3711,7 +3773,7 @@ class PrePopulatedTest(TestCase): Regression test for #15938: if USE_THOUSAND_SEPARATOR is set, make sure that maxLength (in the JavaScript) is rendered without separators. """ - response = self.client.get('/test_admin/admin/admin_views/prepopulatedpostlargeslug/add/') + response = self.client.get(reverse('admin:admin_views_prepopulatedpostlargeslug_add')) self.assertContains(response, "maxLength: 1000") # instead of 1,000 @@ -3729,9 +3791,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): main form and with stacked and tabular inlines. Refs #13068, #9264, #9983, #9784. """ - self.admin_login(username='super', password='secret', login_url='/test_admin/admin/') + self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get('%s%s' % (self.live_server_url, - '/test_admin/admin/admin_views/mainprepopulated/add/')) + reverse('admin:admin_views_mainprepopulated_add'))) # Main form ---------------------------------------------------------- self.selenium.find_element_by_css_selector('#id_pubdate').send_keys('2012-02-18') @@ -3839,11 +3901,11 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): ) self.admin_login(username='super', password='secret', - login_url='/test_admin/admin/') + login_url=reverse('admin:index')) object_url = '%s%s' % ( self.live_server_url, - '/test_admin/admin/admin_views/mainprepopulated/{}/'.format(item.id)) + reverse('admin:admin_views_mainprepopulated_change', args=(item.id,))) self.selenium.get(object_url) self.selenium.find_element_by_css_selector('#id_name').send_keys(' the best') @@ -3872,9 +3934,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): Test that the 'collapse' class in fieldsets definition allows to show/hide the appropriate field section. """ - self.admin_login(username='super', password='secret', login_url='/test_admin/admin/') + self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get('%s%s' % (self.live_server_url, - '/test_admin/admin/admin_views/article/add/')) + reverse('admin:admin_views_article_add'))) self.assertFalse(self.selenium.find_element_by_id('id_title').is_displayed()) self.selenium.find_elements_by_link_text('Show')[0].click() self.assertTrue(self.selenium.find_element_by_id('id_title').is_displayed()) @@ -3886,9 +3948,9 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): def test_first_field_focus(self): """JavaScript-assisted auto-focus on first usable form field.""" # First form field has a single widget - self.admin_login(username='super', password='secret', login_url='/test_admin/admin/') + self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get('%s%s' % (self.live_server_url, - '/test_admin/admin/admin_views/picture/add/')) + reverse('admin:admin_views_picture_add'))) self.assertEqual( self.selenium.switch_to.active_element, self.selenium.find_element_by_id('id_name') @@ -3896,7 +3958,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): # First form field has a MultiWidget self.selenium.get('%s%s' % (self.live_server_url, - '/test_admin/admin/admin_views/reservation/add/')) + reverse('admin:admin_views_reservation_add'))) self.assertEqual( self.selenium.switch_to.active_element, self.selenium.find_element_by_id('id_start_date_0') @@ -3907,7 +3969,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): pizza = Pizza.objects.create(name="Double Cheese") url = reverse('admin:admin_views_pizza_change', args=(pizza.id,)) full_url = '%s%s' % (self.live_server_url, url) - self.admin_login(username='super', password='secret', login_url='/test_admin/admin/') + self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(full_url) self.selenium.find_element_by_class_name('deletelink').click() self.selenium.find_element_by_class_name('cancel-link').click() @@ -3926,7 +3988,7 @@ class SeleniumAdminViewsFirefoxTests(AdminSeleniumWebDriverTestCase): pizza.toppings.add(topping1, topping2) url = reverse('admin:admin_views_pizza_change', args=(pizza.id,)) full_url = '%s%s' % (self.live_server_url, url) - self.admin_login(username='super', password='secret', login_url='/test_admin/admin/') + self.admin_login(username='super', password='secret', login_url=reverse('admin:index')) self.selenium.get(full_url) self.selenium.find_element_by_class_name('deletelink').click() self.selenium.find_element_by_class_name('cancel-link').click() @@ -3953,7 +4015,7 @@ class ReadonlyTest(TestCase): self.client.login(username='super', password='secret') def test_readonly_get(self): - response = self.client.get('/test_admin/admin/admin_views/post/add/') + response = self.client.get(reverse('admin:admin_views_post_add')) self.assertEqual(response.status_code, 200) self.assertNotContains(response, 'name="posted"') # 3 fields + 2 submit buttons + 5 inline management form fields, + 2 @@ -3985,7 +4047,7 @@ class ReadonlyTest(TestCase): self.assertContains(response, '<p class="help">Some help text for the date (with unicode ŠĐĆŽćžšđ)</p>', html=True) p = Post.objects.create(title="I worked on readonly_fields", content="Its good stuff") - response = self.client.get('/test_admin/admin/admin_views/post/%d/' % p.pk) + response = self.client.get(reverse('admin:admin_views_post_change', args=(p.pk,))) self.assertContains(response, "%d amount of cool" % p.pk) def test_readonly_post(self): @@ -3996,14 +4058,14 @@ class ReadonlyTest(TestCase): "link_set-INITIAL_FORMS": "0", "link_set-MAX_NUM_FORMS": "0", } - response = self.client.post('/test_admin/admin/admin_views/post/add/', data) + response = self.client.post(reverse('admin:admin_views_post_add'), data) self.assertEqual(response.status_code, 302) self.assertEqual(Post.objects.count(), 1) p = Post.objects.get() self.assertEqual(p.posted, datetime.date.today()) data["posted"] = "10-8-1990" # some date that's not today - response = self.client.post('/test_admin/admin/admin_views/post/add/', data) + response = self.client.post(reverse('admin:admin_views_post_add'), data) self.assertEqual(response.status_code, 302) self.assertEqual(Post.objects.count(), 2) p = Post.objects.order_by('-id')[0] @@ -4011,12 +4073,12 @@ class ReadonlyTest(TestCase): def test_readonly_manytomany(self): "Regression test for #13004" - response = self.client.get('/test_admin/admin/admin_views/pizza/add/') + response = self.client.get(reverse('admin:admin_views_pizza_add')) self.assertEqual(response.status_code, 200) def test_user_password_change_limited_queryset(self): su = User.objects.filter(is_superuser=True)[0] - response = self.client.get('/test_admin/admin2/auth/user/%s/password/' % su.pk) + response = self.client.get(reverse('admin2:auth_user_password_change', args=(su.pk,))) self.assertEqual(response.status_code, 404) def test_change_form_renders_correct_null_choice_value(self): @@ -4024,7 +4086,7 @@ class ReadonlyTest(TestCase): Regression test for #17911. """ choice = Choice.objects.create(choice=None) - response = self.client.get('/test_admin/admin/admin_views/choice/%s/' % choice.pk) + response = self.client.get(reverse('admin:admin_views_choice_change', args=(choice.pk,))) self.assertContains(response, '<p>No opinion</p>', html=True) self.assertNotContains(response, '<p>(None)</p>') @@ -4036,7 +4098,7 @@ class ReadonlyTest(TestCase): topping = Topping.objects.create(name='Salami') pizza = Pizza.objects.create(name='Americano') pizza.toppings.add(topping) - response = self.client.get('/test_admin/admin/admin_views/topping/add/') + response = self.client.get(reverse('admin:admin_views_topping_add')) self.assertEqual(response.status_code, 200) def test_readonly_field_overrides(self): @@ -4045,7 +4107,7 @@ class ReadonlyTest(TestCase): AdminReadonlyField """ p = FieldOverridePost.objects.create(title="Test Post", content="Test Content") - response = self.client.get('/test_admin/admin/admin_views/fieldoverridepost/%d/' % p.pk) + response = self.client.get(reverse('admin:admin_views_fieldoverridepost_change', args=(p.pk,))) self.assertEqual(response.status_code, 200) self.assertContains(response, '<p class="help">Overridden help text for the date</p>') self.assertContains(response, '<label for="id_public">Overridden public label:</label>', html=True) @@ -4070,7 +4132,7 @@ class LimitChoicesToInAdminTest(TestCase): username='marley', last_action=datetime.datetime.today() - datetime.timedelta(days=1), ) - response = self.client.get('/test_admin/admin/admin_views/stumpjoke/add/') + response = self.client.get(reverse('admin:admin_views_stumpjoke_add')) # The allowed option should appear twice; the limited option should not appear. self.assertContains(response, threepwood.username, count=2) self.assertNotContains(response, marley.username) @@ -4093,7 +4155,7 @@ class RawIdFieldsTest(TestCase): Inquisition.objects.create(expected=False, leader=actor, country="Spain") - response = self.client.get('/test_admin/admin/admin_views/sketch/add/') + response = self.client.get(reverse('admin:admin_views_sketch_add')) # Find the link m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_inquisition"', response.content) self.assertTrue(m) # Got a match @@ -4116,7 +4178,7 @@ class RawIdFieldsTest(TestCase): """Regression test for 20182""" Actor.objects.create(name="Palin", age=27) Actor.objects.create(name="Kilbraken", age=50, title="Judge") - response = self.client.get('/test_admin/admin/admin_views/sketch/add/') + response = self.client.get(reverse('admin:admin_views_sketch_add')) # Find the link m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_defendant0"', response.content) self.assertTrue(m) # Got a match @@ -4136,7 +4198,7 @@ class RawIdFieldsTest(TestCase): """Regression test for 20182""" Actor.objects.create(name="Palin", age=27) Actor.objects.create(name="Kilbraken", age=50, title="Judge") - response = self.client.get('/test_admin/admin/admin_views/sketch/add/') + response = self.client.get(reverse('admin:admin_views_sketch_add')) # Find the link m = re.search(br'<a href="([^"]*)"[^>]* id="lookup_id_defendant1"', response.content) self.assertTrue(m) # Got a match @@ -4166,31 +4228,31 @@ class UserAdminTest(TestCase): def test_save_button(self): user_count = User.objects.count() - response = self.client.post('/test_admin/admin/auth/user/add/', { + response = self.client.post(reverse('admin:auth_user_add'), { 'username': 'newuser', 'password1': 'newpassword', 'password2': 'newpassword', }) new_user = User.objects.order_by('-id')[0] - self.assertRedirects(response, '/test_admin/admin/auth/user/%s/' % new_user.pk) + self.assertRedirects(response, reverse('admin:auth_user_change', args=(new_user.pk,))) self.assertEqual(User.objects.count(), user_count + 1) self.assertTrue(new_user.has_usable_password()) def test_save_continue_editing_button(self): user_count = User.objects.count() - response = self.client.post('/test_admin/admin/auth/user/add/', { + response = self.client.post(reverse('admin:auth_user_add'), { 'username': 'newuser', 'password1': 'newpassword', 'password2': 'newpassword', '_continue': '1', }) new_user = User.objects.order_by('-id')[0] - self.assertRedirects(response, '/test_admin/admin/auth/user/%s/' % new_user.pk) + self.assertRedirects(response, reverse('admin:auth_user_change', args=(new_user.pk,))) self.assertEqual(User.objects.count(), user_count + 1) self.assertTrue(new_user.has_usable_password()) def test_password_mismatch(self): - response = self.client.post('/test_admin/admin/auth/user/add/', { + response = self.client.post(reverse('admin:auth_user_add'), { 'username': 'newuser', 'password1': 'newpassword', 'password2': 'mismatch', @@ -4203,11 +4265,11 @@ class UserAdminTest(TestCase): def test_user_fk_add_popup(self): """User addition through a FK popup should return the appropriate JavaScript response.""" - response = self.client.get('/test_admin/admin/admin_views/album/add/') + response = self.client.get(reverse('admin:admin_views_album_add')) self.assertEqual(response.status_code, 200) - self.assertContains(response, '/test_admin/admin/auth/user/add') + self.assertContains(response, reverse('admin:auth_user_add')) self.assertContains(response, 'class="related-widget-wrapper-link add-related" id="add_id_owner"') - response = self.client.get('/test_admin/admin/auth/user/add/?_popup=1') + response = self.client.get(reverse('admin:auth_user_add') + '?_popup=1') self.assertEqual(response.status_code, 200) self.assertNotContains(response, 'name="_continue"') self.assertNotContains(response, 'name="_addanother"') @@ -4218,18 +4280,18 @@ class UserAdminTest(TestCase): '_popup': '1', '_save': '1', } - response = self.client.post('/test_admin/admin/auth/user/add/?_popup=1', data, follow=True) + response = self.client.post(reverse('admin:auth_user_add') + '?_popup=1', data, follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, 'dismissAddRelatedObjectPopup') def test_user_fk_change_popup(self): """User change through a FK popup should return the appropriate JavaScript response.""" - response = self.client.get('/test_admin/admin/admin_views/album/add/') + response = self.client.get(reverse('admin:admin_views_album_add')) self.assertEqual(response.status_code, 200) - self.assertContains(response, '/test_admin/admin/auth/user/__fk__/') + self.assertContains(response, reverse('admin:auth_user_change', args=('__fk__',))) self.assertContains(response, 'class="related-widget-wrapper-link change-related" id="change_id_owner"') user = User.objects.get(username='changeuser') - url = "/test_admin/admin/auth/user/%s/?_popup=1" % user.pk + url = reverse('admin:auth_user_change', args=(user.pk,)) + '?_popup=1' response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertNotContains(response, 'name="_continue"') @@ -4251,12 +4313,12 @@ class UserAdminTest(TestCase): def test_user_fk_delete_popup(self): """User deletion through a FK popup should return the appropriate JavaScript response.""" - response = self.client.get('/test_admin/admin/admin_views/album/add/') + response = self.client.get(reverse('admin:admin_views_album_add')) self.assertEqual(response.status_code, 200) - self.assertContains(response, '/test_admin/admin/auth/user/__fk__/delete/') + self.assertContains(response, reverse('admin:auth_user_delete', args=('__fk__',))) self.assertContains(response, 'class="related-widget-wrapper-link change-related" id="change_id_owner"') user = User.objects.get(username='changeuser') - url = "/test_admin/admin/auth/user/%s/delete/?_popup=1" % user.pk + url = reverse('admin:auth_user_delete', args=(user.pk,)) + '?_popup=1' response = self.client.get(url) self.assertEqual(response.status_code, 200) data = { @@ -4269,14 +4331,14 @@ class UserAdminTest(TestCase): def test_save_add_another_button(self): user_count = User.objects.count() - response = self.client.post('/test_admin/admin/auth/user/add/', { + response = self.client.post(reverse('admin:auth_user_add'), { 'username': 'newuser', 'password1': 'newpassword', 'password2': 'newpassword', '_addanother': '1', }) new_user = User.objects.order_by('-id')[0] - self.assertRedirects(response, '/test_admin/admin/auth/user/add/') + self.assertRedirects(response, reverse('admin:auth_user_add')) self.assertEqual(User.objects.count(), user_count + 1) self.assertTrue(new_user.has_usable_password()) @@ -4287,12 +4349,12 @@ class UserAdminTest(TestCase): ContentType.objects.clear_cache() with self.assertNumQueries(10): - response = self.client.get('/test_admin/admin/auth/user/%s/' % u.pk) + response = self.client.get(reverse('admin:auth_user_change', args=(u.pk,))) self.assertEqual(response.status_code, 200) def test_form_url_present_in_context(self): u = User.objects.all()[0] - response = self.client.get('/test_admin/admin3/auth/user/%s/password/' % u.pk) + response = self.client.get(reverse('admin3:auth_user_password_change', args=(u.pk,))) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['form_url'], 'pony') @@ -4310,12 +4372,12 @@ class GroupAdminTest(TestCase): def test_save_button(self): group_count = Group.objects.count() - response = self.client.post('/test_admin/admin/auth/group/add/', { + response = self.client.post(reverse('admin:auth_group_add'), { 'name': 'newgroup', }) Group.objects.order_by('-id')[0] - self.assertRedirects(response, '/test_admin/admin/auth/group/') + self.assertRedirects(response, reverse('admin:auth_group_changelist')) self.assertEqual(Group.objects.count(), group_count + 1) def test_group_permission_performance(self): @@ -4325,7 +4387,7 @@ class GroupAdminTest(TestCase): ContentType.objects.clear_cache() with self.assertNumQueries(8): - response = self.client.get('/test_admin/admin/auth/group/%s/' % g.pk) + response = self.client.get(reverse('admin:auth_group_change', args=(g.pk,))) self.assertEqual(response.status_code, 200) @@ -4342,7 +4404,7 @@ class CSSTest(TestCase): Ensure that fields have a CSS class name with a 'field-' prefix. Refs #16371. """ - response = self.client.get('/test_admin/admin/admin_views/post/add/') + response = self.client.get(reverse('admin:admin_views_post_add')) # The main form self.assertContains(response, 'class="form-row field-title"') @@ -4364,13 +4426,13 @@ class CSSTest(TestCase): Refs #17050. """ # General index page - response = self.client.get("/test_admin/admin/") + response = self.client.get(reverse('admin:index')) self.assertContains(response, '<div class="app-admin_views module">') self.assertContains(response, '<tr class="model-actor">') self.assertContains(response, '<tr class="model-album">') # App index page - response = self.client.get("/test_admin/admin/admin_views/") + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertContains(response, '<div class="app-admin_views module">') self.assertContains(response, '<tr class="model-actor">') self.assertContains(response, '<tr class="model-album">') @@ -4379,7 +4441,7 @@ class CSSTest(TestCase): """ Ensure app and model tag are correctly read by change_form template """ - response = self.client.get('/test_admin/admin/admin_views/section/add/') + response = self.client.get(reverse('admin:admin_views_section_add')) self.assertEqual(response.status_code, 200) self.assertContains(response, '<body class=" app-admin_views model-section ') @@ -4388,7 +4450,7 @@ class CSSTest(TestCase): """ Ensure app and model tag are correctly read by change_list template """ - response = self.client.get('/test_admin/admin/admin_views/section/') + response = self.client.get(reverse('admin:admin_views_section_changelist')) self.assertEqual(response.status_code, 200) self.assertContains(response, '<body class=" app-admin_views model-section ') @@ -4399,7 +4461,7 @@ class CSSTest(TestCase): template """ response = self.client.get( - '/test_admin/admin/admin_views/section/1/delete/') + reverse('admin:admin_views_section_delete', args=(1,))) self.assertEqual(response.status_code, 200) self.assertContains(response, '<body class=" app-admin_views model-section ') @@ -4408,7 +4470,7 @@ class CSSTest(TestCase): """ Ensure app and model tag are correctly read by app_index template """ - response = self.client.get('/test_admin/admin/admin_views/') + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertEqual(response.status_code, 200) self.assertContains(response, '<body class=" dashboard app-admin_views') @@ -4422,7 +4484,7 @@ class CSSTest(TestCase): 'action': 'delete_selected', 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/section/', + response = self.client.post(reverse('admin:admin_views_section_changelist'), action_data) self.assertEqual(response.status_code, 200) self.assertContains(response, @@ -4435,7 +4497,7 @@ class CSSTest(TestCase): """ Podcast.objects.create(name="Django Dose", release_date=datetime.date.today()) - response = self.client.get('/test_admin/admin/admin_views/podcast/') + response = self.client.get(reverse('admin:admin_views_podcast_changelist')) self.assertContains( response, '<th class="field-name">') self.assertContains( @@ -4461,7 +4523,7 @@ class AdminDocsTest(TestCase): self.client.login(username='super', password='secret') def test_tags(self): - response = self.client.get('/test_admin/admin/doc/tags/') + response = self.client.get(reverse('django-admindocs-tags')) # The builtin tag group exists self.assertContains(response, "<h2>Built-in tags</h2>", count=2, html=True) @@ -4482,7 +4544,7 @@ class AdminDocsTest(TestCase): self.assertContains(response, '<li><a href="#admin_list-admin_actions">admin_actions</a></li>', html=True) def test_filters(self): - response = self.client.get('/test_admin/admin/doc/filters/') + response = self.client.get(reverse('django-admindocs-filters')) # The builtin filter group exists self.assertContains(response, "<h2>Built-in filters</h2>", count=2, html=True) @@ -4511,13 +4573,12 @@ class AdminDocsTest(TestCase): ) class ValidXHTMLTests(TestCase): fixtures = ['admin-views-users.xml'] - urlbit = 'admin' def setUp(self): self.client.login(username='super', password='secret') def test_lang_name_present(self): - response = self.client.get('/test_admin/%s/admin_views/' % self.urlbit) + response = self.client.get(reverse('admin:app_list', args=('admin_views',))) self.assertNotContains(response, ' lang=""') self.assertNotContains(response, ' xml:lang=""') @@ -4665,7 +4726,7 @@ class AdminCustomSaveRelatedTests(TestCase): 'child_set-0-name': 'Paul', 'child_set-1-name': 'Catherine', } - self.client.post('/test_admin/admin/admin_views/parent/add/', post) + self.client.post(reverse('admin:admin_views_parent_add'), post) self.assertEqual(1, Parent.objects.count()) self.assertEqual(2, Child.objects.count()) @@ -4687,7 +4748,7 @@ class AdminCustomSaveRelatedTests(TestCase): 'child_set-1-name': 'Catherine', 'child_set-1-id': catherine.id, } - self.client.post('/test_admin/admin/admin_views/parent/%s/' % parent.id, post) + self.client.post(reverse('admin:admin_views_parent_change', args=(parent.id,)), post) children_names = list(Child.objects.order_by('name').values_list('name', flat=True)) @@ -4707,7 +4768,7 @@ class AdminCustomSaveRelatedTests(TestCase): '_save': 'Save' } - self.client.post('/test_admin/admin/admin_views/parent/', post) + self.client.post(reverse('admin:admin_views_parent_changelist'), post) children_names = list(Child.objects.order_by('name').values_list('name', flat=True)) self.assertEqual('Josh Stone', Parent.objects.latest('id').name) @@ -4723,21 +4784,21 @@ class AdminViewLogoutTest(TestCase): self.client.login(username='super', password='secret') def test_client_logout_url_can_be_used_to_login(self): - response = self.client.get('/test_admin/admin/logout/') + response = self.client.get(reverse('admin:logout')) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'registration/logged_out.html') - self.assertEqual(response.request['PATH_INFO'], '/test_admin/admin/logout/') + self.assertEqual(response.request['PATH_INFO'], reverse('admin:logout')) # we are now logged out - response = self.client.get('/test_admin/admin/logout/') + response = self.client.get(reverse('admin:logout')) self.assertEqual(response.status_code, 302) # we should be redirected to the login page. # follow the redirect and test results. - response = self.client.get('/test_admin/admin/logout/', follow=True) + response = self.client.get(reverse('admin:logout'), follow=True) self.assertEqual(response.status_code, 200) self.assertTemplateUsed(response, 'admin/login.html') - self.assertEqual(response.request['PATH_INFO'], '/test_admin/admin/login/') - self.assertContains(response, '<input type="hidden" name="next" value="/test_admin/admin/" />') + self.assertEqual(response.request['PATH_INFO'], reverse('admin:login')) + self.assertContains(response, '<input type="hidden" name="next" value="%s" />' % reverse('admin:index')) @override_settings(PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'], @@ -4759,7 +4820,7 @@ class AdminUserMessageTest(TestCase): 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/usermessenger/', + response = self.client.post(reverse('admin:admin_views_usermessenger_changelist'), action_data, follow=True) self.assertContains(response, '<li class="%s">Test %s</li>' % (level, level), @@ -4788,7 +4849,7 @@ class AdminUserMessageTest(TestCase): 'index': 0, } - response = self.client.post('/test_admin/admin/admin_views/usermessenger/', + response = self.client.post(reverse('admin:admin_views_usermessenger_changelist'), action_data, follow=True) self.assertContains(response, '<li class="extra_tag info">Test tags</li>', @@ -4828,34 +4889,35 @@ class AdminKeepChangeListFiltersTests(TestCase): def test_assert_url_equal(self): # Test equality. + change_user_url = reverse('admin:auth_user_change', args=(105,)) self.assertURLEqual( - 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0', - 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0' + 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url), + 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url) ) # Test inequality. with self.assertRaises(AssertionError): self.assertURLEqual( - 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0', - 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D1%26is_superuser__exact%3D1' + 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url), + 'http://testserver{}?_changelist_filters=is_staff__exact%3D1%26is_superuser__exact%3D1'.format(change_user_url) ) # Ignore scheme and host. self.assertURLEqual( - 'http://testserver/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0', - '/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0' + 'http://testserver{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url), + '{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url) ) # Ignore ordering of querystring. self.assertURLEqual( - '/test_admin/admin/auth/user/?is_staff__exact=0&is_superuser__exact=0', - '/test_admin/admin/auth/user/?is_superuser__exact=0&is_staff__exact=0' + '{}?is_staff__exact=0&is_superuser__exact=0'.format(reverse('admin:auth_user_changelist')), + '{}?is_superuser__exact=0&is_staff__exact=0'.format(reverse('admin:auth_user_changelist')) ) # Ignore ordering of _changelist_filters. self.assertURLEqual( - '/test_admin/admin/auth/user/105/?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0', - '/test_admin/admin/auth/user/105/?_changelist_filters=is_superuser__exact%3D0%26is_staff__exact%3D0' + '{}?_changelist_filters=is_staff__exact%3D0%26is_superuser__exact%3D0'.format(change_user_url), + '{}?_changelist_filters=is_superuser__exact%3D0%26is_staff__exact%3D0'.format(change_user_url) ) def get_changelist_filters(self): @@ -5089,19 +5151,19 @@ class TestLabelVisibility(TestCase): self.client.login(username='super', password='secret') def test_all_fields_visible(self): - response = self.client.get('/test_admin/admin/admin_views/emptymodelvisible/add/') + response = self.client.get(reverse('admin:admin_views_emptymodelvisible_add')) self.assert_fieldline_visible(response) self.assert_field_visible(response, 'first') self.assert_field_visible(response, 'second') def test_all_fields_hidden(self): - response = self.client.get('/test_admin/admin/admin_views/emptymodelhidden/add/') + response = self.client.get(reverse('admin:admin_views_emptymodelhidden_add')) self.assert_fieldline_hidden(response) self.assert_field_hidden(response, 'first') self.assert_field_hidden(response, 'second') def test_mixin(self): - response = self.client.get('/test_admin/admin/admin_views/emptymodelmixin/add/') + response = self.client.get(reverse('admin:admin_views_emptymodelmixin_add')) self.assert_fieldline_visible(response) self.assert_field_hidden(response, 'first') self.assert_field_visible(response, 'second') @@ -5143,7 +5205,7 @@ class AdminViewOnSiteTests(TestCase): "dependentchild_set-0-id": "", "dependentchild_set-0-parent": "", "dependentchild_set-0-family_name": "Test2"} - response = self.client.post('/test_admin/admin/admin_views/parentwithdependentchildren/add/', + response = self.client.post(reverse('admin:admin_views_parentwithdependentchildren_add'), post_data) # just verifying the parent form failed validation, as expected -- @@ -5173,8 +5235,9 @@ class AdminViewOnSiteTests(TestCase): "dependentchild_set-0-id": "", "dependentchild_set-0-parent": str(pwdc.id), "dependentchild_set-0-family_name": "Test1"} - response = self.client.post('/test_admin/admin/admin_views/parentwithdependentchildren/%d/' - % pwdc.id, post_data) + response = self.client.post( + reverse('admin:admin_views_parentwithdependentchildren_change', args=(pwdc.id,)), post_data + ) # just verifying the parent form failed validation, as expected -- # this isn't the regression test @@ -5209,27 +5272,21 @@ class AdminViewOnSiteTests(TestCase): def test_false(self): "Ensure that the 'View on site' button is not displayed if view_on_site is False" - response = self.client.get('/test_admin/admin/admin_views/restaurant/1/') + response = self.client.get(reverse('admin:admin_views_restaurant_change', args=(1,))) content_type_pk = ContentType.objects.get_for_model(Restaurant).pk - self.assertNotContains(response, - '"/test_admin/admin/r/%s/1/"' % content_type_pk, - ) + self.assertNotContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1))) def test_true(self): "Ensure that the default behavior is followed if view_on_site is True" - response = self.client.get('/test_admin/admin/admin_views/city/1/') + response = self.client.get(reverse('admin:admin_views_city_change', args=(1,))) content_type_pk = ContentType.objects.get_for_model(City).pk - self.assertContains(response, - '"/test_admin/admin/r/%s/1/"' % content_type_pk, - ) + self.assertContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1))) def test_callable(self): "Ensure that the right link is displayed if view_on_site is a callable" - response = self.client.get('/test_admin/admin/admin_views/worker/1/') + response = self.client.get(reverse('admin:admin_views_worker_change', args=(1,))) worker = Worker.objects.get(pk=1) - self.assertContains(response, - '"/worker/%s/%s/"' % (worker.surname, worker.name), - ) + self.assertContains(response, '"/worker/%s/%s/"' % (worker.surname, worker.name)) def test_missing_get_absolute_url(self): "Ensure None is returned if model doesn't have get_absolute_url" @@ -5247,27 +5304,21 @@ class InlineAdminViewOnSiteTest(TestCase): def test_false(self): "Ensure that the 'View on site' button is not displayed if view_on_site is False" - response = self.client.get('/test_admin/admin/admin_views/state/1/') + response = self.client.get(reverse('admin:admin_views_state_change', args=(1,))) content_type_pk = ContentType.objects.get_for_model(City).pk - self.assertNotContains(response, - '/test_admin/admin/r/%s/1/' % content_type_pk, - ) + self.assertNotContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1))) def test_true(self): "Ensure that the 'View on site' button is displayed if view_on_site is True" - response = self.client.get('/test_admin/admin/admin_views/city/1/') + response = self.client.get(reverse('admin:admin_views_city_change', args=(1,))) content_type_pk = ContentType.objects.get_for_model(Restaurant).pk - self.assertContains(response, - '/test_admin/admin/r/%s/1/' % content_type_pk, - ) + self.assertContains(response, reverse('admin:view_on_site', args=(content_type_pk, 1))) def test_callable(self): "Ensure that the right link is displayed if view_on_site is a callable" - response = self.client.get('/test_admin/admin/admin_views/restaurant/1/') + response = self.client.get(reverse('admin:admin_views_restaurant_change', args=(1,))) worker = Worker.objects.get(pk=1) - self.assertContains(response, - '"/worker_inline/%s/%s/"' % (worker.surname, worker.name), - ) + self.assertContains(response, '"/worker_inline/%s/%s/"' % (worker.surname, worker.name)) @override_settings(ROOT_URLCONF="admin_views.urls") @@ -5276,12 +5327,12 @@ class TestEtagWithAdminView(TestCase): def test_admin(self): with self.settings(USE_ETAGS=False): - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) self.assertEqual(response.status_code, 302) self.assertFalse(response.has_header('ETag')) with self.settings(USE_ETAGS=True): - response = self.client.get('/test_admin/admin/') + response = self.client.get(reverse('admin:index')) self.assertEqual(response.status_code, 302) self.assertTrue(response.has_header('ETag')) @@ -5305,30 +5356,18 @@ class GetFormsetsWithInlinesArgumentTest(TestCase): def test_explicitly_provided_pk(self): post_data = {'name': '1'} - try: - response = self.client.post('/test_admin/admin/admin_views/explicitlyprovidedpk/add/', post_data) - except Exception as e: - self.fail(e) + response = self.client.post(reverse('admin:admin_views_explicitlyprovidedpk_add'), post_data) self.assertEqual(response.status_code, 302) post_data = {'name': '2'} - try: - response = self.client.post('/test_admin/admin/admin_views/explicitlyprovidedpk/1/', post_data) - except Exception as e: - self.fail(e) + response = self.client.post(reverse('admin:admin_views_explicitlyprovidedpk_change', args=(1,)), post_data) self.assertEqual(response.status_code, 302) def test_implicitly_generated_pk(self): post_data = {'name': '1'} - try: - response = self.client.post('/test_admin/admin/admin_views/implicitlygeneratedpk/add/', post_data) - except Exception as e: - self.fail(e) + response = self.client.post(reverse('admin:admin_views_implicitlygeneratedpk_add'), post_data) self.assertEqual(response.status_code, 302) post_data = {'name': '2'} - try: - response = self.client.post('/test_admin/admin/admin_views/implicitlygeneratedpk/1/', post_data) - except Exception as e: - self.fail(e) + response = self.client.post(reverse('admin:admin_views_implicitlygeneratedpk_change', args=(1,)), post_data) self.assertEqual(response.status_code, 302) diff --git a/tests/admin_views/urls.py b/tests/admin_views/urls.py index 17dc02d102..ba6a89424b 100644 --- a/tests/admin_views/urls.py +++ b/tests/admin_views/urls.py @@ -4,10 +4,10 @@ from . import admin, custom_has_permission_admin, customadmin, views urlpatterns = [ url(r'^test_admin/admin/doc/', include('django.contrib.admindocs.urls')), - url(r'^test_admin/admin/secure-view/$', views.secure_view), + url(r'^test_admin/admin/secure-view/$', views.secure_view, name='secure_view'), url(r'^test_admin/admin/', include(admin.site.urls)), url(r'^test_admin/admin2/', include(customadmin.site.urls)), - url(r'^test_admin/admin3/', include(admin.site.urls), dict(form_url='pony')), + url(r'^test_admin/admin3/', include(admin.site.get_urls(), 'admin3', 'admin'), dict(form_url='pony')), url(r'^test_admin/admin4/', include(customadmin.simple_site.urls)), url(r'^test_admin/admin5/', include(admin.site2.urls)), url(r'^test_admin/admin7/', include(admin.site7.urls)), diff --git a/tests/admin_widgets/tests.py b/tests/admin_widgets/tests.py index 8949aecd22..cfe0c07e70 100644 --- a/tests/admin_widgets/tests.py +++ b/tests/admin_widgets/tests.py @@ -14,6 +14,7 @@ from django.contrib.admin import widgets from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.core.files.storage import default_storage from django.core.files.uploadedfile import SimpleUploadedFile +from django.core.urlresolvers import reverse from django.db.models import CharField, DateField from django.test import TestCase as DjangoTestCase, override_settings from django.utils import six, translation @@ -174,7 +175,7 @@ class AdminFormfieldForDBFieldWithRequestTests(DjangoTestCase): Ensure the user can only see their own cars in the foreign key dropdown. """ self.client.login(username="super", password="secret") - response = self.client.get("/admin_widgets/cartire/add/") + response = self.client.get(reverse('admin:admin_widgets_cartire_add')) self.assertNotContains(response, "BMW M3") self.assertContains(response, "Volkswagon Passat") @@ -188,7 +189,7 @@ class AdminForeignKeyWidgetChangeList(DjangoTestCase): self.client.login(username="super", password="secret") def test_changelist_ForeignKey(self): - response = self.client.get('/admin_widgets/car/') + response = self.client.get(reverse('admin:admin_widgets_car_changelist')) self.assertContains(response, '/auth/user/add/') @@ -209,7 +210,7 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase): } # Try posting with a non-existent pk in a raw id field: this # should result in an error message, not a server exception. - response = self.client.post('/admin_widgets/event/add/', post_data) + response = self.client.post(reverse('admin:admin_widgets_event_add'), post_data) self.assertContains(response, 'Select a valid choice. That choice is not one of the available choices.') @@ -217,7 +218,7 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase): for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234): # This should result in an error message, not a server exception. - response = self.client.post('/admin_widgets/event/add/', + response = self.client.post(reverse('admin:admin_widgets_event_add'), {"main_band": test_str}) self.assertContains(response, @@ -383,7 +384,7 @@ class AdminFileWidgetTests(DjangoTestCase): File widgets should render as a link when they're marked "read only." """ self.client.login(username="super", password="secret") - response = self.client.get('/admin_widgets/album/%s/' % self.album.id) + response = self.client.get(reverse('admin:admin_widgets_album_change', args=(self.album.id,))) self.assertContains( response, '<p><a href="%(STORAGE_URL)salbums/hybrid_theory.jpg">' @@ -582,7 +583,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): self.admin_login(username='super', password='secret', login_url='/') # Open a page that has a date and time picker widgets self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) + reverse('admin:admin_widgets_member_add'))) # First, with the date picker widget --------------------------------- # Check that the date picker is hidden @@ -622,7 +623,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): self.admin_login(username='super', password='secret', login_url='/') # Open a page that has a date and time picker widgets self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) + reverse('admin:admin_widgets_member_add'))) # fill in the birth date. self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01') @@ -646,7 +647,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): self.admin_login(username='super', password='secret', login_url='/') # Open a page that has a date and time picker widgets self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) + reverse('admin:admin_widgets_member_add'))) # fill in the birth date. self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01') @@ -672,7 +673,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): self.admin_login(username='super', password='secret', login_url='/') # Open a page that has a date and time picker widgets self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) + reverse('admin:admin_widgets_member_add'))) # Click the calendar icon self.selenium.find_element_by_id('calendarlink0').click() @@ -718,7 +719,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): # Open a page that has a date picker widget self.selenium.get('{}{}'.format(self.live_server_url, - '/admin_widgets/member/{}/'.format(member.pk))) + reverse('admin:admin_widgets_member_change', args=(member.pk,)))) # Click on the calendar icon self.selenium.find_element_by_id('calendarlink0').click() @@ -772,7 +773,7 @@ class DateTimePickerShortcutsSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase now = datetime.now() self.selenium.get('%s%s' % (self.live_server_url, - '/admin_widgets/member/add/')) + reverse('admin:admin_widgets_member_add'))) self.selenium.find_element_by_id('id_name').send_keys('test') @@ -949,8 +950,8 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas self.school.save() self.admin_login(username='super', password='secret', login_url='/') - self.selenium.get( - '%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id)) + self.selenium.get('%s%s' % ( + self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,)))) self.wait_page_loaded() self.execute_basic_operations('vertical', 'students') @@ -978,7 +979,7 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas self.admin_login(username='super', password='secret', login_url='/') self.selenium.get( - '%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id)) + '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,)))) for field_name in ['students', 'alumni']: from_box = '#id_%s_from' % field_name @@ -1079,7 +1080,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): def test_ForeignKey(self): self.admin_login(username='super', password='secret', login_url='/') self.selenium.get( - '%s%s' % (self.live_server_url, '/admin_widgets/event/add/')) + '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add'))) main_window = self.selenium.current_window_handle # No value has been selected yet @@ -1114,7 +1115,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): def test_many_to_many(self): self.admin_login(username='super', password='secret', login_url='/') self.selenium.get( - '%s%s' % (self.live_server_url, '/admin_widgets/event/add/')) + '%s%s' % (self.live_server_url, reverse('admin:admin_widgets_event_add'))) main_window = self.selenium.current_window_handle # No value has been selected yet @@ -1166,7 +1167,7 @@ class RelatedFieldWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase): self.admin_login(username='super', password='secret', login_url='/') self.selenium.get('%s%s' % ( self.live_server_url, - '/admin_widgets/profile/add/')) + reverse('admin:admin_widgets_profile_add'))) main_window = self.selenium.current_window_handle # Click the Add User button to add new |
