From 44a2f706cb0c576e194454b35f5f76e296eb3882 Mon Sep 17 00:00:00 2001 From: Ludwig Kraatz Date: Sat, 8 Dec 2012 12:34:06 +0100 Subject: [PATCH] added tests and added settings for default view name --- rest_framework/serializers.py | 9 +++---- rest_framework/settings.py | 3 +++ .../tests/hyperlinkedserializers.py | 25 +++++++++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index dbc13a4ca..1dffd7d1c 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -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) diff --git a/rest_framework/settings.py b/rest_framework/settings.py index ee24a4ad9..d6855280a 100644 --- a/rest_framework/settings.py +++ b/rest_framework/settings.py @@ -74,6 +74,9 @@ DEFAULTS = { 'URL_FORMAT_OVERRIDE': 'format', 'FORMAT_SUFFIX_KWARG': 'format', + + # Hyperlinked Serializer + 'DEFAULT_DETAIL_VIEW_NAME': '%(model_name)s-detail', } diff --git a/rest_framework/tests/hyperlinkedserializers.py b/rest_framework/tests/hyperlinkedserializers.py index d7effce70..0ff0f5f56 100644 --- a/rest_framework/tests/hyperlinkedserializers.py +++ b/rest_framework/tests/hyperlinkedserializers.py @@ -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') + \ No newline at end of file