4040)
4141from ctj_api .permissions import OpportunityPermission , UserDetailPermission
4242from ctj_api .serializers import (
43- CommunityOfPracticeSerializer ,
44- CustomUserSerializer ,
45- OpportunitySerializer ,
46- ProjectSerializer ,
47- RoleSerializer ,
48- SkillSerializer ,
43+ CommunityOfPracticeReadSerializer ,
44+ CustomUserReadSerializer ,
45+ OpportunityReadSerializer ,
46+ OpportunityWriteSerializer ,
47+ ProjectReadSerializer ,
48+ RoleReadSerializer ,
49+ SkillReadSerializer ,
4950)
5051
5152start_time = time .time ()
@@ -160,7 +161,7 @@ def user_detail(request, pk):
160161 # object-level (`has_object_permission`) check has to be triggered
161162 # explicitly in FBVs since there's no APIView class to auto-call it.
162163 request .parser_context ["view" ].check_object_permissions (request , user )
163- serializer = CustomUserSerializer (user )
164+ serializer = CustomUserReadSerializer (user )
164165 return Response (serializer .data )
165166
166167
@@ -195,8 +196,8 @@ class OpportunityViewSet(viewsets.ModelViewSet):
195196 - IsAuthenticatedOrReadOnly + OpportunityPermission
196197
197198 Errors:
198- - 400: Validation error on create/update (`OpportunitySerializer`
199- rejected the payload).
199+ - 400: Validation error on create/update
200+ (`OpportunityWriteSerializer` rejected the payload).
200201 - 401: Unauthenticated mutation.
201202 - 403: `OpportunityPermission` denied (e.g. non-PM trying to
202203 create, non-creator trying to update). Note: PATCH is always
@@ -206,12 +207,22 @@ class OpportunityViewSet(viewsets.ModelViewSet):
206207 """
207208
208209 queryset = Opportunity .objects .all ()
209- serializer_class = OpportunitySerializer
210+ serializer_class = OpportunityReadSerializer
210211 permission_classes = (
211212 permissions .IsAuthenticatedOrReadOnly ,
212213 OpportunityPermission ,
213214 )
214215
216+ def get_serializer_class (self ):
217+ # Dispatch by action: list/retrieve return the Read shape;
218+ # create/update/destroy accept the Write shape. The class-level
219+ # `serializer_class = OpportunityReadSerializer` above is the
220+ # safe fallback (Read) if `self.action` is None during schema
221+ # introspection.
222+ if self .action in ("list" , "retrieve" ):
223+ return OpportunityReadSerializer
224+ return OpportunityWriteSerializer
225+
215226 def perform_create (self , serializer ):
216227 serializer .save (created_by = self .request .user )
217228
@@ -229,7 +240,7 @@ def community_of_practice_list(request):
229240
230241 Flow:
231242 1. Fetch all `CommunityOfPractice` rows.
232- 2. Serialize via `CommunityOfPracticeSerializer ` and return 200.
243+ 2. Serialize via `CommunityOfPracticeReadSerializer ` and return 200.
233244
234245 URL:
235246 - GET /api/communityOfPractice/
@@ -241,7 +252,7 @@ def community_of_practice_list(request):
241252 - (none)
242253 """
243254 cops = CommunityOfPractice .objects .all ()
244- serializer = CommunityOfPracticeSerializer (cops , many = True )
255+ serializer = CommunityOfPracticeReadSerializer (cops , many = True )
245256 return Response (serializer .data )
246257
247258
@@ -254,7 +265,7 @@ def community_of_practice_detail(request, pk):
254265
255266 Flow:
256267 1. Look up the row by primary-key UUID.
257- 2. Serialize via `CommunityOfPracticeSerializer ` and return 200.
268+ 2. Serialize via `CommunityOfPracticeReadSerializer ` and return 200.
258269
259270 URL:
260271 - GET /api/communityOfPractice/<uuid:pk>/
@@ -266,7 +277,7 @@ def community_of_practice_detail(request, pk):
266277 - 404: No CoP exists with the given UUID.
267278 """
268279 cop = get_object_or_404 (CommunityOfPractice , pk = pk )
269- serializer = CommunityOfPracticeSerializer (cop )
280+ serializer = CommunityOfPracticeReadSerializer (cop )
270281 return Response (serializer .data )
271282
272283
@@ -283,7 +294,7 @@ def role_list(request):
283294
284295 Flow:
285296 1. Fetch all `Role` rows.
286- 2. Serialize via `RoleSerializer ` and return 200.
297+ 2. Serialize via `RoleReadSerializer ` and return 200.
287298
288299 URL:
289300 - GET /api/roles/
@@ -295,7 +306,7 @@ def role_list(request):
295306 - (none)
296307 """
297308 roles = Role .objects .all ()
298- serializer = RoleSerializer (roles , many = True )
309+ serializer = RoleReadSerializer (roles , many = True )
299310 return Response (serializer .data )
300311
301312
@@ -308,7 +319,7 @@ def role_detail(request, pk):
308319
309320 Flow:
310321 1. Look up the row by primary-key UUID.
311- 2. Serialize via `RoleSerializer ` and return 200.
322+ 2. Serialize via `RoleReadSerializer ` and return 200.
312323
313324 URL:
314325 - GET /api/roles/<uuid:pk>/
@@ -320,7 +331,7 @@ def role_detail(request, pk):
320331 - 404: No role exists with the given UUID.
321332 """
322333 role = get_object_or_404 (Role , pk = pk )
323- serializer = RoleSerializer (role )
334+ serializer = RoleReadSerializer (role )
324335 return Response (serializer .data )
325336
326337
@@ -337,7 +348,7 @@ def skill_list(request):
337348
338349 Flow:
339350 1. Fetch all `Skill` rows.
340- 2. Serialize via `SkillSerializer ` and return 200.
351+ 2. Serialize via `SkillReadSerializer ` and return 200.
341352
342353 URL:
343354 - GET /api/skills/
@@ -349,7 +360,7 @@ def skill_list(request):
349360 - (none)
350361 """
351362 skills = Skill .objects .all ()
352- serializer = SkillSerializer (skills , many = True )
363+ serializer = SkillReadSerializer (skills , many = True )
353364 return Response (serializer .data )
354365
355366
@@ -362,7 +373,7 @@ def skill_detail(request, pk):
362373
363374 Flow:
364375 1. Look up the row by primary-key UUID.
365- 2. Serialize via `SkillSerializer ` and return 200.
376+ 2. Serialize via `SkillReadSerializer ` and return 200.
366377
367378 URL:
368379 - GET /api/skills/<uuid:pk>/
@@ -374,7 +385,7 @@ def skill_detail(request, pk):
374385 - 404: No skill exists with the given UUID.
375386 """
376387 skill = get_object_or_404 (Skill , pk = pk )
377- serializer = SkillSerializer (skill )
388+ serializer = SkillReadSerializer (skill )
378389 return Response (serializer .data )
379390
380391
@@ -390,7 +401,7 @@ def project_list(request):
390401
391402 Flow:
392403 1. Fetch all `Project` rows.
393- 2. Serialize via `ProjectSerializer ` and return 200.
404+ 2. Serialize via `ProjectReadSerializer ` and return 200.
394405
395406 URL:
396407 - GET /api/projects/
@@ -402,7 +413,7 @@ def project_list(request):
402413 - (none)
403414 """
404415 projects = Project .objects .all ()
405- serializer = ProjectSerializer (projects , many = True )
416+ serializer = ProjectReadSerializer (projects , many = True )
406417 return Response (serializer .data )
407418
408419
@@ -415,7 +426,7 @@ def project_detail(request, pk):
415426
416427 Flow:
417428 1. Look up the row by primary-key UUID.
418- 2. Serialize via `ProjectSerializer ` and return 200.
429+ 2. Serialize via `ProjectReadSerializer ` and return 200.
419430
420431 URL:
421432 - GET /api/projects/<uuid:pk>/
@@ -427,5 +438,5 @@ def project_detail(request, pk):
427438 - 404: No project exists with the given UUID.
428439 """
429440 project = get_object_or_404 (Project , pk = pk )
430- serializer = ProjectSerializer (project )
441+ serializer = ProjectReadSerializer (project )
431442 return Response (serializer .data )
0 commit comments