Skip to content

Commit 9bf3b75

Browse files
Merge pull request #32 from RandomProgramm3r/develop
refactor: Refactor PromoCreateView to use DRF’s CreateAPIView - Replace custom APIView subclass with rest_framework.generics.CreateAPIView - Add class docstring for PromoCreateView - Add HyperlinkedIdentityField (`url`) in Promo serializer for promo-detail lookup
2 parents 49bb8eb + dba090d commit 9bf3b75

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

promo_code/business/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,16 @@ class PromoCreateSerializer(rest_framework.serializers.ModelSerializer):
228228
required=False,
229229
allow_null=True,
230230
)
231+
# headers
232+
url = rest_framework.serializers.HyperlinkedIdentityField(
233+
view_name='api-business:promo-detail',
234+
lookup_field='id',
235+
)
231236

232237
class Meta:
233238
model = business_models.Promo
234239
fields = (
240+
'url',
235241
'description',
236242
'image_url',
237243
'target',

promo_code/business/views.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -115,28 +115,35 @@ class CompanyTokenRefreshView(rest_framework_simplejwt.views.TokenRefreshView):
115115
serializer_class = business.serializers.CompanyTokenRefreshSerializer
116116

117117

118-
class PromoCreateView(rest_framework.views.APIView):
118+
class PromoCreateView(rest_framework.generics.CreateAPIView):
119+
"""
120+
View for creating a new promo (POST).
121+
"""
122+
119123
permission_classes = [
120124
rest_framework.permissions.IsAuthenticated,
121125
business.permissions.IsCompanyUser,
122126
]
123127
serializer_class = business.serializers.PromoCreateSerializer
124128

125-
def post(self, request, *args, **kwargs):
126-
serializer = self.serializer_class(
127-
data=request.data,
128-
context={'request': request},
129-
)
130-
if serializer.is_valid():
131-
instance = serializer.save()
132-
return rest_framework.response.Response(
133-
{'id': str(instance.id)},
134-
status=rest_framework.status.HTTP_201_CREATED,
135-
)
129+
def perform_create(self, serializer):
130+
return serializer.save()
131+
132+
def create(self, request, *args, **kwargs):
133+
serializer = self.get_serializer(data=request.data)
134+
135+
serializer.is_valid(raise_exception=True)
136+
137+
instance = self.perform_create(serializer)
138+
139+
headers = self.get_success_headers(serializer.data)
140+
141+
response_data = {'id': str(instance.id)}
136142

137143
return rest_framework.response.Response(
138-
serializer.errors,
139-
status=rest_framework.status.HTTP_400_BAD_REQUEST,
144+
response_data,
145+
status=rest_framework.status.HTTP_201_CREATED,
146+
headers=headers,
140147
)
141148

142149

0 commit comments

Comments
 (0)