From dba090d1d572a4fa7849c767ca8d55bae9269b7e Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 27 Apr 2025 20:33:26 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20Refactor=20PromoCreateView=20to=20u?= =?UTF-8?q?se=20DRF=E2=80=99s=20CreateAPIView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace custom APIView subclass with rest_framework.generics.CreateAPIView - Add class docstring for PromoCreateView - Add HyperlinkedIdentityField (`url`) in Promo serializer for promo-detail lookup --- promo_code/business/serializers.py | 6 +++++ promo_code/business/views.py | 35 ++++++++++++++++++------------ 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/promo_code/business/serializers.py b/promo_code/business/serializers.py index 974614e..5da9475 100644 --- a/promo_code/business/serializers.py +++ b/promo_code/business/serializers.py @@ -228,10 +228,16 @@ class PromoCreateSerializer(rest_framework.serializers.ModelSerializer): required=False, allow_null=True, ) + # headers + url = rest_framework.serializers.HyperlinkedIdentityField( + view_name='api-business:promo-detail', + lookup_field='id', + ) class Meta: model = business_models.Promo fields = ( + 'url', 'description', 'image_url', 'target', diff --git a/promo_code/business/views.py b/promo_code/business/views.py index e4cedd7..a9b1cdc 100644 --- a/promo_code/business/views.py +++ b/promo_code/business/views.py @@ -115,28 +115,35 @@ class CompanyTokenRefreshView(rest_framework_simplejwt.views.TokenRefreshView): serializer_class = business.serializers.CompanyTokenRefreshSerializer -class PromoCreateView(rest_framework.views.APIView): +class PromoCreateView(rest_framework.generics.CreateAPIView): + """ + View for creating a new promo (POST). + """ + permission_classes = [ rest_framework.permissions.IsAuthenticated, business.permissions.IsCompanyUser, ] serializer_class = business.serializers.PromoCreateSerializer - def post(self, request, *args, **kwargs): - serializer = self.serializer_class( - data=request.data, - context={'request': request}, - ) - if serializer.is_valid(): - instance = serializer.save() - return rest_framework.response.Response( - {'id': str(instance.id)}, - status=rest_framework.status.HTTP_201_CREATED, - ) + def perform_create(self, serializer): + return serializer.save() + + def create(self, request, *args, **kwargs): + serializer = self.get_serializer(data=request.data) + + serializer.is_valid(raise_exception=True) + + instance = self.perform_create(serializer) + + headers = self.get_success_headers(serializer.data) + + response_data = {'id': str(instance.id)} return rest_framework.response.Response( - serializer.errors, - status=rest_framework.status.HTTP_400_BAD_REQUEST, + response_data, + status=rest_framework.status.HTTP_201_CREATED, + headers=headers, )