From 6e5f1203897f1f7729f370d3d3ebc7192a0b7730 Mon Sep 17 00:00:00 2001 From: John Whitlock Date: Mon, 9 Nov 2015 14:52:43 -0600 Subject: [PATCH] fix bug 1210436 - Handle 404s in view_feature HTML In the rendered used by view_features, detect 404s and other errors and return the standard Django error page, instead of continuing to parse data and eventually failing with a 500 error. --- webplatformcompat/renderers.py | 8 +++++++- webplatformcompat/tests/test_view_serializers.py | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/webplatformcompat/renderers.py b/webplatformcompat/renderers.py index 76641df..b6bdb25 100644 --- a/webplatformcompat/renderers.py +++ b/webplatformcompat/renderers.py @@ -1,7 +1,7 @@ from collections import OrderedDict from json import loads -from django.template import loader +from django.template import loader, Context from django.utils import encoding, translation from rest_framework.relations import ManyRelatedField @@ -236,6 +236,12 @@ def render(self, data, accepted_media_type=None, renderer_context=None): context = loads( json_api.decode('utf-8'), object_pairs_hook=OrderedDict) + # Is it an error? + if 'errors' in context: + error_context = Context(context) + return super(JsonApiTemplateHTMLRenderer, self).render( + error_context, accepted_media_type, renderer_context) + # Copy main item to generic 'data' key other_keys = ('linked', 'links', 'meta') main_keys = [m for m in context.keys() if m not in other_keys] diff --git a/webplatformcompat/tests/test_view_serializers.py b/webplatformcompat/tests/test_view_serializers.py index f38ef7e..da640b5 100644 --- a/webplatformcompat/tests/test_view_serializers.py +++ b/webplatformcompat/tests/test_view_serializers.py @@ -529,6 +529,13 @@ def test_slug_not_found(self): response = self.client.get(url) self.assertEqual(404, response.status_code) + def test_feature_not_found_html(self): + self.assertFalse(Feature.objects.filter(id=666).exists()) + url = reverse('viewfeatures-detail', kwargs={'pk': '666'}) + '.html' + response = self.client.get(url) + self.assertEqual(404, response.status_code) + self.assertEqual('404 Not Found', response.content.decode('utf8')) + class TestViewFeatureUpdates(APITestCase): """Test PUT to a ViewFeature detail"""