diff --git a/rest_framework/tests/test_renderers.py b/rest_framework/tests/test_renderers.py index 2ae8ae18c..576b0ad24 100644 --- a/rest_framework/tests/test_renderers.py +++ b/rest_framework/tests/test_renderers.py @@ -6,10 +6,12 @@ from django.core.cache import cache from django.test import TestCase from django.utils import unittest from django.utils.translation import ugettext_lazy as _ -from rest_framework import status, permissions +from rest_framework import serializers, status, permissions from rest_framework.compat import yaml, etree, patterns, url, include, six, StringIO +from rest_framework.tests.models import Album, Photo from rest_framework.response import Response from rest_framework.views import APIView +from rest_framework.generics import GenericAPIView from rest_framework.renderers import BaseRenderer, JSONRenderer, YAMLRenderer, \ XMLRenderer, JSONPRenderer, BrowsableAPIRenderer, UnicodeJSONRenderer from rest_framework.parsers import YAMLParser, XMLParser @@ -96,6 +98,31 @@ class HTMLView1(APIView): def get(self, request, **kwargs): return Response('text') + +class ReadOnlySerializer(serializers.ModelSerializer): + this = serializers.HyperlinkedRelatedField(source="album", + queryset=Album.objects, + view_name="nothing") + that = serializers.HyperlinkedRelatedField(source="album", read_only=True, + queryset=Album.objects, + view_name="nothing") + + class Meta: + model = Photo + fields = ("this", "that", ) + + +class ReadOnlyView(GenericAPIView): + renderer_classes = (BrowsableAPIRenderer, ) + serializer_class = ReadOnlySerializer + + def get(self, request, **kwargs): + return Response("text") + + def post(self, request, **kwargs): + return Response("text") + + urlpatterns = patterns('', url(r'^.*\.(?P.+)$', MockView.as_view(renderer_classes=[RendererA, RendererB])), url(r'^$', MockView.as_view(renderer_classes=[RendererA, RendererB])), @@ -106,6 +133,7 @@ urlpatterns = patterns('', url(r'^html$', HTMLView.as_view()), url(r'^html1$', HTMLView1.as_view()), url(r'^empty$', EmptyGETView.as_view()), + url(r"^read_only$", ReadOnlyView.as_view()), url(r'^api', include('rest_framework.urls', namespace='rest_framework')) ) @@ -251,6 +279,13 @@ class RendererEndToEndTests(TestCase): self.assertEqual(resp.get('Content-Type', None), None) self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT) + def test_read_only_fields_browsable_api(self): + # An album must exist for the exception to be raised + album = Album(title="test") + album.save() + + resp = self.client.get("/read_only") + _flat_repr = '{"foo": ["bar", "baz"]}' _indented_repr = '{\n "foo": [\n "bar",\n "baz"\n ]\n}'