diff options
| author | Jacob Kaplan-Moss <jacob@jacobian.org> | 2009-01-14 20:22:25 +0000 |
|---|---|---|
| committer | Jacob Kaplan-Moss <jacob@jacobian.org> | 2009-01-14 20:22:25 +0000 |
| commit | 1f84630c87f8032b0167e6db41acaf50ab710879 (patch) | |
| tree | 97b7ddd8adb847b0a3461b75cb0e5b215c7d7db0 /tests/regressiontests/admin_views | |
| parent | 6c4e5f0f0e9469d7e56d824d2b153cd25fb443ee (diff) | |
Fixed #6470: made the admin use a URL resolver.
This *is* backwards compatible, but `admin.site.root()` has been deprecated. The new style is `('^admin/', include(admin.site.urls))`; users will need to update their code to take advantage of the new customizable admin URLs.
Thanks to Alex Gaynor.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9739 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'tests/regressiontests/admin_views')
| -rw-r--r-- | tests/regressiontests/admin_views/customadmin.py | 30 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/tests.py | 94 | ||||
| -rw-r--r-- | tests/regressiontests/admin_views/urls.py | 4 |
3 files changed, 73 insertions, 55 deletions
diff --git a/tests/regressiontests/admin_views/customadmin.py b/tests/regressiontests/admin_views/customadmin.py new file mode 100644 index 0000000000..c812eab98b --- /dev/null +++ b/tests/regressiontests/admin_views/customadmin.py @@ -0,0 +1,30 @@ +""" +A second, custom AdminSite -- see tests.CustomAdminSiteTests. +""" +from django.conf.urls.defaults import patterns +from django.contrib import admin +from django.http import HttpResponse + +import models + +class Admin2(admin.AdminSite): + login_template = 'custom_admin/login.html' + index_template = 'custom_admin/index.html' + + # A custom index view. + def index(self, request, extra_context=None): + return super(Admin2, self).index(request, {'foo': '*bar*'}) + + def get_urls(self): + return patterns('', + (r'^my_view/$', self.admin_view(self.my_view)), + ) + super(Admin2, self).get_urls() + + def my_view(self, request): + return HttpResponse("Django is a magical pony!") + +site = Admin2(name="admin2") + +site.register(models.Article, models.ArticleAdmin) +site.register(models.Section, inlines=[models.ArticleInline]) +site.register(models.Thing, models.ThingAdmin) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 391d1ffa3e..39daf116ab 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -14,6 +14,11 @@ from models import Article, CustomArticle, Section, ModelWithStringPrimaryKey class AdminViewBasicTest(TestCase): fixtures = ['admin-views-users.xml', 'admin-views-colors.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') @@ -24,20 +29,20 @@ class AdminViewBasicTest(TestCase): """ If you leave off the trailing slash, app should redirect and add it. """ - request = self.client.get('/test_admin/admin/admin_views/article/add') + request = self.client.get('/test_admin/%s/admin_views/article/add' % self.urlbit) self.assertRedirects(request, - '/test_admin/admin/admin_views/article/add/' + '/test_admin/%s/admin_views/article/add/' % self.urlbit, status_code=301 ) def testBasicAddGet(self): """ A smoke test to ensure GET on the add_view works. """ - response = self.client.get('/test_admin/admin/admin_views/section/add/') + response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit) self.failUnlessEqual(response.status_code, 200) def testAddWithGETArgs(self): - response = self.client.get('/test_admin/admin/admin_views/section/add/', {'name': 'My Section'}) + response = self.client.get('/test_admin/%s/admin_views/section/add/' % self.urlbit, {'name': 'My Section'}) self.failUnlessEqual(response.status_code, 200) self.failUnless( 'value="My Section"' in response.content, @@ -48,7 +53,7 @@ class AdminViewBasicTest(TestCase): """ A smoke test to ensureGET on the change_view works. """ - response = self.client.get('/test_admin/admin/admin_views/section/1/') + response = self.client.get('/test_admin/%s/admin_views/section/1/' % self.urlbit) self.failUnlessEqual(response.status_code, 200) def testBasicAddPost(self): @@ -61,7 +66,7 @@ class AdminViewBasicTest(TestCase): "article_set-TOTAL_FORMS": u"3", "article_set-INITIAL_FORMS": u"0", } - response = self.client.post('/test_admin/admin/admin_views/section/add/', post_data) + response = self.client.post('/test_admin/%s/admin_views/section/add/' % self.urlbit, post_data) self.failUnlessEqual(response.status_code, 302) # redirect somewhere def testBasicEditPost(self): @@ -106,7 +111,7 @@ class AdminViewBasicTest(TestCase): "article_set-5-date_0": u"", "article_set-5-date_1": u"", } - response = self.client.post('/test_admin/admin/admin_views/section/1/', post_data) + response = self.client.post('/test_admin/%s/admin_views/section/1/' % self.urlbit, post_data) self.failUnlessEqual(response.status_code, 302) # redirect somewhere def testChangeListSortingCallable(self): @@ -114,7 +119,7 @@ class AdminViewBasicTest(TestCase): 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/admin/admin_views/article/', {'ot': 'asc', 'o': 2}) + response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'ot': 'asc', 'o': 2}) self.failUnlessEqual(response.status_code, 200) self.failUnless( response.content.index('Oldest content') < response.content.index('Middle content') and @@ -127,7 +132,7 @@ class AdminViewBasicTest(TestCase): Ensure we can sort on a list_display field that is a Model method (colunn 3 is 'model_year' in ArticleAdmin) """ - response = self.client.get('/test_admin/admin/admin_views/article/', {'ot': 'dsc', 'o': 3}) + response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'ot': 'dsc', 'o': 3}) self.failUnlessEqual(response.status_code, 200) self.failUnless( response.content.index('Newest content') < response.content.index('Middle content') and @@ -140,7 +145,7 @@ class AdminViewBasicTest(TestCase): Ensure we can sort on a list_display field that is a ModelAdmin method (colunn 4 is 'modeladmin_year' in ArticleAdmin) """ - response = self.client.get('/test_admin/admin/admin_views/article/', {'ot': 'asc', 'o': 4}) + response = self.client.get('/test_admin/%s/admin_views/article/' % self.urlbit, {'ot': 'asc', 'o': 4}) self.failUnlessEqual(response.status_code, 200) self.failUnless( response.content.index('Oldest content') < response.content.index('Middle content') and @@ -150,7 +155,7 @@ class AdminViewBasicTest(TestCase): def testLimitedFilter(self): """Ensure admin changelist filters do not contain objects excluded via limit_choices_to.""" - response = self.client.get('/test_admin/admin/admin_views/thing/') + response = self.client.get('/test_admin/%s/admin_views/thing/' % self.urlbit) self.failUnlessEqual(response.status_code, 200) self.failUnless( '<div id="changelist-filter">' in response.content, @@ -163,11 +168,30 @@ class AdminViewBasicTest(TestCase): def testIncorrectLookupParameters(self): """Ensure incorrect lookup parameters are handled gracefully.""" - response = self.client.get('/test_admin/admin/admin_views/thing/', {'notarealfield': '5'}) - self.assertRedirects(response, '/test_admin/admin/admin_views/thing/?e=1') - response = self.client.get('/test_admin/admin/admin_views/thing/', {'color__id__exact': 'StringNotInteger!'}) - self.assertRedirects(response, '/test_admin/admin/admin_views/thing/?e=1') - + 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) + 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) + +class CustomModelAdminTest(AdminViewBasicTest): + urlbit = "admin2" + + def testCustomAdminSiteLoginTemplate(self): + self.client.logout() + request = self.client.get('/test_admin/admin2/') + self.assertTemplateUsed(request, 'custom_admin/login.html') + self.assert_('Hello from a custom login template' in request.content) + + def testCustomAdminSiteIndexViewAndTemplate(self): + request = self.client.get('/test_admin/admin2/') + self.assertTemplateUsed(request, 'custom_admin/index.html') + self.assert_('Hello from a custom index template *bar*' in request.content) + + def testCustomAdminSiteView(self): + self.client.login(username='super', password='secret') + response = self.client.get('/test_admin/%s/my_view/' % self.urlbit) + self.assert_(response.content == "Django is a magical pony!", response.content) + def get_perm(Model, perm): """Return the permission object, for the Model""" ct = ContentType.objects.get_for_model(Model) @@ -432,44 +456,6 @@ class AdminViewPermissionsTest(TestCase): self.client.get('/test_admin/admin/logout/') - def testCustomAdminSiteTemplates(self): - from django.contrib import admin - self.assertEqual(admin.site.index_template, None) - self.assertEqual(admin.site.login_template, None) - - self.client.get('/test_admin/admin/logout/') - request = self.client.get('/test_admin/admin/') - self.assertTemplateUsed(request, 'admin/login.html') - self.client.post('/test_admin/admin/', self.changeuser_login) - request = self.client.get('/test_admin/admin/') - self.assertTemplateUsed(request, 'admin/index.html') - - self.client.get('/test_admin/admin/logout/') - admin.site.login_template = 'custom_admin/login.html' - admin.site.index_template = 'custom_admin/index.html' - request = self.client.get('/test_admin/admin/') - self.assertTemplateUsed(request, 'custom_admin/login.html') - self.assert_('Hello from a custom login template' in request.content) - self.client.post('/test_admin/admin/', self.changeuser_login) - request = self.client.get('/test_admin/admin/') - self.assertTemplateUsed(request, 'custom_admin/index.html') - self.assert_('Hello from a custom index template' in request.content) - - # Finally, using monkey patching check we can inject custom_context arguments in to index - original_index = admin.site.index - def index(*args, **kwargs): - kwargs['extra_context'] = {'foo': '*bar*'} - return original_index(*args, **kwargs) - admin.site.index = index - request = self.client.get('/test_admin/admin/') - self.assertTemplateUsed(request, 'custom_admin/index.html') - self.assert_('Hello from a custom index template *bar*' in request.content) - - self.client.get('/test_admin/admin/logout/') - del admin.site.index # Resets to using the original - admin.site.login_template = None - admin.site.index_template = None - def testDeleteView(self): """Delete view should restrict access and actually delete items.""" diff --git a/tests/regressiontests/admin_views/urls.py b/tests/regressiontests/admin_views/urls.py index 4e5da48e13..f3f1fbd43a 100644 --- a/tests/regressiontests/admin_views/urls.py +++ b/tests/regressiontests/admin_views/urls.py @@ -1,9 +1,11 @@ from django.conf.urls.defaults import * from django.contrib import admin import views +import customadmin urlpatterns = patterns('', (r'^admin/doc/', include('django.contrib.admindocs.urls')), (r'^admin/secure-view/$', views.secure_view), - (r'^admin/(.*)', admin.site.root), + (r'^admin/', include(admin.site.urls)), + (r'^admin2/', include(customadmin.site.urls)), ) |
