mirror of
https://github.com/i701/sarlink-portal-api.git
synced 2025-04-19 23:46:53 +00:00
Add BlockDeviceSerializer and DeviceBlockAPIView for blocking devices
This commit is contained in:
parent
a8adddfda4
commit
b415d8f35b
@ -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
|
||||||
|
@ -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(),
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user