diff --git a/frontend/src/api/alarms.js b/frontend/src/api/alarms.js index a25b368ef..2c9043cf2 100644 --- a/frontend/src/api/alarms.js +++ b/frontend/src/api/alarms.js @@ -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 }) }, } diff --git a/modoboa/admin/api/v2/serializers.py b/modoboa/admin/api/v2/serializers.py index b955685e0..f41e729d8 100644 --- a/modoboa/admin/api/v2/serializers.py +++ b/modoboa/admin/api/v2/serializers.py @@ -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.""" diff --git a/modoboa/admin/api/v2/tests.py b/modoboa/admin/api/v2/tests.py index f495c0ebb..f5d318d0b 100644 --- a/modoboa/admin/api/v2/tests.py +++ b/modoboa/admin/api/v2/tests.py @@ -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() diff --git a/modoboa/admin/api/v2/viewsets.py b/modoboa/admin/api/v2/viewsets.py index 702440aa9..e75d137c4 100644 --- a/modoboa/admin/api/v2/viewsets.py +++ b/modoboa/admin/api/v2/viewsets.py @@ -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)