From a91841f7fe91f79a18a1f4f0352ec3e07f389a0a Mon Sep 17 00:00:00 2001 From: Nikolaus Schlemm Date: Sun, 19 May 2013 11:29:41 +0200 Subject: [PATCH 1/3] WORKAROUND: avoid errors like "AttributeError: 'APIRoot' object has no attribute 'get_serializer'" --- rest_framework/views.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rest_framework/views.py b/rest_framework/views.py index e8bd9f505..6348ca885 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -80,6 +80,8 @@ class APIView(View): self.check_permissions(cloned_request) # TODO: find right placement - APIView does not have get_serializer + if not hasattr(self, 'get_serializer'): + continue serializer = self.get_serializer() if serializer is not None: field_name_types = {} From 1154c12b3389c3098ee8755887f785da43666ec4 Mon Sep 17 00:00:00 2001 From: Nikolaus Schlemm Date: Sun, 19 May 2013 11:37:12 +0200 Subject: [PATCH 2/3] don't expose fields for GET and DELETE - leaving room for parameters like e.g. filter or paginate --- rest_framework/views.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rest_framework/views.py b/rest_framework/views.py index 6348ca885..c9d55c18e 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -79,6 +79,11 @@ class APIView(View): try: self.check_permissions(cloned_request) + # TODO: discuss whether and how to expose parameters like e.g. filter or paginate + if method in ('GET', 'DELETE'): + actions[method] = {} + continue + # TODO: find right placement - APIView does not have get_serializer if not hasattr(self, 'get_serializer'): continue From b07cfdcf54961dc44604c6b87e2cc339901038a3 Mon Sep 17 00:00:00 2001 From: Nikolaus Schlemm Date: Sun, 19 May 2013 13:54:13 +0200 Subject: [PATCH 3/3] FIXED TEST FOR: don't expose fields for GET and DELETE - leaving room for parameters like e.g. filter or paginate --- rest_framework/tests/generics.py | 42 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index 293c6633c..2cbb55e6c 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -125,25 +125,25 @@ class TestRootView(TestCase): 'actions': {} } # TODO: this is just a draft for fields' metadata - needs review and decision - for method in ('GET', 'POST',): - expected['actions'][method] = { - 'text': { - # TODO add help_text and label when they are available - #'help_text': '', - #'label': None, - 'read_only': False, - 'required': True, - 'type': 'Single Character', - }, - 'id': { - # TODO add help_text and label when they are available - #'help_text': '', - #'label': None, - 'read_only': True, - 'required': False, - 'type': 'Integer', - }, - } + expected['actions']['GET'] = {} + expected['actions']['POST'] = { + 'text': { + # TODO add help_text and label when they are available + #'help_text': '', + #'label': None, + 'read_only': False, + 'required': True, + 'type': 'Single Character', + }, + 'id': { + # TODO add help_text and label when they are available + #'help_text': '', + #'label': None, + 'read_only': True, + 'required': False, + 'type': 'Integer', + }, + } self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data, expected) @@ -263,7 +263,9 @@ class TestInstanceView(TestCase): 'actions': {} } # TODO: this is just a draft idea for fields' metadata - needs review and decision - for method in ('GET', 'PATCH', 'PUT', 'DELETE'): + for method in ('GET', 'DELETE'): + expected['actions'][method] = {} + for method in ('PATCH', 'PUT'): expected['actions'][method] = { 'text': { # TODO uncomment label and description when they are