Skip to content

Commit

Permalink
Add a bulk delete for operations
Browse files Browse the repository at this point in the history
  • Loading branch information
Jon committed Feb 12, 2025
1 parent 27e8c1d commit e390b8d
Show file tree
Hide file tree
Showing 4 changed files with 654 additions and 529 deletions.
27 changes: 27 additions & 0 deletions datalab/datalab_session/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from rest_framework.test import APITestCase
from mixer.backend.django import mixer
from django.contrib.auth.models import User
from django.urls import reverse

from datalab.datalab_session.models import DataOperation, DataSession


class TestOperationsApi(APITestCase):
def setUp(self) -> None:
super().setUp()
self.user = mixer.blend(User)
self.client.force_login(self.user)
self.session = mixer.blend(DataSession)

def test_bulk_delete(self):
operation1 = mixer.blend(DataOperation, session=self.session)
operation2 = mixer.blend(DataOperation, session=self.session)
operation3 = mixer.blend(DataOperation, session=self.session)

to_delete = {'ids': [operation1.id, operation3.id]}
response = self.client.post(reverse('api:datasession-operations-bulk-delete', args=(self.session.id,)), data=to_delete)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.json()['deleted'], 2)
# Only operation2 was not deleted
self.assertEqual(DataOperation.objects.all().count(), 1)
self.assertEqual(DataOperation.objects.first().id, operation2.id)
8 changes: 8 additions & 0 deletions datalab/datalab_session/viewsets.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action
from django_filters.rest_framework import DjangoFilterBackend

from datalab.datalab_session.serializers import DataSessionSerializer, DataOperationSerializer
Expand Down Expand Up @@ -28,6 +29,13 @@ def retrieve(self, request, *args, **kwargs):

return Response(serializer.data)

@action(detail=False, methods=['post'])
def bulk_delete(self, request, session_pk=None):
''' Bulk Delete given a list of operation ids '''
ids_to_delete = request.data.get('ids')
num_deleted, _ = DataOperation.objects.filter(pk__in=ids_to_delete, session__pk=session_pk).delete()
return Response({'deleted': num_deleted})


class DataSessionViewSet(viewsets.ModelViewSet):
serializer_class = DataSessionSerializer
Expand Down
Loading

0 comments on commit e390b8d

Please sign in to comment.