Merge pull request #3633 from modoboa/fix/alarm_bulk_delete

Changed HTTP method for alarm bulk delete endpoint
This commit is contained in:
Antoine Nguyen
2025-07-31 11:25:06 +02:00
committed by GitHub
4 changed files with 23 additions and 16 deletions
+1 -3
View File
@@ -13,8 +13,6 @@ export default {
return repository.delete(`${resource}/${alarmId}/`)
},
bulkDelete(alarmsIds) {
return repository.delete(`${resource}/bulk_delete/`, {
params: { ids: alarmsIds },
})
return repository.post(`${resource}/bulk_delete/`, { ids: alarmsIds })
},
}
+5
View File
@@ -741,6 +741,11 @@ class AlarmSerializer(serializers.ModelSerializer):
model = models.Alarm
class AlarmBulkDeleteSerializer(serializers.Serializer):
ids = serializers.ListField(child=serializers.IntegerField())
class AlarmSwitchStatusSerializer(serializers.Serializer):
"""Serializer to switch the status of an Alarm."""
+5 -3
View File
@@ -806,9 +806,10 @@ class AlarmViewSetTestCase(ModoAPITestCase):
def test_bulk_delete(self):
url = reverse("v2:alarm-bulk-delete")
resp = self.client.delete(url)
resp = self.client.post(url)
self.assertEqual(resp.status_code, 400)
resp = self.client.delete(f"{url}?ids[]=toto")
data = {"ids": ["toto"]}
resp = self.client.post(url, data, format="json")
self.assertEqual(resp.status_code, 400)
alarm1 = factories.AlarmFactory(
domain__name="test.com", mailbox=None, title="Test alarm"
@@ -816,7 +817,8 @@ class AlarmViewSetTestCase(ModoAPITestCase):
alarm2 = factories.AlarmFactory(
domain__name="test.com", mailbox=None, title="Test alarm"
)
resp = self.client.delete(f"{url}?ids[]={alarm1.pk}&ids[]={alarm2.pk}")
data = {"ids": [alarm1.pk, alarm2.pk]}
resp = self.client.post(url, data, format="json")
self.assertEqual(resp.status_code, 204)
with self.assertRaises(models.Alarm.DoesNotExist):
alarm1.refresh_from_db()
+12 -10
View File
@@ -387,11 +387,18 @@ class AlarmViewSet(
.order_by("-created")
)
def get_serializer_class(self, *args, **kwargs):
if self.action == "bulk_delete":
return serializers.AlarmBulkDeleteSerializer
elif self.action == "switch":
return serializers.AlarmSwitchStatusSerializer
return serializers.AlarmSerializer
@action(methods=["patch"], detail=True)
def switch(self, request, **kwargs):
"""Custom update method that switch status of an alarm."""
alarm = self.get_object()
serializer = serializers.AlarmSwitchStatusSerializer(data=request.data)
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
if serializer.data["status"] == constants.ALARM_CLOSED:
alarm.close()
@@ -399,15 +406,10 @@ class AlarmViewSet(
alarm.reopen()
return response.Response(status=status.HTTP_204_NO_CONTENT)
@action(methods=["delete"], detail=False)
@action(methods=["post"], detail=False)
def bulk_delete(self, request, **kwargs):
"""Delete multiple alarms at the same time."""
ids = request.query_params.getlist("ids[]")
if not ids:
return response.Response(_("No alarm ID provided"), status=400)
try:
ids = [int(alarm_id) for alarm_id in ids]
except ValueError:
return response.Response(_("Received invalid alarm id(s)"), status=400)
models.Alarm.objects.filter(pk__in=ids).delete()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
models.Alarm.objects.filter(pk__in=serializer.validated_data["ids"]).delete()
return response.Response(status=204)