Skip to content
Snippets Groups Projects

New Process Dataset Sets management

Merged ml bonhomme requested to merge process-dataset-sets into master
All threads resolved!
2 files
+ 33
11
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -6,7 +6,7 @@ from django.utils import timezone as DjangoTimeZone
from rest_framework import status
from arkindex.documents.models import Corpus
from arkindex.process.models import Process, ProcessDataset, ProcessMode
from arkindex.process.models import Process, ProcessDatasetSet, ProcessMode
from arkindex.project.tests import FixtureAPITestCase
from arkindex.project.tools import fake_now
from arkindex.training.models import Dataset, DatasetElement, DatasetSet, DatasetState
@@ -30,8 +30,11 @@ class TestDatasetsAPI(FixtureAPITestCase):
cls.write_user = User.objects.get(email="user2@user.fr")
cls.dataset = Dataset.objects.get(name="First Dataset")
cls.dataset2 = Dataset.objects.get(name="Second Dataset")
ProcessDataset.objects.create(process=cls.process, dataset=cls.dataset, sets=["training", "test", "validation"])
ProcessDataset.objects.create(process=cls.process, dataset=cls.dataset2, sets=["test"])
ProcessDatasetSet.objects.bulk_create(
ProcessDatasetSet(process=cls.process, set=ds)
for ds in cls.dataset.sets.all()
)
ProcessDatasetSet.objects.create(process=cls.process, set=cls.dataset2.sets.get(name="test"))
cls.private_dataset = Dataset.objects.create(name="Private Dataset", description="Dead Sea Scrolls", corpus=cls.private_corpus, creator=cls.dataset_creator)
cls.private_dataset_set = DatasetSet.objects.create(dataset=cls.private_dataset, name="Private set")
cls.vol = cls.corpus.elements.get(name="Volume 1")
@@ -680,7 +683,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
)
def test_update_ponos_task_state_requires_dataset_in_process(self):
self.process.process_datasets.all().delete()
self.process.process_sets.all().delete()
with self.assertNumQueries(5):
response = self.client.put(
reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
@@ -841,7 +844,7 @@ class TestDatasetsAPI(FixtureAPITestCase):
self.assertEqual(self.dataset.state, DatasetState.Building)
def test_partial_update_ponos_task_state_requires_dataset_in_process(self):
self.process.process_datasets.all().delete()
self.process.process_sets.all().delete()
with self.assertNumQueries(5):
response = self.client.patch(
reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
@@ -1059,8 +1062,20 @@ class TestDatasetsAPI(FixtureAPITestCase):
self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
self.assertDictEqual(response.json(), {"detail": "Not found."})
def test_delete_dataset_in_process_forbidden(self):
self.client.force_login(self.user)
with self.assertNumQueries(4):
response = self.client.delete(
reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), ["This dataset cannot be deleted because at least one of its sets is used in a process."])
self.dataset.refresh_from_db()
def test_delete(self):
self.client.force_login(self.user)
# Remove dataset sets from process
ProcessDatasetSet.objects.filter(process_id=self.process.id, set__dataset_id=self.dataset.id).delete()
with self.assertNumQueries(7):
response = self.client.delete(
reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
@@ -1069,8 +1084,9 @@ class TestDatasetsAPI(FixtureAPITestCase):
with self.assertRaises(Dataset.DoesNotExist):
self.dataset.refresh_from_db()
def test_delete_not_open(self):
self.client.force_login(self.user)
@patch("arkindex.project.mixins.has_access", return_value=True)
def test_delete_not_open(self, has_access_mock):
self.client.force_login(self.write_user)
cases = [DatasetState.Building, DatasetState.Complete, DatasetState.Error]
for state in cases:
with self.subTest(state=state):
@@ -1080,8 +1096,11 @@ class TestDatasetsAPI(FixtureAPITestCase):
response = self.client.delete(
reverse("api:dataset-update", kwargs={"pk": self.dataset.pk}),
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
self.assertDictEqual(response.json(), {"detail": "Only datasets in an open state can be deleted."})
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(response.json(), ["Only datasets in an open state can be deleted."])
self.assertEqual(has_access_mock.call_count, 1)
self.assertEqual(has_access_mock.call_args, call(self.write_user, self.corpus, Role.Admin.value, skip_public=False))
has_access_mock.reset_mock()
def test_delete_elements(self):
"""
@@ -1093,6 +1112,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
train_set.set_elements.create(element_id=self.page1.id, set="training")
validation_set.set_elements.create(element_id=self.page2.id, set="validation")
validation_set.set_elements.create(element_id=self.page3.id, set="validation")
# Remove dataset sets from process
ProcessDatasetSet.objects.filter(process_id=self.process.id, set__dataset_id=self.dataset.id).delete()
self.client.force_login(self.user)
with self.assertNumQueries(7):
Loading