aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pydis_site/apps/api/serializers.py23
-rw-r--r--pydis_site/apps/api/viewsets/bot/user.py22
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