diff --git a/arkindex/documents/api/entities.py b/arkindex/documents/api/entities.py index a367855115ee06f1b7294c1b7bd955c71c1bd7ca..60465f9341456b6e16d155b93063f73f76a738ca 100644 --- a/arkindex/documents/api/entities.py +++ b/arkindex/documents/api/entities.py @@ -29,6 +29,7 @@ from arkindex.documents.models import ( ) from arkindex.documents.serializers.elements import ElementEntitiesSerializer, ElementSlimSerializer from arkindex.documents.serializers.entities import ( + BaseEntitySerializer, CreateEntityRoleErrorResponseSerializer, EntityCreateSerializer, EntityLinkCreateSerializer, @@ -331,6 +332,22 @@ class ElementEntities(RetrieveAPIView): return Element.objects.filter(corpus__in=corpora).select_related('type').only('id', 'type__slug', 'name') +@extend_schema_view( + get=extend_schema( + operation_id='ListCorpusEntities', + tags=['entities'], + ) +) +class CorpusEntities(CorpusACLMixin, ListAPIView): + """ + List all entities in a corpus. + """ + serializer_class = BaseEntitySerializer + + def get_queryset(self): + return self.get_corpus(self.kwargs['pk']).entities.order_by('name', 'id') + + @extend_schema_view(get=extend_schema(operation_id='ListElementLinks', tags=['entities'])) class ElementLinks(CorpusACLMixin, ListAPIView): """ diff --git a/arkindex/documents/tests/test_entities_api.py b/arkindex/documents/tests/test_entities_api.py index d38958f47b5e5b32eeb5f092940457bc37da986c..a284fba789d845ce6cebe39c57830f51985c4939 100644 --- a/arkindex/documents/tests/test_entities_api.py +++ b/arkindex/documents/tests/test_entities_api.py @@ -685,6 +685,43 @@ class TestEntitiesAPI(FixtureAPITestCase): }] ) + def test_list_corpus_entities(self): + with self.assertNumQueries(3): + response = self.client.get(reverse('api:corpus-entities', kwargs={'pk': str(self.corpus.id)})) + self.assertEqual(response.status_code, status.HTTP_200_OK) + data = response.json() + self.assertDictEqual(data, { + 'count': 2, + 'previous': None, + 'next': None, + 'number': 1, + 'results': [ + { + 'id': str(self.entity.id), + 'name': 'entity 1', + 'type': 'person', + 'validated': False, + 'dates': [], + 'metas': None, + 'worker_version_id': str(self.worker_version_1.id), + }, + { + 'id': str(self.entity_bis.id), + 'name': 'entity 2', + 'type': 'location', + 'validated': False, + 'dates': [], + 'metas': None, + 'worker_version_id': str(self.worker_version_2.id), + } + ] + }) + + def test_list_corpus_entities_acl(self): + with self.assertNumQueries(1): + response = self.client.get(reverse('api:corpus-entities', kwargs={'pk': str(self.private_corpus.id)})) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + def test_list_element_entities(self): """ List an element's entities sorted depending on their origin (metadata or transcriptions) diff --git a/arkindex/project/api_v1.py b/arkindex/project/api_v1.py index 26d6b27adaff08e8748a89dedeb51cd6f75340fc..79c8fa1c4a01619056aa07320dd3fe72328c0fdc 100644 --- a/arkindex/project/api_v1.py +++ b/arkindex/project/api_v1.py @@ -54,6 +54,7 @@ from arkindex.documents.api.elements import ( WorkerResultsDestroy, ) from arkindex.documents.api.entities import ( + CorpusEntities, CorpusRoles, ElementEntities, ElementLinks, @@ -135,6 +136,7 @@ api = [ # `corpus` and not `pk` so that OpenAPI uses a `corpus` parameter path('corpus/<uuid:corpus>/elements/', CorpusElements.as_view(), name='corpus-elements'), path('corpus/<uuid:pk>/classes/', CorpusMLClassList.as_view(), name='corpus-classes'), + path('corpus/<uuid:pk>/entities/', CorpusEntities.as_view(), name='corpus-entities'), path('corpus/<uuid:pk>/roles/', CorpusRoles.as_view(), name='corpus-roles'), path('corpus/<uuid:pk>/allowed-metadata/', CorpusAllowedMetaData.as_view(), name='corpus-allowed-metadata'), path('corpus/<uuid:pk>/versions/', CorpusWorkerVersionList.as_view(), name='corpus-versions'),