Added a few force_unicode() calls around objects in the admin. Required for

Python 2.3 compatibility. Patch from nfg.

Refs #8151, #8153.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@8236 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2008-08-08 18:07:33 +00:00
parent be4390f834
commit ab8965c428
3 changed files with 63 additions and 56 deletions

View File

@ -358,7 +358,7 @@ class ModelAdmin(BaseModelAdmin):
pk_value = new_object._get_pk_val() pk_value = new_object._get_pk_val()
LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(self.model).id, pk_value, force_unicode(new_object), ADDITION) LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(self.model).id, pk_value, force_unicode(new_object), ADDITION)
msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': new_object} msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(new_object)}
# Here, we distinguish between different save types by checking for # Here, we distinguish between different save types by checking for
# the presence of keys in request.POST. # the presence of keys in request.POST.
if request.POST.has_key("_continue"): if request.POST.has_key("_continue"):
@ -428,7 +428,7 @@ class ModelAdmin(BaseModelAdmin):
change_message = _('No fields changed.') change_message = _('No fields changed.')
LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(self.model).id, pk_value, force_unicode(new_object), CHANGE, change_message) LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(self.model).id, pk_value, force_unicode(new_object), CHANGE, change_message)
msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': new_object} msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(new_object)}
if request.POST.has_key("_continue"): if request.POST.has_key("_continue"):
request.user.message_set.create(message=msg + ' ' + _("You may edit it again below.")) request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
if request.REQUEST.has_key('_popup'): if request.REQUEST.has_key('_popup'):

View File

