From f53810ebb29f0ef26c53b5be1973263e89b01f54 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 9 Oct 2020 15:53:45 -0400 Subject: [PATCH] Fixes #5231: Fix KeyError exception when viewing object with custom link and debugging is disabled --- docs/release-notes/version-2.9.md | 8 +++++++ netbox/extras/templatetags/custom_links.py | 2 +- netbox/extras/tests/test_views.py | 25 +++++++++++++++++++++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.9.md b/docs/release-notes/version-2.9.md index 3a284a121..2795e311a 100644 --- a/docs/release-notes/version-2.9.md +++ b/docs/release-notes/version-2.9.md @@ -1,5 +1,13 @@ # NetBox v2.9 +## v2.9.7 (FUTURE) + +### Bug Fixes + +* [#5231](https://github.com/netbox-community/netbox/issues/5231) - Fix KeyError exception when viewing object with custom link and debugging is disabled + +--- + ## v2.9.6 (2020-10-09) ### Bug Fixes diff --git a/netbox/extras/templatetags/custom_links.py b/netbox/extras/templatetags/custom_links.py index 84c274f6f..9fbec489d 100644 --- a/netbox/extras/templatetags/custom_links.py +++ b/netbox/extras/templatetags/custom_links.py @@ -33,7 +33,7 @@ def custom_links(context, obj): # Pass select context data when rendering the CustomLink link_context = { 'obj': obj, - 'debug': context['debug'], # django.template.context_processors.debug + 'debug': context.get('debug', False), # django.template.context_processors.debug 'request': context['request'], # django.template.context_processors.request 'user': context['user'], # django.contrib.auth.context_processors.auth 'perms': context['perms'], # django.contrib.auth.context_processors.auth diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 4ff0b59c8..45a246f38 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -2,11 +2,13 @@ import urllib.parse import uuid from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from django.test import override_settings from django.urls import reverse from dcim.models import Site from extras.choices import ObjectChangeActionChoices -from extras.models import ConfigContext, ObjectChange, Tag +from extras.models import ConfigContext, CustomLink, ObjectChange, Tag from utilities.testing import ViewTestCases, TestCase @@ -124,3 +126,24 @@ class ObjectChangeTestCase(TestCase): objectchange = ObjectChange.objects.first() response = self.client.get(objectchange.get_absolute_url()) self.assertHttpStatus(response, 200) + + +class CustomLinkTest(TestCase): + user_permissions = ['dcim.view_site'] + + def test_view_object_with_custom_link(self): + customlink = CustomLink( + content_type=ContentType.objects.get_for_model(Site), + name='Test', + text='FOO {{ obj.name }} BAR', + url='http://example.com/?site={{ obj.slug }}', + new_window=False + ) + customlink.save() + + site = Site(name='Test Site', slug='test-site') + site.save() + + response = self.client.get(site.get_absolute_url(), follow=True) + self.assertEqual(response.status_code, 200) + self.assertIn(f'FOO {site.name} BAR', str(response.content))