From 249588778cf186d2aa6f432a99537abf45eb19fb Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 22 May 2013 07:58:10 +0200 Subject: [PATCH 1/2] Added a couple of key function to allow easier response tuning. --- rest_framework/mixins.py | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index f3cd5868f..8110144c9 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -44,6 +44,16 @@ class CreateModelMixin(object): """ Create a model instance. """ + + def valid_creation(self, serializer): + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, + status=status.HTTP_201_CREATED, + headers=headers) + + def invalid_creation(self, serializer): + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.DATA, files=request.FILES) @@ -51,11 +61,9 @@ class CreateModelMixin(object): self.pre_save(serializer.object) self.object = serializer.save(force_insert=True) self.post_save(self.object, created=True) - headers = self.get_success_headers(serializer.data) - return Response(serializer.data, status=status.HTTP_201_CREATED, - headers=headers) + return self.valid_creation(serializer) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + return self.invalid_creation(serializer) def get_success_headers(self, data): try: @@ -70,6 +78,9 @@ class ListModelMixin(object): """ empty_error = "Empty list and '%(class_name)s.allow_empty' is False." + def get_list_response(self, serializer): + return Response(serializer.data) + def list(self, request, *args, **kwargs): self.object_list = self.filter_queryset(self.get_queryset()) @@ -93,7 +104,7 @@ class ListModelMixin(object): else: serializer = self.get_serializer(self.object_list, many=True) - return Response(serializer.data) + return self.get_list_response(serializer) class RetrieveModelMixin(object): @@ -120,6 +131,16 @@ class UpdateModelMixin(object): # or simply return None self.check_permissions(clone_request(self.request, 'POST')) + def valid_update(self, serializer): + if self.object is None: + success_status_code = status.HTTP_201_CREATED + else: + success_status_code = status.HTTP_200_OK + return Response(serializer.data, status=success_status_code) + + def invalid_update(self, serializer): + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) self.object = self.get_object_or_none() @@ -127,11 +148,9 @@ class UpdateModelMixin(object): if self.object is None: created = True save_kwargs = {'force_insert': True} - success_status_code = status.HTTP_201_CREATED else: created = False save_kwargs = {'force_update': True} - success_status_code = status.HTTP_200_OK serializer = self.get_serializer(self.object, data=request.DATA, files=request.FILES, partial=partial) @@ -140,9 +159,9 @@ class UpdateModelMixin(object): self.pre_save(serializer.object) self.object = serializer.save(**save_kwargs) self.post_save(self.object, created=created) - return Response(serializer.data, status=success_status_code) + return self.valid_update(serializer) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + return self.invalid_update(serializer) def partial_update(self, request, *args, **kwargs): kwargs['partial'] = True From 5237106214ee02eac91a8960e28b796310413cce Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 22 May 2013 09:22:38 +0200 Subject: [PATCH 2/2] Fixed the created/updated status code for an update. --- rest_framework/mixins.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rest_framework/mixins.py b/rest_framework/mixins.py index 8110144c9..1cf38303a 100644 --- a/rest_framework/mixins.py +++ b/rest_framework/mixins.py @@ -131,14 +131,14 @@ class UpdateModelMixin(object): # or simply return None self.check_permissions(clone_request(self.request, 'POST')) - def valid_update(self, serializer): - if self.object is None: + def valid_update(self, serializer, created=False): + if created: success_status_code = status.HTTP_201_CREATED else: success_status_code = status.HTTP_200_OK return Response(serializer.data, status=success_status_code) - def invalid_update(self, serializer): + def invalid_update(self, serializer, created=False): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def update(self, request, *args, **kwargs): @@ -159,9 +159,9 @@ class UpdateModelMixin(object): self.pre_save(serializer.object) self.object = serializer.save(**save_kwargs) self.post_save(self.object, created=created) - return self.valid_update(serializer) + return self.valid_update(serializer, created) - return self.invalid_update(serializer) + return self.invalid_update(serializer, created) def partial_update(self, request, *args, **kwargs): kwargs['partial'] = True