@ -3,7 +3,7 @@ from django.contrib import admin
class Section(models.Model): class Section(models.Model):
""" """
A simple section that links to articles, to test linking to related items A simple section that links to articles, to test linking to related items
in admin views. in admin views.
""" """
name = models.CharField(max_length=100) name = models.CharField(max_length=100)
@ -12,14 +12,18 @@ class Article(models.Model):
""" """
A simple article to test admin views. Test backwards compatibility. A simple article to test admin views. Test backwards compatibility.
""" """
title = models.CharField(max_length=100)
content = models.TextField() content = models.TextField()
date = models.DateTimeField() date = models.DateTimeField()
section = models.ForeignKey(Section) section = models.ForeignKey(Section)
def __unicode__(self):
return self.title
class ArticleAdmin(admin.ModelAdmin): class ArticleAdmin(admin.ModelAdmin):
list_display = ('content', 'date') list_display = ('content', 'date')
list_filter = ('date',) list_filter = ('date',)
def changelist_view(self, request): def changelist_view(self, request):
"Test that extra_context works" "Test that extra_context works"
return super(ArticleAdmin, self).changelist_view( return super(ArticleAdmin, self).changelist_view(
@ -40,7 +44,7 @@ class CustomArticleAdmin(admin.ModelAdmin):
change_form_template = 'custom_admin/change_form.html' change_form_template = 'custom_admin/change_form.html'
object_history_template = 'custom_admin/object_history.html' object_history_template = 'custom_admin/object_history.html'
delete_confirmation_template = 'custom_admin/delete_confirmation.html' delete_confirmation_template = 'custom_admin/delete_confirmation.html'
def changelist_view(self, request): def changelist_view(self, request):
"Test that extra_context works" "Test that extra_context works"
return super(CustomArticleAdmin, self).changelist_view( return super(CustomArticleAdmin, self).changelist_view(
@ -51,10 +55,10 @@ class CustomArticleAdmin(admin.ModelAdmin):
class ModelWithStringPrimaryKey(models.Model): class ModelWithStringPrimaryKey(models.Model):
id = models.CharField(max_length=255, primary_key=True) id = models.CharField(max_length=255, primary_key=True)
def __unicode__(self): def __unicode__(self):
return self.id return self.id
admin.site.register(Article, ArticleAdmin) admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin) admin.site.register(CustomArticle, CustomArticleAdmin)
admin.site.register(Section) admin.site.register(Section)

View File

@ -1,3 +1,4 @@
# coding: utf-8
from django.test import TestCase from django.test import TestCase
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import User, Permission
@ -17,35 +18,35 @@ def get_perm(Model, perm):
class AdminViewPermissionsTest(TestCase): class AdminViewPermissionsTest(TestCase):
"""Tests for Admin Views Permissions.""" """Tests for Admin Views Permissions."""
fixtures = ['admin-views-users.xml'] fixtures = ['admin-views-users.xml']
def setUp(self): def setUp(self):
"""Test setup.""" """Test setup."""
# Setup permissions, for our users who can add, change, and delete. # Setup permissions, for our users who can add, change, and delete.
# We can't put this into the fixture, because the content type id # We can't put this into the fixture, because the content type id
# and the permission id could be different on each run of the test. # and the permission id could be different on each run of the test.
opts = Article._meta opts = Article._meta
# User who can add Articles # User who can add Articles
add_user = User.objects.get(username='adduser') add_user = User.objects.get(username='adduser')
add_user.user_permissions.add(get_perm(Article, add_user.user_permissions.add(get_perm(Article,
opts.get_add_permission())) opts.get_add_permission()))
# User who can change Articles # User who can change Articles
change_user = User.objects.get(username='changeuser') change_user = User.objects.get(username='changeuser')
change_user.user_permissions.add(get_perm(Article, change_user.user_permissions.add(get_perm(Article,
opts.get_change_permission())) opts.get_change_permission()))
# User who can delete Articles # User who can delete Articles
delete_user = User.objects.get(username='deleteuser') delete_user = User.objects.get(username='deleteuser')
delete_user.user_permissions.add(get_perm(Article, delete_user.user_permissions.add(get_perm(Article,
opts.get_delete_permission())) opts.get_delete_permission()))
delete_user.user_permissions.add(get_perm(Section, delete_user.user_permissions.add(get_perm(Section,
Section._meta.get_delete_permission())) Section._meta.get_delete_permission()))
# login POST dicts # login POST dicts
self.super_login = {'post_data': _encode_post_data({}), self.super_login = {'post_data': _encode_post_data({}),
LOGIN_FORM_KEY: 1, LOGIN_FORM_KEY: 1,
@ -81,7 +82,7 @@ class AdminViewPermissionsTest(TestCase):
If you leave off the trailing slash, app should redirect and add it. If you leave off the trailing slash, app should redirect and add it.
""" """
self.client.post('/test_admin/admin/', self.super_login) self.client.post('/test_admin/admin/', self.super_login)
request = self.client.get( request = self.client.get(
'/test_admin/admin/admin_views/article/add' '/test_admin/admin/admin_views/article/add'
) )
@ -92,9 +93,9 @@ class AdminViewPermissionsTest(TestCase):
def testLogin(self): def testLogin(self):
""" """
Make sure only staff members can log in. Make sure only staff members can log in.
Successful posts to the login page will redirect to the orignal url. Successful posts to the login page will redirect to the orignal url.
Unsuccessfull attempts will continue to render the login page with Unsuccessfull attempts will continue to render the login page with
a 200 status code. a 200 status code.
""" """
# Super User # Super User
@ -104,7 +105,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(login, '/test_admin/admin/') self.assertRedirects(login, '/test_admin/admin/')
self.failIf(login.context) self.failIf(login.context)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Test if user enters e-mail address # Test if user enters e-mail address
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
@ -118,7 +119,7 @@ class AdminViewPermissionsTest(TestCase):
# check to ensure if there are multiple e-mail addresses a user doesn't get a 500 # check to ensure if there are multiple e-mail addresses a user doesn't get a 500
login = self.client.post('/test_admin/admin/', self.super_email_login) login = self.client.post('/test_admin/admin/', self.super_email_login)
self.assertContains(login, "Usernames cannot contain the '@' character") self.assertContains(login, "Usernames cannot contain the '@' character")
# Add User # Add User
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
@ -126,7 +127,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(login, '/test_admin/admin/') self.assertRedirects(login, '/test_admin/admin/')
self.failIf(login.context) self.failIf(login.context)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Change User # Change User
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
@ -134,7 +135,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(login, '/test_admin/admin/') self.assertRedirects(login, '/test_admin/admin/')
self.failIf(login.context) self.failIf(login.context)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Delete User # Delete User
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
@ -142,7 +143,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(login, '/test_admin/admin/') self.assertRedirects(login, '/test_admin/admin/')
self.failIf(login.context) self.failIf(login.context)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Regular User should not be able to login. # Regular User should not be able to login.
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
@ -153,11 +154,12 @@ class AdminViewPermissionsTest(TestCase):
def testAddView(self): def testAddView(self):
"""Test add view restricts access and actually adds items.""" """Test add view restricts access and actually adds items."""
add_dict = {'content': '<p>great article</p>', add_dict = {'title' : 'Døm ikke',
'content': '<p>great article</p>',
'date_0': '2008-03-18', 'date_1': '10:54:39', 'date_0': '2008-03-18', 'date_1': '10:54:39',
'section': 1} 'section': 1}
# Change User should not have access to add articles # Change User should not have access to add articles
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.changeuser_login) self.client.post('/test_admin/admin/', self.changeuser_login)
@ -168,7 +170,7 @@ class AdminViewPermissionsTest(TestCase):
self.failUnlessEqual(post.status_code, 403) self.failUnlessEqual(post.status_code, 403)
self.failUnlessEqual(Article.objects.all().count(), 1) self.failUnlessEqual(Article.objects.all().count(), 1)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Add user may login and POST to add view, then redirect to admin root # Add user may login and POST to add view, then redirect to admin root
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.adduser_login) self.client.post('/test_admin/admin/', self.adduser_login)
@ -176,7 +178,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(post, '/test_admin/admin/') self.assertRedirects(post, '/test_admin/admin/')
self.failUnlessEqual(Article.objects.all().count(), 2) self.failUnlessEqual(Article.objects.all().count(), 2)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Super can add too, but is redirected to the change list view # Super can add too, but is redirected to the change list view
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.super_login) self.client.post('/test_admin/admin/', self.super_login)
@ -184,7 +186,7 @@ class AdminViewPermissionsTest(TestCase):
self.assertRedirects(post, '/test_admin/admin/admin_views/article/') self.assertRedirects(post, '/test_admin/admin/admin_views/article/')
self.failUnlessEqual(Article.objects.all().count(), 3) self.failUnlessEqual(Article.objects.all().count(), 3)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Check and make sure that if user expires, data still persists # Check and make sure that if user expires, data still persists
post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict) post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict)
self.assertContains(post, 'Please log in again, because your session has expired.') self.assertContains(post, 'Please log in again, because your session has expired.')
@ -196,11 +198,12 @@ class AdminViewPermissionsTest(TestCase):
def testChangeView(self): def testChangeView(self):
"""Change view should restrict access and allow users to edit items.""" """Change view should restrict access and allow users to edit items."""
change_dict = {'content': '<p>edited article</p>', change_dict = {'title' : 'Ikke fordømt',
'date_0': '2008-03-18', 'date_1': '10:54:39', 'content': '<p>edited article</p>',
'section': 1} 'date_0': '2008-03-18', 'date_1': '10:54:39',
'section': 1}
# add user shoud not be able to view the list of article or change any of them # add user shoud not be able to view the list of article or change any of them
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.adduser_login) self.client.post('/test_admin/admin/', self.adduser_login)
@ -211,7 +214,7 @@ class AdminViewPermissionsTest(TestCase):
post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict) post = self.client.post('/test_admin/admin/admin_views/article/1/', change_dict)
self.failUnlessEqual(post.status_code, 403) self.failUnlessEqual(post.status_code, 403)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# change user can view all items and edit them # change user can view all items and edit them
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.changeuser_login) self.client.post('/test_admin/admin/', self.changeuser_login)
@ -227,17 +230,17 @@ class AdminViewPermissionsTest(TestCase):
def testCustomModelAdminTemplates(self): def testCustomModelAdminTemplates(self):
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.super_login) self.client.post('/test_admin/admin/', self.super_login)
# Test custom change list template with custom extra context # Test custom change list template with custom extra context
request = self.client.get('/test_admin/admin/admin_views/customarticle/') request = self.client.get('/test_admin/admin/admin_views/customarticle/')
self.failUnlessEqual(request.status_code, 200) self.failUnlessEqual(request.status_code, 200)
self.assert_("var hello = 'Hello!';" in request.content) self.assert_("var hello = 'Hello!';" in request.content)
self.assertTemplateUsed(request, 'custom_admin/change_list.html') self.assertTemplateUsed(request, 'custom_admin/change_list.html')
# Test custom change form template # Test custom change form template
request = self.client.get('/test_admin/admin/admin_views/customarticle/add/') request = self.client.get('/test_admin/admin/admin_views/customarticle/add/')
self.assertTemplateUsed(request, 'custom_admin/change_form.html') self.assertTemplateUsed(request, 'custom_admin/change_form.html')
# Add an article so we can test delete and history views # Add an article so we can test delete and history views
post = self.client.post('/test_admin/admin/admin_views/customarticle/add/', { post = self.client.post('/test_admin/admin/admin_views/customarticle/add/', {
'content': '<p>great article</p>', 'content': '<p>great article</p>',
@ -246,27 +249,27 @@ class AdminViewPermissionsTest(TestCase):
}) })
self.assertRedirects(post, '/test_admin/admin/admin_views/customarticle/') self.assertRedirects(post, '/test_admin/admin/admin_views/customarticle/')
self.failUnlessEqual(CustomArticle.objects.all().count(), 1) self.failUnlessEqual(CustomArticle.objects.all().count(), 1)
# Test custom delete and object history templates # Test custom delete and object history templates
request = self.client.get('/test_admin/admin/admin_views/customarticle/1/delete/') request = self.client.get('/test_admin/admin/admin_views/customarticle/1/delete/')
self.assertTemplateUsed(request, 'custom_admin/delete_confirmation.html') self.assertTemplateUsed(request, 'custom_admin/delete_confirmation.html')
request = self.client.get('/test_admin/admin/admin_views/customarticle/1/history/') request = self.client.get('/test_admin/admin/admin_views/customarticle/1/history/')
self.assertTemplateUsed(request, 'custom_admin/object_history.html') self.assertTemplateUsed(request, 'custom_admin/object_history.html')
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
def testCustomAdminSiteTemplates(self): def testCustomAdminSiteTemplates(self):
from django.contrib import admin from django.contrib import admin
self.assertEqual(admin.site.index_template, None) self.assertEqual(admin.site.index_template, None)
self.assertEqual(admin.site.login_template, None) self.assertEqual(admin.site.login_template, None)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.assertTemplateUsed(request, 'admin/login.html') self.assertTemplateUsed(request, 'admin/login.html')
self.client.post('/test_admin/admin/', self.changeuser_login) self.client.post('/test_admin/admin/', self.changeuser_login)
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.assertTemplateUsed(request, 'admin/index.html') self.assertTemplateUsed(request, 'admin/index.html')
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
admin.site.login_template = 'custom_admin/login.html' admin.site.login_template = 'custom_admin/login.html'
admin.site.index_template = 'custom_admin/index.html' admin.site.index_template = 'custom_admin/index.html'
@ -277,7 +280,7 @@ class AdminViewPermissionsTest(TestCase):
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.assertTemplateUsed(request, 'custom_admin/index.html') self.assertTemplateUsed(request, 'custom_admin/index.html')
self.assert_('Hello from a custom index template' in request.content) 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 # Finally, using monkey patching check we can inject custom_context arguments in to index
original_index = admin.site.index original_index = admin.site.index
def index(*args, **kwargs): def index(*args, **kwargs):
@ -287,7 +290,7 @@ class AdminViewPermissionsTest(TestCase):
request = self.client.get('/test_admin/admin/') request = self.client.get('/test_admin/admin/')
self.assertTemplateUsed(request, 'custom_admin/index.html') self.assertTemplateUsed(request, 'custom_admin/index.html')
self.assert_('Hello from a custom index template *bar*' in request.content) self.assert_('Hello from a custom index template *bar*' in request.content)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
del admin.site.index # Resets to using the original del admin.site.index # Resets to using the original
admin.site.login_template = None admin.site.login_template = None
@ -295,9 +298,9 @@ class AdminViewPermissionsTest(TestCase):
def testDeleteView(self): def testDeleteView(self):
"""Delete view should restrict access and actually delete items.""" """Delete view should restrict access and actually delete items."""
delete_dict = {'post': 'yes'} delete_dict = {'post': 'yes'}
# add user shoud not be able to delete articles # add user shoud not be able to delete articles
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.adduser_login) self.client.post('/test_admin/admin/', self.adduser_login)
@ -307,14 +310,14 @@ class AdminViewPermissionsTest(TestCase):
self.failUnlessEqual(post.status_code, 403) self.failUnlessEqual(post.status_code, 403)
self.failUnlessEqual(Article.objects.all().count(), 1) self.failUnlessEqual(Article.objects.all().count(), 1)
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
# Delete user can delete # Delete user can delete
self.client.get('/test_admin/admin/') self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.deleteuser_login) self.client.post('/test_admin/admin/', self.deleteuser_login)
response = self.client.get('/test_admin/admin/admin_views/section/1/delete/') response = self.client.get('/test_admin/admin/admin_views/section/1/delete/')
# test response contains link to related Article # test response contains link to related Article
self.assertContains(response, "admin_views/article/1/") self.assertContains(response, "admin_views/article/1/")
response = self.client.get('/test_admin/admin/admin_views/article/1/delete/') response = self.client.get('/test_admin/admin/admin_views/article/1/delete/')
self.failUnlessEqual(response.status_code, 200) self.failUnlessEqual(response.status_code, 200)
post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict) post = self.client.post('/test_admin/admin/admin_views/article/1/delete/', delete_dict)
@ -324,37 +327,37 @@ class AdminViewPermissionsTest(TestCase):
class AdminViewStringPrimaryKeyTest(TestCase): class AdminViewStringPrimaryKeyTest(TestCase):
fixtures = ['admin-views-users.xml', 'string-primary-key.xml'] fixtures = ['admin-views-users.xml', 'string-primary-key.xml']
def __init__(self, *args): def __init__(self, *args):
super(AdminViewStringPrimaryKeyTest, self).__init__(*args) super(AdminViewStringPrimaryKeyTest, self).__init__(*args)
self.pk = """abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 -_.!~*'() ;/?:@&=+$, <>#%" {}|\^[]`""" self.pk = """abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890 -_.!~*'() ;/?:@&=+$, <>#%" {}|\^[]`"""
def setUp(self): def setUp(self):
self.client.login(username='super', password='secret') self.client.login(username='super', password='secret')
content_type_pk = ContentType.objects.get_for_model(ModelWithStringPrimaryKey).pk content_type_pk = ContentType.objects.get_for_model(ModelWithStringPrimaryKey).pk
LogEntry.objects.log_action(100, content_type_pk, self.pk, self.pk, 2, change_message='') LogEntry.objects.log_action(100, content_type_pk, self.pk, self.pk, 2, change_message='')
def tearDown(self): def tearDown(self):
self.client.logout() self.client.logout()
def test_get_change_view(self): def test_get_change_view(self):
"Retrieving the object using urlencoded form of primary key should work" "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('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/' % quote(self.pk))
self.assertContains(response, escape(self.pk)) self.assertContains(response, escape(self.pk))
self.failUnlessEqual(response.status_code, 200) self.failUnlessEqual(response.status_code, 200)
def test_changelist_to_changeform_link(self): def test_changelist_to_changeform_link(self):
"The link from the changelist referring to the changeform of the object should be quoted" "The link from the changelist referring to the changeform of the object should be quoted"
response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/') response = self.client.get('/test_admin/admin/admin_views/modelwithstringprimarykey/')
should_contain = """<tr class="row1"><th><a href="%s/">%s</a></th></tr>""" % (quote(self.pk), escape(self.pk)) should_contain = """<tr class="row1"><th><a href="%s/">%s</a></th></tr>""" % (quote(self.pk), escape(self.pk))
self.assertContains(response, should_contain) self.assertContains(response, should_contain)
def test_recentactions_link(self): def test_recentactions_link(self):
"The link from the recent actions list referring to the changeform of the object should be quoted" "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('/test_admin/admin/')
should_contain = """<a href="admin_views/modelwithstringprimarykey/%s/">%s</a>""" % (quote(self.pk), escape(self.pk)) should_contain = """<a href="admin_views/modelwithstringprimarykey/%s/">%s</a>""" % (quote(self.pk), escape(self.pk))
self.assertContains(response, should_contain) self.assertContains(response, should_contain)
def test_deleteconfirmation_link(self): def test_deleteconfirmation_link(self):
"The link from the delete confirmation page referring back to the changeform of the object should be quoted" "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('/test_admin/admin/admin_views/modelwithstringprimarykey/%s/delete/' % quote(self.pk))