[1.6.x] Fixed LogEntry.get_admin_url() for non-existent models.

Regression introduced by [369b6fa]; refs #18169.

Backport of 1b47508ac8 from master
This commit is contained in:
Petr Dlouhý 2013-08-01 09:51:01 +02:00 committed by Tim Graham
parent 4f8fb19994
commit 4e7745cc1c
2 changed files with 16 additions and 2 deletions

View File

@ -4,7 +4,7 @@ from django.db import models
from django.conf import settings from django.conf import settings
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.admin.util import quote from django.contrib.admin.util import quote
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse, NoReverseMatch
from django.utils.translation import ugettext, ugettext_lazy as _ from django.utils.translation import ugettext, ugettext_lazy as _
from django.utils.encoding import smart_text from django.utils.encoding import smart_text
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
@ -74,5 +74,8 @@ class LogEntry(models.Model):
""" """
if self.content_type and self.object_id: if self.content_type and self.object_id:
url_name = 'admin:%s_%s_change' % (self.content_type.app_label, self.content_type.model) url_name = 'admin:%s_%s_change' % (self.content_type.app_label, self.content_type.model)
return reverse(url_name, args=(quote(self.object_id),)) try:
return reverse(url_name, args=(quote(self.object_id),))
except NoReverseMatch:
pass
return None return None

View File

@ -1525,6 +1525,17 @@ class AdminViewStringPrimaryKeyTest(TestCase):
self.assertEqual(counted_presence_before - 1, self.assertEqual(counted_presence_before - 1,
counted_presence_after) counted_presence_after)
def test_logentry_get_admin_url(self):
"LogEntry.get_admin_url returns a URL to edit the entry's object or None for non-existent (possibly deleted) models"
log_entry_name = "Model with string primary key" # capitalized in Recent Actions
logentry = LogEntry.objects.get(content_type__name__iexact=log_entry_name)
model = "modelwithstringprimarykey"
desired_admin_url = "/test_admin/admin/admin_views/%s/%s/" % (model, escape(iri_to_uri(urlquote(quote(self.pk)))))
self.assertEqual(logentry.get_admin_url(), desired_admin_url)
logentry.content_type.model = "non-existent"
self.assertEqual(logentry.get_admin_url(), None)
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))