Add BlockDeviceSerializer and DeviceBlockAPIView for blocking devices

This commit is contained in:
i701 2025-04-06 21:38:41 +05:00
parent a8adddfda4
commit b415d8f35b
Signed by: i701
GPG Key ID: 54A0DA1E26D8E587
3 changed files with 50 additions and 0 deletions

View File

@ -9,6 +9,14 @@ class CreateDeviceSerializer(serializers.ModelSerializer):
fields = ["name", "mac"] fields = ["name", "mac"]
class BlockDeviceSerializer(serializers.ModelSerializer):
blocked = serializers.BooleanField(required=True)
class Meta:
model = Device
fields = ["blocked"]
class DeviceSerializer(serializers.ModelSerializer): class DeviceSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Device model = Device

View File

@ -18,6 +18,11 @@ urlpatterns = [
views.DeviceUpdateAPIView.as_view(), views.DeviceUpdateAPIView.as_view(),
name="device-edit", name="device-edit",
), ),
path(
"<int:pk>/block/",
views.DeviceBlockAPIView.as_view(),
name="device-block",
),
path( path(
"<int:pk>/delete/", "<int:pk>/delete/",
views.DeviceDestroyAPIView.as_view(), views.DeviceDestroyAPIView.as_view(),

View File

@ -6,6 +6,7 @@ from .serializers import (
CreateDeviceSerializer, CreateDeviceSerializer,
DeviceSerializer, DeviceSerializer,
ReadOnlyDeviceSerializer, ReadOnlyDeviceSerializer,
BlockDeviceSerializer,
) )
from api.mixins import StaffEditorPermissionMixin from api.mixins import StaffEditorPermissionMixin
from .filters import DeviceFilter from .filters import DeviceFilter
@ -70,8 +71,15 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
def update(self, request, *args, **kwargs): def update(self, request, *args, **kwargs):
# Pass 'partial=True' to allow partial updates # Pass 'partial=True' to allow partial updates
user_id = request.user.id
partial = kwargs.pop("partial", True) 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:
return Response(
{"message": "You are not authorized to update this device."},
status=403,
)
mac = request.data.get("mac", None) mac = request.data.get("mac", None)
if not re.match(r"^([0-9A-Fa-f]{2}([.:-]?)){5}[0-9A-Fa-f]{2}$", mac): 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) return Response({"message": "Invalid mac address"}, status=400)
@ -81,6 +89,35 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
return Response(serializer.data) 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): class DeviceDestroyAPIView(StaffEditorPermissionMixin, generics.DestroyAPIView):
queryset = Device.objects.all() queryset = Device.objects.all()
serializer_class = DeviceSerializer serializer_class = DeviceSerializer