Skip to content

Commit 4f5acbc

Browse files
mkovaluaadlius
authored andcommitted
ENG-9127 add contributors from parent project to component
1 parent 2fa247b commit 4f5acbc

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

api/nodes/serializers.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,6 +1301,12 @@ def update(self, instance, validated_data):
13011301
validated_data,
13021302
)
13031303

1304+
class NodeContributorsUpdateSerializer(ser.Serializer):
1305+
def update(self, instance, validated_data):
1306+
if project := instance.root:
1307+
instance.copy_contributors_from(project)
1308+
return instance
1309+
13041310

13051311
class NodeLinksSerializer(JSONAPISerializer):
13061312

api/nodes/views.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
DraftRegistrationDetailLegacySerializer,
110110
NodeContributorsSerializer,
111111
NodeContributorDetailSerializer,
112+
NodeContributorsUpdateSerializer,
112113
NodeInstitutionsRelationshipSerializer,
113114
NodeContributorsCreateSerializer,
114115
NodeViewOnlyLinkSerializer,
@@ -434,11 +435,16 @@ class NodeContributorsList(BaseContributorList, bulk_views.BulkUpdateJSONAPIView
434435
def get_resource(self):
435436
return self.get_node()
436437

438+
def get_object(self):
439+
return self.get_node()
440+
437441
# overrides ListBulkCreateJSONAPIView, BulkUpdateJSONAPIView, BulkDeleteJSONAPIView
438442
def get_serializer_class(self):
439443
"""
440444
Use NodeContributorDetailSerializer which requires 'id'
441445
"""
446+
if self.request.method == 'PATCH' and self.request.query_params.get('copy_contributors_from_parent_project'):
447+
return NodeContributorsUpdateSerializer
442448
if self.request.method == 'PUT' or self.request.method == 'PATCH' or self.request.method == 'DELETE':
443449
return NodeContributorDetailSerializer
444450
elif self.request.method == 'POST':
@@ -500,6 +506,19 @@ def get_serializer_context(self):
500506
return context
501507

502508

509+
def patch(self, request, *args, **kwargs):
510+
"""
511+
Override the default patch behavior to handle the special case
512+
of updating contributors by copying contributors from the parent project.
513+
"""
514+
if request.query_params.get('copy_contributors_from_parent_project'):
515+
instance = self.get_object()
516+
serializer = self.get_serializer_class()(instance, data=request.data)
517+
serializer.is_valid(raise_exception=True)
518+
serializer.save()
519+
return Response(serializer.data, status=200)
520+
return super().patch(request, *args, **kwargs)
521+
503522
class NodeContributorDetail(BaseContributorDetail, generics.RetrieveUpdateDestroyAPIView, NodeMixin, UserMixin):
504523
"""The documentation for this endpoint can be found [here](https://developer.osf.io/#operation/nodes_contributors_read).
505524
"""

0 commit comments

Comments
 (0)