Add BlockDeviceSerializer and DeviceBlockAPIView for blocking devices

This commit is contained in:
2025-04-06 21:38:41 +05:00
parent a8adddfda4
commit b415d8f35b
3 changed files with 50 additions and 0 deletions

View File

@ -6,6 +6,7 @@ from .serializers import (
CreateDeviceSerializer,
DeviceSerializer,
ReadOnlyDeviceSerializer,
BlockDeviceSerializer,
)
from api.mixins import StaffEditorPermissionMixin
from .filters import DeviceFilter
@ -70,8 +71,15 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
def update(self, request, *args, **kwargs):
# 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(
{"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)
@ -81,6 +89,35 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
return Response(serializer.data)
class DeviceBlockAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
queryset = Device.objects.all()
serializer_class = BlockDeviceSerializer
lookup_field = "pk"
def update(self, request, *args, **kwargs):
# 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(
{"message": "You are not authorized to block this device."},
status=403,
)
blocked = request.data.get("blocked", None)
if blocked is None:
return Response({"message": "Blocked field is required."}, status=400)
if not isinstance(blocked, bool):
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.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
class DeviceDestroyAPIView(StaffEditorPermissionMixin, generics.DestroyAPIView):
queryset = Device.objects.all()
serializer_class = DeviceSerializer