added tests and added settings for default view name

This commit is contained in:
Ludwig Kraatz 2012-12-08 12:34:06 +01:00
parent 9c72d2baad
commit 44a2f706cb
3 changed files with 31 additions and 6 deletions

View File

@ -7,6 +7,7 @@ from django.forms import widgets
from django.utils.datastructures import SortedDict
from django.core.exceptions import ImproperlyConfigured
from rest_framework.compat import get_concrete_model
from rest_framework.settings import api_settings
# Note: We do the following so that users of the framework can use this style:
#
@ -518,21 +519,17 @@ class HyperlinkedModelSerializerOptions(ModelSerializerOptions):
"""
def __init__(self, meta):
super(HyperlinkedModelSerializerOptions, self).__init__(meta)
self.view_name = getattr(meta, 'view_name', None)
class HyperlinkedModelSerializer(ModelSerializer):
"""
"""
_options_class = HyperlinkedModelSerializerOptions
_default_view_name = '%(model_name)s-detail'
_default_view_name = api_settings.DEFAULT_DETAIL_VIEW_NAME
def __init__(self, *args, **kwargs):
if self.opts.view_name is None:
self.opts.view_name = self._get_default_view_name(self.opts.model)
if not 'url' in self.base_fields:
self.base_fields.insert(0, 'url', HyperlinkedIdentityField(view_name=self.opts.view_name))
self.base_fields.insert(0, 'url', HyperlinkedIdentityField(view_name=self._get_default_view_name(self.opts.model)))
super(HyperlinkedModelSerializer, self).__init__(*args, **kwargs)

View File

@ -74,6 +74,9 @@ DEFAULTS = {
'URL_FORMAT_OVERRIDE': 'format',
'FORMAT_SUFFIX_KWARG': 'format',
# Hyperlinked Serializer
'DEFAULT_DETAIL_VIEW_NAME': '%(model_name)s-detail',
}

View File

@ -16,6 +16,14 @@ class BlogPostCommentSerializer(serializers.ModelSerializer):
model = BlogPostComment
fields = ('text', 'blog_post_url', 'url')
class BlogPostCommentHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = BlogPostComment
class BlogPostCommentCustomViewHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):
_default_view_name = '%(model_name)s-detail-customized'
class Meta:
model = BlogPostComment
class PhotoSerializer(serializers.Serializer):
description = serializers.CharField()
@ -247,3 +255,20 @@ class TestOptionalRelationHyperlinkedView(TestCase):
response = self.detail_view(request, pk=1).render()
self.assertEquals(response.status_code, status.HTTP_200_OK)
self.assertEquals(response.data, self.data)
class TestHyperlinkedIdentityField(TestCase):
def test_view_name_mandatory(self):
self.assertRaises(
excClass=ValueError,
callableObj=serializers.HyperlinkedIdentityField,
msg = 'view-name should be mandatory'
)
def test_hyperlinked_model_serializer(self):
serializer = BlogPostCommentHyperlinkedSerializer()
self.assertEquals(serializer.fields['url'].view_name, 'blogpostcomment-detail')
serializer = BlogPostCommentCustomViewHyperlinkedSerializer()
self.assertEquals(serializer.fields['url'].view_name, 'blogpostcomment-detail-customized')