Skip to content
Snippets Groups Projects

Retrieve dataset element neighbors with ListElementDatasets

Merged ml bonhomme requested to merge dataset-nav into master
All threads resolved!
3 files
+ 252
3
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -1204,6 +1204,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
self.page2.refresh_from_db()
self.page3.refresh_from_db()
# ListDatasetElements
def test_list_elements_requires_login(self):
with self.assertNumQueries(0):
response = self.client.get(reverse("api:dataset-elements", kwargs={"pk": str(self.dataset.id)}))
@@ -1271,6 +1273,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
elements = {
self.page1.id: {
"set": "training",
"previous": None,
"next": None,
"element": {
"id": str(self.page1.id),
"confidence": None,
@@ -1320,6 +1324,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
},
self.page2.id: {
"set": "validation",
"previous": None,
"next": None,
"element": {
"id": str(self.page2.id),
"confidence": None,
@@ -1369,6 +1375,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
},
self.page3.id: {
"set": "validation",
"previous": None,
"next": None,
"element": {
"id": str(self.page3.id),
"confidence": 0.42,
@@ -1418,6 +1426,8 @@ class TestDatasetsAPI(FixtureAPITestCase):
},
self.vol.id: {
"set": "test",
"previous": None,
"next": None,
"element": {
"id": str(self.vol.id),
"confidence": None,
@@ -1460,6 +1470,225 @@ class TestDatasetsAPI(FixtureAPITestCase):
self.assertIsNone(data["count"])
self.assertListEqual(data["results"], first_three)
@patch("arkindex.documents.models.Element.thumbnail", MagicMock(s3_url="s3_url"))
def test_list_elements_with_neighbors(self):
self.maxDiff = None
self.dataset.dataset_elements.create(element_id=self.vol.id, set="test")
self.dataset.dataset_elements.create(element_id=self.page1.id, set="training")
self.dataset.dataset_elements.create(element_id=self.page2.id, set="validation")
self.dataset.dataset_elements.create(element_id=self.page3.id, set="validation")
# The elements retrieved when listing dataset elements are ordered by element id so this
# test needs to be insensitive to element id changes when regenerating test fixtures
elements = {
self.page1.id: {
"set": "training",
"previous": None,
"next": None,
"element": {
"id": str(self.page1.id),
"confidence": None,
"type": "page",
"mirrored": False,
"corpus": {
"id": str(self.corpus.id),
"name": "Unit Tests",
"public": True
},
"name": self.page1.name,
"zone": {
"id": str(self.page1.id),
"image": {
"id": str(self.page1.image.id),
"height": 1000,
"width": 1000,
"url": "http://server/img1",
"path": "img1",
"status": "unchecked",
"s3_url": None,
"server": {
"display_name": "Test Server",
"max_height": None,
"max_width": None,
"url": "http://server"
},
},
"polygon": [
[0, 0],
[0, 1000],
[1000, 1000],
[1000, 0],
[0, 0]
],
"url": "http://server/img1/0,0,1000,1000/full/0/default.jpg"
},
"rotation_angle": 0,
"classes": None,
"has_children": None,
"metadata": None,
"worker_run": None,
"worker_version_id": None,
"thumbnail_url": None,
"created": FAKE_CREATED
},
},
self.page2.id: {
"set": "validation",
"previous": None,
"next": None,
"element": {
"id": str(self.page2.id),
"confidence": None,
"type": "page",
"mirrored": False,
"corpus": {
"id": str(self.corpus.id),
"name": "Unit Tests",
"public": True
},
"name": self.page2.name,
"zone": {
"id": str(self.page2.id),
"image": {
"id": str(self.page2.image.id),
"height": 1000,
"width": 1000,
"url": "http://server/img2",
"path": "img2",
"status": "unchecked",
"s3_url": None,
"server": {
"display_name": "Test Server",
"max_height": None,
"max_width": None,
"url": "http://server"
},
},
"polygon": [
[0, 0],
[0, 1000],
[1000, 1000],
[1000, 0],
[0, 0]
],
"url": "http://server/img2/0,0,1000,1000/full/0/default.jpg"
},
"rotation_angle": 0,
"classes": None,
"has_children": None,
"metadata": None,
"worker_run": None,
"worker_version_id": None,
"thumbnail_url": None,
"created": FAKE_CREATED
},
},
self.page3.id: {
"set": "validation",
"previous": None,
"next": None,
"element": {
"id": str(self.page3.id),
"confidence": None,
"type": "page",
"mirrored": False,
"corpus": {
"id": str(self.corpus.id),
"name": "Unit Tests",
"public": True
},
"name": self.page3.name,
"zone": {
"id": str(self.page3.id),
"image": {
"id": str(self.page3.image.id),
"height": 1000,
"width": 1000,
"url": "http://server/img3",
"path": "img3",
"status": "unchecked",
"s3_url": None,
"server": {
"display_name": "Test Server",
"max_height": None,
"max_width": None,
"url": "http://server"
},
},
"polygon": [
[0, 0],
[0, 1000],
[1000, 1000],
[1000, 0],
[0, 0]
],
"url": "http://server/img3/0,0,1000,1000/full/0/default.jpg"
},
"rotation_angle": 0,
"classes": None,
"has_children": None,
"metadata": None,
"worker_run": None,
"worker_version_id": None,
"thumbnail_url": None,
"created": FAKE_CREATED
},
},
self.vol.id: {
"set": "test",
"previous": None,
"next": None,
"element": {
"id": str(self.vol.id),
"confidence": None,
"type": "volume",
"mirrored": False,
"name": "Volume 1",
"corpus": {
"id": str(self.corpus.id),
"name": "Unit Tests",
"public": True
},
"zone": None,
"rotation_angle": 0,
"classes": None,
"has_children": None,
"metadata": None,
"worker_run": None,
"worker_version_id": None,
"thumbnail_url": "s3_url",
"created": FAKE_CREATED
},
}
}
first_three = [value for key, value in sorted(elements.items())[:3]]
self.client.force_login(self.read_user)
for state in DatasetState:
# A dataset should be readable in any state
self.dataset.state = state
self.dataset.save()
with self.subTest(state=state):
with self.assertNumQueries(6):
response = self.client.get(
reverse("api:dataset-elements", kwargs={"pk": self.dataset.pk}),
{"page_size": 3, "with_neighbors": True},
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertTrue("?cursor=" in data["next"])
self.assertIsNone(data["count"])
# Add next and previous values
first_three[0]["next"] = first_three[1]["element"]["id"]
first_three[1]["previous"] = first_three[0]["element"]["id"]
first_three[1]["next"] = first_three[2]["element"]["id"]
first_three[2]["previous"] = first_three[1]["element"]["id"]
self.assertListEqual(data["results"], first_three)
# CreateDatasetElement
def test_add_element_requires_login(self):
with self.assertNumQueries(0):
response = self.client.post(reverse("api:dataset-elements", kwargs={"pk": self.dataset.id}))
Loading