Add registered field to CreateDeviceSerializer and enhance BlockDeviceSerializer with reason_for_blocking and blocked_by fields

This commit is contained in:
i701 2025-04-06 22:40:07 +05:00
parent b415d8f35b
commit c127c5d093
Signed by: i701
GPG Key ID: 54A0DA1E26D8E587
2 changed files with 20 additions and 12 deletions

View File

@ -4,17 +4,25 @@ from api.serializers import CustomReadOnlyUserSerializer
class CreateDeviceSerializer(serializers.ModelSerializer): class CreateDeviceSerializer(serializers.ModelSerializer):
name = serializers.CharField(required=True)
mac = serializers.CharField(required=True)
registered = serializers.BooleanField(required=True)
class Meta: class Meta:
model = Device model = Device
fields = ["name", "mac"] fields = ["name", "mac", "registered", "blocked_by"]
class BlockDeviceSerializer(serializers.ModelSerializer): class BlockDeviceSerializer(serializers.ModelSerializer):
blocked = serializers.BooleanField(required=True) 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: class Meta:
model = Device model = Device
fields = ["blocked"] fields = ["blocked", "reason_for_blocking", "blocked_by"]
class DeviceSerializer(serializers.ModelSerializer): class DeviceSerializer(serializers.ModelSerializer):

View File

@ -69,21 +69,22 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
serializer_class = CreateDeviceSerializer serializer_class = CreateDeviceSerializer
lookup_field = "pk" lookup_field = "pk"
def update(self, request, *args, **kwargs): def update(self, request, **kwargs):
# Pass 'partial=True' to allow partial updates instance = self.get_object()
user_id = request.user.id 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: if not request.user.is_superuser and instance.user_id != user_id:
return Response( return Response(
{"message": "You are not authorized to update this device."}, {"message": "You are not authorized to update this device."},
status=403, 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): # Validate MAC address format
return Response({"message": "Invalid mac address"}, status=400) mac = request.data.get("mac")
serializer = self.get_serializer(instance, data=request.data, partial=partial) 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) serializer.is_valid(raise_exception=True)
self.perform_update(serializer) self.perform_update(serializer)
return Response(serializer.data) return Response(serializer.data)
@ -98,7 +99,6 @@ class DeviceBlockAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
# Pass 'partial=True' to allow partial updates # Pass 'partial=True' to allow partial updates
user_id = request.user.id user_id = request.user.id
partial = kwargs.pop("partial", True)
instance = self.get_object() instance = self.get_object()
if not request.user.is_superuser and instance.user_id != user_id: if not request.user.is_superuser and instance.user_id != user_id:
return Response( return Response(
@ -112,7 +112,7 @@ class DeviceBlockAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
return Response({"message": "Blocked field must be a boolean."}, status=400) return Response({"message": "Blocked field must be a boolean."}, status=400)
instance.blocked = blocked instance.blocked = blocked
instance.save() 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) serializer.is_valid(raise_exception=True)
self.perform_update(serializer) self.perform_update(serializer)
return Response(serializer.data) return Response(serializer.data)