From c127c5d093dd1a96c1679a24f28a34a4b743ba0f Mon Sep 17 00:00:00 2001 From: i701 Date: Sun, 6 Apr 2025 22:40:07 +0500 Subject: [PATCH] Add registered field to CreateDeviceSerializer and enhance BlockDeviceSerializer with reason_for_blocking and blocked_by fields --- devices/serializers.py | 12 ++++++++++-- devices/views.py | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/devices/serializers.py b/devices/serializers.py index 57f4c2f..ac45469 100644 --- a/devices/serializers.py +++ b/devices/serializers.py @@ -4,17 +4,25 @@ from api.serializers import CustomReadOnlyUserSerializer class CreateDeviceSerializer(serializers.ModelSerializer): + name = serializers.CharField(required=True) + mac = serializers.CharField(required=True) + registered = serializers.BooleanField(required=True) + class Meta: model = Device - fields = ["name", "mac"] + fields = ["name", "mac", "registered", "blocked_by"] class BlockDeviceSerializer(serializers.ModelSerializer): blocked = serializers.BooleanField(required=True) + reason_for_blocking = serializers.CharField(required=True) + blocked_by = serializers.ChoiceField( + choices=[("ADMIN", "Admin"), ("PARENT", "Parent")], required=True + ) class Meta: model = Device - fields = ["blocked"] + fields = ["blocked", "reason_for_blocking", "blocked_by"] class DeviceSerializer(serializers.ModelSerializer): diff --git a/devices/views.py b/devices/views.py index 2ca59a0..05b7987 100644 --- a/devices/views.py +++ b/devices/views.py @@ -69,21 +69,22 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView): serializer_class = CreateDeviceSerializer lookup_field = "pk" - def update(self, request, *args, **kwargs): - # Pass 'partial=True' to allow partial updates + def update(self, request, **kwargs): + instance = self.get_object() user_id = request.user.id - partial = kwargs.pop("partial", True) - instance = self.get_object() if not request.user.is_superuser and instance.user_id != user_id: return Response( {"message": "You are not authorized to update this device."}, status=403, ) - mac = request.data.get("mac", None) - if not re.match(r"^([0-9A-Fa-f]{2}([.:-]?)){5}[0-9A-Fa-f]{2}$", mac): - return Response({"message": "Invalid mac address"}, status=400) - serializer = self.get_serializer(instance, data=request.data, partial=partial) + + # Validate MAC address format + mac = request.data.get("mac") + if mac and not re.match(r"^([0-9A-Fa-f]{2}([.:-]?)){5}[0-9A-Fa-f]{2}$", mac): + return Response({"message": "Invalid MAC address"}, status=400) + + serializer = self.get_serializer(instance, data=request.data, partial=True) serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Response(serializer.data) @@ -98,7 +99,6 @@ class DeviceBlockAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView): # Pass 'partial=True' to allow partial updates user_id = request.user.id - partial = kwargs.pop("partial", True) instance = self.get_object() if not request.user.is_superuser and instance.user_id != user_id: return Response( @@ -112,7 +112,7 @@ class DeviceBlockAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView): return Response({"message": "Blocked field must be a boolean."}, status=400) instance.blocked = blocked instance.save() - serializer = self.get_serializer(instance, data=request.data, partial=partial) + serializer = self.get_serializer(instance, data=request.data, partial=False) serializer.is_valid(raise_exception=True) self.perform_update(serializer) return Response(serializer.data)