1
0
mirror of https://github.com/django/django.git synced 2025-01-03 15:06:09 +00:00

Replaced hardcoded URLs in admin_* tests

Refs #15779. This will allow easier admin URL changes, when needed.
Thanks Simon Charette for the review.
This commit is contained in:
Claude Paroz 2015-02-06 23:25:15 +01:00
parent 9033003d97
commit 32e6a7d3a5
8 changed files with 693 additions and 647 deletions

View File

@ -79,7 +79,7 @@ class UserAdmin(admin.ModelAdmin):
def get_urls(self): def get_urls(self):
return [ return [
url(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password)), url(r'^(\d+)/password/$', self.admin_site.admin_view(self.user_change_password), name='auth_user_password_change'),
] + super(UserAdmin, self).get_urls() ] + super(UserAdmin, self).get_urls()
def lookup_allowed(self, lookup, value): def lookup_allowed(self, lookup, value):

View File

@ -368,7 +368,7 @@ class ChangeListTests(TestCase):
username='super', email='super@localhost', password='secret') username='super', email='super@localhost', password='secret')
self.client.login(username='super', password='secret') self.client.login(username='super', password='secret')
event = Event.objects.create(date=datetime.date.today()) 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.assertContains(response, formats.localize(event.date))
self.assertNotContains(response, six.text_type(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.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin/auth/user/')) reverse('admin:auth_user_changelist')))
form_id = '#changelist-form' form_id = '#changelist-form'

View File

@ -26,7 +26,9 @@ class AdminCustomUrlsTest(TestCase):
""" """
Ensure GET on the add_view works. 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.assertIsInstance(response, TemplateResponse)
self.assertEqual(response.status_code, 200) 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 Ensure GET on the add_view plus specifying a field value in the query
string works. 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.assertEqual(response.status_code, 200)
self.assertContains(response, 'value="My Action"') self.assertContains(response, 'value="My Action"')
@ -48,7 +50,7 @@ class AdminCustomUrlsTest(TestCase):
"name": 'Action added through a popup', "name": 'Action added through a popup',
"description": "Description of added action", "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.assertEqual(response.status_code, 200)
self.assertContains(response, 'dismissAddRelatedObjectPopup') self.assertContains(response, 'dismissAddRelatedObjectPopup')
self.assertContains(response, 'Action added through a popup') self.assertContains(response, 'Action added through a popup')

View File

@ -7,6 +7,7 @@ from django.contrib.admin.helpers import InlineAdminForm
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.contrib.auth.models import Permission, User from django.contrib.auth.models import Permission, User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.test import RequestFactory, TestCase, override_settings from django.test import RequestFactory, TestCase, override_settings
from django.utils.encoding import force_text from django.utils.encoding import force_text
@ -31,7 +32,6 @@ class TestInline(TestCase):
holder = Holder(dummy=13) holder = Holder(dummy=13)
holder.save() holder.save()
Inner(dummy=42, holder=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') result = self.client.login(username='super', password='secret')
self.assertEqual(result, True) self.assertEqual(result, True)
@ -41,7 +41,10 @@ class TestInline(TestCase):
""" """
can_delete should be passed to inlineformset factory. 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 inner_formset = response.context['inline_admin_formsets'][0].formset
expected = InnerInline.can_delete expected = InnerInline.can_delete
actual = inner_formset.can_delete actual = inner_formset.can_delete
@ -51,13 +54,14 @@ class TestInline(TestCase):
"""Bug #13174.""" """Bug #13174."""
holder = Holder.objects.create(dummy=42) holder = Holder.objects.create(dummy=42)
Inner.objects.create(holder=holder, dummy=42, readonly='') Inner.objects.create(holder=holder, dummy=42, readonly='')
response = self.client.get('/admin/admin_inlines/holder/%i/' response = self.client.get(
% holder.id) reverse('admin:admin_inlines_holder_change', args=(holder.id,))
)
self.assertContains(response, '<label>Inner readonly label:</label>') self.assertContains(response, '<label>Inner readonly label:</label>')
def test_many_to_many_inlines(self): def test_many_to_many_inlines(self):
"Autogenerated many-to-many inlines are displayed correctly (#13407)" "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 # The heading for the m2m inline block uses the right text
self.assertContains(response, '<h2>Author-book relationships</h2>') self.assertContains(response, '<h2>Author-book relationships</h2>')
# The "add another" label is correct # The "add another" label is correct
@ -78,7 +82,7 @@ class TestInline(TestCase):
'max_weight': 0, 'max_weight': 0,
'shoppingweakness_set-0-item': item.id, '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(response.status_code, 302)
self.assertEqual(len(Fashionista.objects.filter(person__firstname='Imelda')), 1) 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-title1': 'a title',
'title_set-0-title2': 'a different 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. # 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>') 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""" """Admin inline `readonly_field` shouldn't invoke parent ModelAdmin callable"""
# Identically named callable isn't present in the parent ModelAdmin, # Identically named callable isn't present in the parent ModelAdmin,
# rendering of the add view shouldn't explode # 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) self.assertEqual(response.status_code, 200)
# View should have the child inlines section # View should have the child inlines section
self.assertContains(response, '<div class="inline-group" id="chapter_set-group">') self.assertContains(response, '<div class="inline-group" id="chapter_set-group">')
def test_callable_lookup(self): def test_callable_lookup(self):
"""Admin inline should invoke local callable when its name is listed in readonly_fields""" """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) self.assertEqual(response.status_code, 200)
# Add parent object view should have the child inlines section # Add parent object view should have the child inlines section
self.assertContains(response, '<div class="inline-group" id="question_set-group">') 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. using both the stacked and tabular layouts.
Ref #8190. 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, '<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) 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 # 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) 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): def test_inline_hidden_field_no_column(self):
@ -136,7 +140,7 @@ class TestInline(TestCase):
parent = SomeParentModel.objects.create(name='a') parent = SomeParentModel.objects.create(name='a')
SomeChildModel.objects.create(name='b', position='0', parent=parent) SomeChildModel.objects.create(name='b', position='0', parent=parent)
SomeChildModel.objects.create(name='c', position='1', 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.assertNotContains(response, '<td class="field-position">')
self.assertContains(response, ( self.assertContains(response, (
'<input id="id_somechildmodel_set-1-position" ' '<input id="id_somechildmodel_set-1-position" '
@ -147,7 +151,7 @@ class TestInline(TestCase):
Ensure that multiple inlines with related_name='+' have correct form Ensure that multiple inlines with related_name='+' have correct form
prefixes. Bug #16838. 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, self.assertContains(response,
'<input type="hidden" name="-1-0-id" id="id_-1-0-id" />', html=True) '<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) holder = Holder.objects.create(pk=123456789, dummy=42)
inner = Inner.objects.create(pk=987654321, holder=holder, dummy=42, readonly='') 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) inner_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(inner).pk, inner.pk)
self.assertContains(response, inner_shortcut) self.assertContains(response, inner_shortcut)
@ -185,7 +189,7 @@ class TestInline(TestCase):
parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo") parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo")
child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent)
child2 = ChildModel2.objects.create(my_own_pk="baz", name="Baz", 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) 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) child2_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child2).pk, child2.pk)
self.assertContains(response, child1_shortcut) self.assertContains(response, child1_shortcut)
@ -204,7 +208,7 @@ class TestInline(TestCase):
'sighting_set-0-place': 'Zone 51', 'sighting_set-0-place': 'Zone 51',
'_save': 'Save', '_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(response.status_code, 302)
self.assertEqual(Sighting.objects.filter(et__name='Martian').count(), 1) 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 # 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" />' 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, max_forms_input % 3)
self.assertContains(response, total_forms_hidden) 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, max_forms_input % 2)
self.assertContains(response, total_forms_hidden) 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" />' 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" />' 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) request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request) response = modeladmin.changeform_view(request)
self.assertContains(response, min_forms) 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" />' 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" />' 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) request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request) response = modeladmin.changeform_view(request)
self.assertContains(response, min_forms % 2) self.assertContains(response, min_forms % 2)
self.assertContains(response, total_forms % 5) 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) request.user = User(username='super', is_superuser=True)
response = modeladmin.changeform_view(request, object_id=str(bt_head.id)) response = modeladmin.changeform_view(request, object_id=str(bt_head.id))
self.assertContains(response, min_forms % 5) self.assertContains(response, min_forms % 5)
self.assertContains(response, total_forms % 8) self.assertContains(response, total_forms % 8)
def test_inline_nonauto_noneditable_pk(self): 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, self.assertContains(response,
'<input id="id_nonautopkbook_set-0-rand_pk" name="nonautopkbook_set-0-rand_pk" type="hidden" />', '<input id="id_nonautopkbook_set-0-rand_pk" name="nonautopkbook_set-0-rand_pk" type="hidden" />',
html=True) html=True)
@ -291,7 +295,7 @@ class TestInline(TestCase):
html=True) html=True)
def test_inline_editable_pk(self): 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, self.assertContains(response,
'<input class="vIntegerField" id="id_editablepkbook_set-0-manual_pk" name="editablepkbook_set-0-manual_pk" type="text" />', '<input class="vIntegerField" id="id_editablepkbook_set-0-manual_pk" name="editablepkbook_set-0-manual_pk" type="text" />',
html=True, count=1) html=True, count=1)
@ -302,7 +306,7 @@ class TestInline(TestCase):
def test_stacked_inline_edit_form_contains_has_original_class(self): def test_stacked_inline_edit_form_contains_has_original_class(self):
holder = Holder.objects.create(dummy=1) holder = Holder.objects.create(dummy=1)
holder.inner_set.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( self.assertContains(
response, response,
'<div class="inline-related has_original" id="inner_set-0">', '<div class="inline-related has_original" id="inner_set-0">',
@ -323,10 +327,10 @@ class TestInline(TestCase):
('inner4stacked', item1.pk), ('inner4stacked', item1.pk),
('inner4tabular', item2.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) self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
for model, pk in items: 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)) self.assertContains(response, '<a href="%s" %s' % (url, INLINE_CHANGELINK_HTML))
def test_inlines_show_change_link_unregistered(self): 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") parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo")
ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent)
ChildModel2.objects.create(my_own_pk="baz", name="Baz", 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.assertFalse(response.context['inline_admin_formset'].opts.has_registered_model)
self.assertNotContains(response, INLINE_CHANGELINK_HTML) self.assertNotContains(response, INLINE_CHANGELINK_HTML)
@ -342,7 +346,7 @@ class TestInline(TestCase):
"Inlines `show_change_link` disabled by default." "Inlines `show_change_link` disabled by default."
poll = Poll.objects.create(name="New poll") poll = Poll.objects.create(name="New poll")
Question.objects.create(poll=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.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
self.assertNotContains(response, INLINE_CHANGELINK_HTML) self.assertNotContains(response, INLINE_CHANGELINK_HTML)
@ -361,7 +365,7 @@ class TestInlineMedia(TestCase):
holder = Holder(dummy=13) holder = Holder(dummy=13)
holder.save() holder.save()
Inner(dummy=42, holder=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) response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_admin_scripts.js') self.assertContains(response, 'my_awesome_admin_scripts.js')
@ -369,7 +373,7 @@ class TestInlineMedia(TestCase):
holder = Holder3(dummy=13) holder = Holder3(dummy=13)
holder.save() holder.save()
Inner3(dummy=42, holder=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) response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_inline_scripts.js') self.assertContains(response, 'my_awesome_inline_scripts.js')
@ -377,7 +381,7 @@ class TestInlineMedia(TestCase):
holder = Holder2(dummy=13) holder = Holder2(dummy=13)
holder.save() holder.save()
Inner2(dummy=42, holder=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) response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_admin_scripts.js') self.assertContains(response, 'my_awesome_admin_scripts.js')
self.assertContains(response, 'my_awesome_inline_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') chapter = Chapter.objects.create(novel=lotr, name='Many Meetings')
foot_note = FootNote.objects.create(chapter=chapter, note='yadda yadda') 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) response = self.client.get(change_url)
data = { data = {
'name': lotr.name, 'name': lotr.name,
@ -492,14 +496,14 @@ class TestInlinePermissions(TestCase):
author = Author.objects.create(pk=1, name='The Author') author = Author.objects.create(pk=1, name='The Author')
book = author.books.create(name='The inline Book') 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 # 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) 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 self.author_book_auto_m2m_intermediate_id = author_book_auto_m2m_intermediate.pk
holder = Holder2.objects.create(dummy=13) holder = Holder2.objects.create(dummy=13)
inner2 = Inner2.objects.create(dummy=42, holder=holder) 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.inner2_id = inner2.id
self.assertEqual( self.assertEqual(
@ -507,14 +511,14 @@ class TestInlinePermissions(TestCase):
True) True)
def test_inline_add_m2m_noperm(self): 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 # No change permission on books, so no inline
self.assertNotContains(response, '<h2>Author-book relationships</h2>') self.assertNotContains(response, '<h2>Author-book relationships</h2>')
self.assertNotContains(response, 'Add another Author-Book Relationship') self.assertNotContains(response, 'Add another Author-Book Relationship')
self.assertNotContains(response, 'id="id_Author_books-TOTAL_FORMS"') self.assertNotContains(response, 'id="id_Author_books-TOTAL_FORMS"')
def test_inline_add_fk_noperm(self): 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 # No permissions on Inner2s, so no inline
self.assertNotContains(response, '<h2>Inner2s</h2>') self.assertNotContains(response, '<h2>Inner2s</h2>')
self.assertNotContains(response, 'Add another Inner2') self.assertNotContains(response, 'Add another Inner2')
@ -537,7 +541,7 @@ class TestInlinePermissions(TestCase):
def test_inline_add_m2m_add_perm(self): def test_inline_add_m2m_add_perm(self):
permission = Permission.objects.get(codename='add_book', content_type=self.book_ct) permission = Permission.objects.get(codename='add_book', content_type=self.book_ct)
self.user.user_permissions.add(permission) 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 # No change permission on Books, so no inline
self.assertNotContains(response, '<h2>Author-book relationships</h2>') self.assertNotContains(response, '<h2>Author-book relationships</h2>')
self.assertNotContains(response, 'Add another Author-Book Relationship') self.assertNotContains(response, 'Add another Author-Book Relationship')
@ -546,7 +550,7 @@ class TestInlinePermissions(TestCase):
def test_inline_add_fk_add_perm(self): def test_inline_add_fk_add_perm(self):
permission = Permission.objects.get(codename='add_inner2', content_type=self.inner_ct) permission = Permission.objects.get(codename='add_inner2', content_type=self.inner_ct)
self.user.user_permissions.add(permission) 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 # Add permission on inner2s, so we get the inline
self.assertContains(response, '<h2>Inner2s</h2>') self.assertContains(response, '<h2>Inner2s</h2>')
self.assertContains(response, 'Add another Inner2') self.assertContains(response, 'Add another Inner2')
@ -666,7 +670,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
""" """
self.admin_login(username='super', password='secret') self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, 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' inline_id = '#inner4stacked_set-group'
rows_length = lambda: len(self.selenium.find_elements_by_css_selector( rows_length = lambda: len(self.selenium.find_elements_by_css_selector(
@ -682,7 +686,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_delete_stackeds(self): def test_delete_stackeds(self):
self.admin_login(username='super', password='secret') self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, 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' inline_id = '#inner4stacked_set-group'
rows_length = lambda: len(self.selenium.find_elements_by_css_selector( 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.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, 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 # Check that there's only one inline to start with and that it has the
# correct ID. # correct ID.
@ -764,7 +768,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_delete_inlines(self): def test_delete_inlines(self):
self.admin_login(username='super', password='secret') self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin/admin_inlines/profilecollection/add/')) reverse('admin:admin_inlines_profilecollection_add')))
# Add a few inlines # Add a few inlines
self.selenium.find_element_by_link_text('Add another Profile').click() self.selenium.find_element_by_link_text('Add another Profile').click()
@ -802,7 +806,7 @@ class SeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_alternating_rows(self): def test_alternating_rows(self):
self.admin_login(username='super', password='secret') self.admin_login(username='super', password='secret')
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin/admin_inlines/profilecollection/add/')) reverse('admin:admin_inlines_profilecollection_add')))
# Add a few inlines # Add a few inlines
self.selenium.find_element_by_link_text('Add another Profile').click() self.selenium.find_element_by_link_text('Add another Profile').click()

View File

@ -27,7 +27,7 @@ class Admin2(admin.AdminSite):
def get_urls(self): def get_urls(self):
return [ 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() ] + super(Admin2, self).get_urls()
def my_view(self, request): def my_view(self, request):

File diff suppressed because it is too large Load Diff

View File

@ -4,10 +4,10 @@ from . import admin, custom_has_permission_admin, customadmin, views
urlpatterns = [ urlpatterns = [
url(r'^test_admin/admin/doc/', include('django.contrib.admindocs.urls')), 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/admin/', include(admin.site.urls)),
url(r'^test_admin/admin2/', include(customadmin.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/admin4/', include(customadmin.simple_site.urls)),
url(r'^test_admin/admin5/', include(admin.site2.urls)), url(r'^test_admin/admin5/', include(admin.site2.urls)),
url(r'^test_admin/admin7/', include(admin.site7.urls)), url(r'^test_admin/admin7/', include(admin.site7.urls)),

View File

@ -14,6 +14,7 @@ from django.contrib.admin import widgets
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
from django.core.files.storage import default_storage from django.core.files.storage import default_storage
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.urlresolvers import reverse
from django.db.models import CharField, DateField from django.db.models import CharField, DateField
from django.test import TestCase as DjangoTestCase, override_settings from django.test import TestCase as DjangoTestCase, override_settings
from django.utils import six, translation 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. Ensure the user can only see their own cars in the foreign key dropdown.
""" """
self.client.login(username="super", password="secret") 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.assertNotContains(response, "BMW M3")
self.assertContains(response, "Volkswagon Passat") self.assertContains(response, "Volkswagon Passat")
@ -188,7 +189,7 @@ class AdminForeignKeyWidgetChangeList(DjangoTestCase):
self.client.login(username="super", password="secret") self.client.login(username="super", password="secret")
def test_changelist_ForeignKey(self): 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/') 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 # Try posting with a non-existent pk in a raw id field: this
# should result in an error message, not a server exception. # 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, self.assertContains(response,
'Select a valid choice. That choice is not one of the available choices.') '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): 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. # 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}) {"main_band": test_str})
self.assertContains(response, self.assertContains(response,
@ -383,7 +384,7 @@ class AdminFileWidgetTests(DjangoTestCase):
File widgets should render as a link when they're marked "read only." File widgets should render as a link when they're marked "read only."
""" """
self.client.login(username="super", password="secret") 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( self.assertContains(
response, response,
'<p><a href="%(STORAGE_URL)salbums/hybrid_theory.jpg">' '<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='/') self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets # Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url, 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 --------------------------------- # First, with the date picker widget ---------------------------------
# Check that the date picker is hidden # Check that the date picker is hidden
@ -622,7 +623,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets # Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin_widgets/member/add/')) reverse('admin:admin_widgets_member_add')))
# fill in the birth date. # fill in the birth date.
self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01') 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='/') self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets # Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin_widgets/member/add/')) reverse('admin:admin_widgets_member_add')))
# fill in the birth date. # fill in the birth date.
self.selenium.find_element_by_id('id_birthdate_0').send_keys('2013-06-01') 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='/') self.admin_login(username='super', password='secret', login_url='/')
# Open a page that has a date and time picker widgets # Open a page that has a date and time picker widgets
self.selenium.get('%s%s' % (self.live_server_url, self.selenium.get('%s%s' % (self.live_server_url,
'/admin_widgets/member/add/')) reverse('admin:admin_widgets_member_add')))
# Click the calendar icon # Click the calendar icon
self.selenium.find_element_by_id('calendarlink0').click() self.selenium.find_element_by_id('calendarlink0').click()
@ -718,7 +719,7 @@ class DateTimePickerSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
# Open a page that has a date picker widget # Open a page that has a date picker widget
self.selenium.get('{}{}'.format(self.live_server_url, 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 # Click on the calendar icon
self.selenium.find_element_by_id('calendarlink0').click() self.selenium.find_element_by_id('calendarlink0').click()
@ -772,7 +773,7 @@ class DateTimePickerShortcutsSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase
now = datetime.now() now = datetime.now()
self.selenium.get('%s%s' % (self.live_server_url, 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') self.selenium.find_element_by_id('id_name').send_keys('test')
@ -949,8 +950,8 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas
self.school.save() self.school.save()
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get( self.selenium.get('%s%s' % (
'%s%s' % (self.live_server_url, '/admin_widgets/school/%s/' % self.school.id)) self.live_server_url, reverse('admin:admin_widgets_school_change', args=(self.school.id,))))
self.wait_page_loaded() self.wait_page_loaded()
self.execute_basic_operations('vertical', 'students') self.execute_basic_operations('vertical', 'students')
@ -978,7 +979,7 @@ class HorizontalVerticalFilterSeleniumFirefoxTests(AdminSeleniumWebDriverTestCas
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get( 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']: for field_name in ['students', 'alumni']:
from_box = '#id_%s_from' % field_name from_box = '#id_%s_from' % field_name
@ -1079,7 +1080,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_ForeignKey(self): def test_ForeignKey(self):
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get( 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 main_window = self.selenium.current_window_handle
# No value has been selected yet # No value has been selected yet
@ -1114,7 +1115,7 @@ class AdminRawIdWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
def test_many_to_many(self): def test_many_to_many(self):
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get( 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 main_window = self.selenium.current_window_handle
# No value has been selected yet # No value has been selected yet
@ -1166,7 +1167,7 @@ class RelatedFieldWidgetSeleniumFirefoxTests(AdminSeleniumWebDriverTestCase):
self.admin_login(username='super', password='secret', login_url='/') self.admin_login(username='super', password='secret', login_url='/')
self.selenium.get('%s%s' % ( self.selenium.get('%s%s' % (
self.live_server_url, self.live_server_url,
'/admin_widgets/profile/add/')) reverse('admin:admin_widgets_profile_add')))
main_window = self.selenium.current_window_handle main_window = self.selenium.current_window_handle
# Click the Add User button to add new # Click the Add User button to add new