diff options
Diffstat (limited to 'pydis_site/apps/api')
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 23 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/user.py | 22 | 
2 files changed, 23 insertions, 22 deletions
| diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index ee950cf4..25c5c82e 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -263,13 +263,32 @@ class UserListSerializer(ListSerializer):          User.objects.bulk_create(new_users, ignore_conflicts=True)          return [] -    def update(self, instance: QuerySet, validated_data: list) -> list: +    def update(self, queryset: QuerySet, validated_data: list) -> list:          """          Override update method to support bulk updates.          ref:https://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update          """ -        instance_mapping = {user.id: user for user in instance} +        object_ids = set() + +        for data in validated_data: +            try: +                if data["id"] in object_ids: +                    # If request data contains users with same ID. +                    raise ValidationError( +                        {"id": [f"User with ID {data['id']} given multiple times."]} +                    ) +            except KeyError: +                # If user ID not provided in request body. +                raise ValidationError( +                    {"id": ["This field is required."]} +                ) +            object_ids.add(data["id"]) + +        # filter queryset +        filtered_instances = queryset.filter(id__in=object_ids) + +        instance_mapping = {user.id: user for user in filtered_instances}          updated = []          fields_to_update = set() diff --git a/pydis_site/apps/api/viewsets/bot/user.py b/pydis_site/apps/api/viewsets/bot/user.py index 9ddd13d4..3e4b627e 100644 --- a/pydis_site/apps/api/viewsets/bot/user.py +++ b/pydis_site/apps/api/viewsets/bot/user.py @@ -6,7 +6,7 @@ from rest_framework.decorators import action  from rest_framework.pagination import PageNumberPagination  from rest_framework.request import Request  from rest_framework.response import Response -from rest_framework.serializers import ModelSerializer, ValidationError +from rest_framework.serializers import ModelSerializer  from rest_framework.viewsets import ModelViewSet  from pydis_site.apps.api.models.bot.user import User @@ -210,26 +210,8 @@ class UserViewSet(ModelViewSet):      @action(detail=False, methods=["PATCH"], name='user-bulk-patch')      def bulk_patch(self, request: Request) -> Response:          """Update multiple User objects in a single request.""" -        queryset = self.get_queryset() -        object_ids = set() -        for data in request.data: -            try: -                if data["id"] in object_ids: -                    # If request data contains users with same ID. -                    raise ValidationError( -                        {"id": [f"User with ID {data['id']} given multiple times."]} -                    ) -            except KeyError: -                # If user ID not provided in request body. -                raise ValidationError( -                    {"id": ["This field is required."]} -                ) -            object_ids.add(data["id"]) - -        filtered_instances = queryset.filter(id__in=object_ids) -          serializer = self.get_serializer( -            instance=filtered_instances, +            instance=self.get_queryset(),              data=request.data,              many=True,              partial=True | 
