This commit is contained in:
Zoltan Szalai 2015-05-28 18:27:14 +00:00
commit 85ec9a8bdf
2 changed files with 30 additions and 2 deletions

View File

@ -74,19 +74,23 @@ class SimpleMetadata(BaseMetadata):
actions = {} actions = {}
for method in set(['PUT', 'POST']) & set(view.allowed_methods): for method in set(['PUT', 'POST']) & set(view.allowed_methods):
view.request = clone_request(request, method) view.request = clone_request(request, method)
instance = None
try: try:
# Test global permissions # Test global permissions
if hasattr(view, 'check_permissions'): if hasattr(view, 'check_permissions'):
view.check_permissions(view.request) view.check_permissions(view.request)
# Test object permissions # Test object permissions
if method == 'PUT' and hasattr(view, 'get_object'): if method == 'PUT' and hasattr(view, 'get_object'):
view.get_object() instance = view.get_object()
except (exceptions.APIException, PermissionDenied, Http404): except (exceptions.APIException, PermissionDenied, Http404):
pass pass
else: else:
# If user has appropriate permissions for the view, include # If user has appropriate permissions for the view, include
# appropriate metadata about the fields that should be supplied. # appropriate metadata about the fields that should be supplied.
serializer = view.get_serializer() kwargs = {}
if instance is not None:
kwargs['instance'] = instance
serializer = view.get_serializer(**kwargs)
actions[method] = self.get_serializer_info(serializer) actions[method] = self.get_serializer_info(serializer)
finally: finally:
view.request = request view.request = request

View File

@ -212,3 +212,27 @@ class TestMetadata:
options = metadata.SimpleMetadata() options = metadata.SimpleMetadata()
field_info = options.get_field_info(serializers.NullBooleanField()) field_info = options.get_field_info(serializers.NullBooleanField())
assert field_info['type'] == 'boolean' assert field_info['type'] == 'boolean'
def test_instance_passed_to_serializer(self):
dummy_obj = object()
class ExampleSerializer(serializers.Serializer):
def __init__(self, *args, **kwargs):
super(ExampleSerializer, self).__init__(*args, **kwargs)
assert self.instance == dummy_obj
class ExampleView(views.APIView):
"""Example view."""
def put(self, request):
pass
def get_object(self):
return dummy_obj
def get_serializer(self, *args, **kwargs):
assert kwargs['instance'] == self.get_object()
return ExampleSerializer(*args, **kwargs)
view = ExampleView.as_view()
response = view(request=request)
assert response.status_code == status.HTTP_200_OK