Skip to content
Snippets Groups Projects
Commit 4d49e792 authored by Valentin Rigal's avatar Valentin Rigal Committed by Erwan Rouchet
Browse files

Endpoint to list a transcription's entities

parent 0d4cd40d
No related branches found
No related tags found
No related merge requests found
from arkindex.documents.models import \
EntityRole, Entity, Corpus, Element, Transcription
EntityRole, Entity, Corpus, Element, Transcription, TranscriptionEntity
from arkindex.project.mixins import CorpusACLMixin
from rest_framework.generics import \
ListAPIView, ListCreateAPIView, RetrieveAPIView, CreateAPIView
from arkindex.documents.serializers.entities import (
EntityRoleSerializer, EntitySerializer, EntityCreateSerializer, EntityLinkCreateSerializer,
TranscriptionEntitySerializer,
TranscriptionEntitySerializer, TranscriptionEntityDetailsSerializer
)
from arkindex.documents.serializers.elements import ElementSerializer
from rest_framework.exceptions import ValidationError
......@@ -108,3 +108,20 @@ class TranscriptionEntityCreate(CreateAPIView):
if not tr or tr.element.corpus not in Corpus.objects.readable(self.request.user):
raise ValidationError({'transcription': ['invalid UUID or Corpus write-access is forbidden']})
return {**context, 'transcription': tr}
class TranscriptionEntities(ListAPIView):
"""
Retrieve all entities linked to a specific transcription
"""
permission_classes = (IsVerified, )
serializer_class = TranscriptionEntityDetailsSerializer
def get_queryset(self):
return TranscriptionEntity.objects \
.filter(
transcription_id=self.kwargs['pk'],
transcription__element__corpus__in=Corpus.objects.readable(self.request.user)
) \
.order_by('offset') \
.prefetch_related('entity')
......@@ -149,3 +149,12 @@ class TranscriptionEntitySerializer(serializers.ModelSerializer):
except DjangoValidationError as e:
raise serializers.ValidationError(serializers.as_serializer_error(e))
return data
class TranscriptionEntityDetailsSerializer(TranscriptionEntitySerializer):
"""
Serialize the link between a transcription and a detailled entity
"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['entity'] = EntityLightSerializer()
from django.urls import reverse
from rest_framework import status
from arkindex_common.enums import TranscriptionType, MetaType, EntityType
from arkindex_common.enums import MetaType, TranscriptionType, EntityType
from arkindex.documents.models import Element, ElementType, DataSource, \
Page, Act, Corpus, DateType, Entity, EntityRole, EntityLink, MetaData, TranscriptionEntity
Page, Act, Corpus, DateType, Entity
from arkindex.images.models import ImageServer
from arkindex.project.tests import FixtureAPITestCase
from arkindex.project.aws import S3FileStatus
......@@ -15,33 +15,10 @@ class TestElementsAPI(FixtureAPITestCase):
super().setUpTestData()
cls.vol = Element.objects.get(name='Volume 1', type=ElementType.Volume, corpus=cls.corpus)
cls.page = Element.objects.filter(type=ElementType.Page, corpus=cls.corpus).first().page
cls.src = DataSource.objects.get(slug='test')
cls.private_corpus = Corpus.objects.create(name='private', public=False)
cls.image = ImageServer.objects.local.images.create(
path="kingdom/far/away",
status=S3FileStatus.Checked
)
cls.entity = Entity.objects.create(type=EntityType.Person, corpus=cls.corpus, name="an entity")
cls.role = EntityRole.objects.create(
parent_name="parent",
child_name="child",
parent_type=EntityType.Person,
child_type=EntityType.Location,
corpus=cls.corpus
)
cls.transcription = cls.page.transcriptions.create(
text='Some transcribed text',
source_id=cls.src.id,
type=TranscriptionType.Line
)
def setUp(self):
super().setUp()
self.tr_entities_sample = {
'entity': str(self.entity.id),
'offset': 4,
'length': len(self.entity.name)
}
def test_get_element(self):
# Add metadatas, dates and entities to the element
......@@ -239,7 +216,10 @@ class TestElementsAPI(FixtureAPITestCase):
self.page.transcriptions.all().delete()
transcriptions = []
for i in range(10):
transcriptions.append(self.page.transcriptions.create(source_id=self.src.id, type=TranscriptionType.Word))
transcriptions.append(self.page.transcriptions.create(
source_id=DataSource.objects.get(slug='test').id,
type=TranscriptionType.Word
))
self.client.force_login(self.user)
response = self.client.get(reverse('api:element-transcriptions', kwargs={'pk': str(self.page.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
......@@ -259,230 +239,3 @@ class TestElementsAPI(FixtureAPITestCase):
results = data['results']
for result in results:
self.assertIn(nameSelected, result['name'])
def test_get_entity(self):
response = self.client.get(reverse('api:entity-details', kwargs={'pk': str(self.entity.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data['id'], str(self.entity.id))
self.assertEqual(data['type'], 'person')
self.assertEqual(data['corpus']['id'], str(self.corpus.id))
self.assertEqual(data['name'], 'an entity')
def test_get_entity_elements(self):
element = Element.objects.create(corpus=self.corpus, type=ElementType.Act, name="an element")
MetaData.objects.create(
name='test 1',
type=MetaType.Entity,
value='Blah',
element=element,
entity=self.entity,
)
response = self.client.get(reverse('api:entity-elements', kwargs={'pk': str(self.entity.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
results = data['results']
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['id'], str(element.id))
self.assertEqual(results[0]['name'], 'an element')
def test_get_role_in_corpus(self):
response = self.client.get(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
results = data['results']
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['parent_type'], self.role.parent_type.value)
self.assertEqual(results[0]['child_type'], self.role.child_type.value)
self.assertEqual(results[0]['parent_name'], self.role.parent_name)
self.assertEqual(results[0]['child_name'], self.role.child_name)
def test_create_role_in_corpus(self):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': EntityType.Person.value,
'child_type': EntityType.Location.value
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
data = response.json()
self.assertIn('id', data)
role = self.corpus.roles.get(id=data['id'])
self.assertEqual(role.parent_type, EntityType.Person)
self.assertEqual(role.child_type, EntityType.Location)
self.assertEqual(role.parent_name, 'other parent')
self.assertEqual(role.child_name, 'other child')
def test_create_role_already_exist(self):
data = {
'parent_name': self.role.parent_name,
'child_name': self.role.child_name,
'parent_type': self.role.parent_type.value,
'child_type': self.role.child_type.value,
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
data = response.json()
self.assertEqual(data, {
'corpus': ['Role already exists in this corpus'],
'id': str(self.corpus.id)
})
def test_create_role_not_verified(self):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': EntityType.Organization.value,
'child_type': EntityType.Location.value
}
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
data = response.json()
self.assertEqual(data, {
'corpus': ['You do not have write access to this corpus'],
'id': [str(self.corpus.id)]
})
def test_create_entity(self):
data = {
'name': 'entity',
'type': EntityType.Person.value,
'corpus': str(self.corpus.id),
'metas': {
'key': 'value',
'other key': 'other value'
}
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
entity = Entity.objects.get(id=response.json()['id'])
self.assertEqual(entity.name, 'entity')
def test_create_entity_requires_login(self):
data = {
'name': 'entity',
'type': EntityType.Person.value,
'corpus': str(self.corpus.id),
'metas': {
'key': 'value',
'other key': 'other value'
}
}
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_link(self):
child = Entity.objects.create(type=EntityType.Location, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-link-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
link = EntityLink.objects.get(id=response.json()['id'])
self.assertEqual(link.parent.id, self.entity.id)
self.assertEqual(link.child.id, child.id)
self.assertEqual(link.role.id, self.role.id)
def test_create_link_requires_login(self):
child = Entity.objects.create(type=EntityType.Location, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_link_error(self):
child = Entity.objects.create(type=EntityType.Person, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-link-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_transcription_entity(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
saved = TranscriptionEntity.objects.filter(transcription=self.transcription)
self.assertEqual(saved.count(), 1)
self.assertEqual(self.entity, saved.first().entity)
def test_create_transcription_entity_requires_login(self):
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_transcription_entity_wrong_acl(self):
self.client.force_login(self.user)
self.page.corpus = self.private_corpus
self.page.save()
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(
response.json(),
{'transcription': ['invalid UUID or Corpus write-access is forbidden']}
)
def test_create_transcription_entity_different_corpus(self):
self.client.force_login(self.user)
ent = Entity.objects.create(type=EntityType.Person, corpus=self.private_corpus, name="a private entity")
self.tr_entities_sample.update({'entity': ent.id})
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(
response.json(),
{'__all__': ['Transcription and Entity are not in the same corpus']}
)
def test_create_transcription_entity_exists(self):
self.client.force_login(self.user)
TranscriptionEntity.objects.create(
transcription=self.transcription,
entity=self.entity,
offset=4,
length=len(self.entity.name)
)
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_transcription_entity_key_missing(self):
self.client.force_login(self.user)
data = self.tr_entities_sample
del data['length']
response = self.client.post(
reverse('api:transcription-entities-create', kwargs={'pk': str(self.transcription.id)}),
data=data,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
from django.urls import reverse
from rest_framework import status
from arkindex_common.enums import MetaType
from arkindex.documents.models import Element, ElementType, TranscriptionType, DataSource, \
Corpus, Entity, EntityType, EntityRole, EntityLink, MetaData, TranscriptionEntity
from arkindex.project.tests import FixtureAPITestCase
class TestElementsAPI(FixtureAPITestCase):
@classmethod
def setUpTestData(cls):
super().setUpTestData()
cls.page = Element.objects.filter(type=ElementType.Page, corpus=cls.corpus).first().page
cls.private_corpus = Corpus.objects.create(name='private', public=False)
cls.entity = Entity.objects.create(type=EntityType.Person, corpus=cls.corpus, name="an entity")
cls.role = EntityRole.objects.create(
parent_name="parent",
child_name="child",
parent_type=EntityType.Person,
child_type=EntityType.Location,
corpus=cls.corpus
)
cls.transcription = cls.page.transcriptions.create(
text='Some transcribed text',
source_id=DataSource.objects.get(slug='test').id,
type=TranscriptionType.Line
)
def setUp(self):
super().setUp()
self.tr_entities_sample = {
'entity': str(self.entity.id),
'offset': 4,
'length': len(self.entity.name)
}
def test_get_entity(self):
response = self.client.get(reverse('api:entity-details', kwargs={'pk': str(self.entity.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data['id'], str(self.entity.id))
self.assertEqual(data['type'], 'person')
self.assertEqual(data['corpus']['id'], str(self.corpus.id))
self.assertEqual(data['name'], 'an entity')
def test_get_entity_elements(self):
element = Element.objects.create(corpus=self.corpus, type=ElementType.Act, name="an element")
MetaData.objects.create(
name='test 1',
type=MetaType.Entity,
value='Blah',
element=element,
entity=self.entity,
)
response = self.client.get(reverse('api:entity-elements', kwargs={'pk': str(self.entity.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
results = data['results']
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['id'], str(element.id))
self.assertEqual(results[0]['name'], 'an element')
def test_get_role_in_corpus(self):
response = self.client.get(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
results = data['results']
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['parent_type'], self.role.parent_type.value)
self.assertEqual(results[0]['child_type'], self.role.child_type.value)
self.assertEqual(results[0]['parent_name'], self.role.parent_name)
self.assertEqual(results[0]['child_name'], self.role.child_name)
def test_create_role_in_corpus(self):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': EntityType.Person.value,
'child_type': EntityType.Location.value
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
data = response.json()
self.assertIn('id', data)
role = self.corpus.roles.get(id=data['id'])
self.assertEqual(role.parent_type, EntityType.Person)
self.assertEqual(role.child_type, EntityType.Location)
self.assertEqual(role.parent_name, 'other parent')
self.assertEqual(role.child_name, 'other child')
def test_create_role_already_exist(self):
data = {
'parent_name': self.role.parent_name,
'child_name': self.role.child_name,
'parent_type': self.role.parent_type.value,
'child_type': self.role.child_type.value,
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
data = response.json()
self.assertEqual(data, {
'corpus': ['Role already exists in this corpus'],
'id': str(self.corpus.id)
})
def test_create_role_not_verified(self):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': EntityType.Organization.value,
'child_type': EntityType.Location.value
}
response = self.client.post(reverse('api:corpus-roles', kwargs={'pk': str(self.corpus.id)}), data=data)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
data = response.json()
self.assertEqual(data, {
'corpus': ['You do not have write access to this corpus'],
'id': [str(self.corpus.id)]
})
def test_create_entity(self):
data = {
'name': 'entity',
'type': EntityType.Person.value,
'corpus': str(self.corpus.id),
'metas': {
'key': 'value',
'other key': 'other value'
}
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
entity = Entity.objects.get(id=response.json()['id'])
self.assertEqual(entity.name, 'entity')
def test_create_entity_requires_login(self):
data = {
'name': 'entity',
'type': EntityType.Person.value,
'corpus': str(self.corpus.id),
'metas': {
'key': 'value',
'other key': 'other value'
}
}
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_link(self):
child = Entity.objects.create(type=EntityType.Location, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-link-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
link = EntityLink.objects.get(id=response.json()['id'])
self.assertEqual(link.parent.id, self.entity.id)
self.assertEqual(link.child.id, child.id)
self.assertEqual(link.role.id, self.role.id)
def test_create_link_requires_login(self):
child = Entity.objects.create(type=EntityType.Location, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
response = self.client.post(reverse('api:entity-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_link_error(self):
child = Entity.objects.create(type=EntityType.Person, corpus=self.corpus, name="child")
data = {
'parent': str(self.entity.id),
'child': str(child.id),
'role': str(self.role.id)
}
self.client.force_login(self.user)
response = self.client.post(reverse('api:entity-link-create'), data=data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_transcription_entity(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
saved = TranscriptionEntity.objects.filter(transcription=self.transcription)
self.assertEqual(saved.count(), 1)
self.assertEqual(self.entity, saved.first().entity)
def test_create_transcription_entity_requires_login(self):
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_create_transcription_entity_wrong_acl(self):
self.client.force_login(self.user)
self.page.corpus = self.private_corpus
self.page.save()
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(
response.json(),
{'transcription': ['invalid UUID or Corpus write-access is forbidden']}
)
def test_create_transcription_entity_different_corpus(self):
self.client.force_login(self.user)
ent = Entity.objects.create(type=EntityType.Person, corpus=self.private_corpus, name="a private entity")
self.tr_entities_sample.update({'entity': ent.id})
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertDictEqual(
response.json(),
{'__all__': ['Transcription and Entity are not in the same corpus']}
)
def test_create_transcription_entity_exists(self):
self.client.force_login(self.user)
TranscriptionEntity.objects.create(
transcription=self.transcription,
entity=self.entity,
offset=4,
length=len(self.entity.name)
)
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=self.tr_entities_sample,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_create_transcription_entity_key_missing(self):
self.client.force_login(self.user)
data = self.tr_entities_sample
del data['length']
response = self.client.post(
reverse('api:transcription-entity-create', kwargs={'pk': str(self.transcription.id)}),
data=data,
format='json'
)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_list_transcription_entities_auth_required(self):
response = self.client.get(reverse('api:transcription-entities', kwargs={'pk': str(self.transcription.id)}))
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_list_transcription_entities_wrong_acl(self):
self.transcription.element.corpus = self.private_corpus
self.transcription.element.save()
TranscriptionEntity.objects.create(
transcription=self.transcription,
entity=self.entity,
offset=4,
length=len(self.entity.name)
)
self.client.force_login(self.user)
response = self.client.get(reverse('api:transcription-entities', kwargs={'pk': str(self.transcription.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.json()['count'], 0)
def test_list_transcription_entities(self):
self.client.force_login(self.user)
TranscriptionEntity.objects.create(
transcription=self.transcription,
entity=self.entity,
offset=4,
length=len(self.entity.name)
)
response = self.client.get(reverse('api:transcription-entities', kwargs={'pk': str(self.transcription.id)}))
self.assertEqual(response.status_code, status.HTTP_200_OK)
data = response.json()
self.assertEqual(data['count'], 1)
self.assertListEqual(
data['results'],
[{
'entity': {
'id': str(self.entity.id),
'name': self.entity.name,
'type': self.entity.type.value
},
'length': 9,
'offset': 4
}]
)
......@@ -11,7 +11,7 @@ from arkindex.documents.api.ml import \
ClassificationBulk, TranscriptionCreate, TranscriptionBulk, PageXmlTranscriptionsImport
from arkindex.documents.api.entities import (
CorpusRoles, EntityDetails, EntityCreate, EntityElements, EntityLinkCreate,
TranscriptionEntityCreate
TranscriptionEntityCreate, TranscriptionEntities
)
from arkindex.documents.api.iiif import (
VolumeManifest, ActManifest, PageAnnotationList, PageActAnnotationList, SurfaceAnnotationList,
......@@ -95,12 +95,13 @@ api = [
path('transcription/bulk/', TranscriptionBulk.as_view(), name='transcription-bulk'),
path('classification/bulk/', ClassificationBulk.as_view(), name='classification-bulk'),
# Ingest entities
# Ingest and retrieve entities
path('entity/', EntityCreate.as_view(), name='entity-create'),
path('entity/link/', EntityLinkCreate.as_view(), name='entity-link-create'),
path('entity/<uuid:pk>/', EntityDetails.as_view(), name='entity-details'),
path('entity/<uuid:pk>/elements/', EntityElements.as_view(), name='entity-elements'),
path('transcription/<uuid:pk>/entity/', TranscriptionEntityCreate.as_view(), name='transcription-entities-create'),
path('transcription/<uuid:pk>/entity/', TranscriptionEntityCreate.as_view(), name='transcription-entity-create'),
path('transcription/<uuid:pk>/entities/', TranscriptionEntities.as_view(), name='transcription-entities'),
# Git import workflows
path('imports/repos/', RepositoryList.as_view(), name='repository-list'),
......
......@@ -248,6 +248,12 @@ paths:
description: Link an existing Entity to a given transcription with its position
tags:
- entities
/api/v1/transcription/{id}/entities/:
get:
operationId: ListTranscriptionEntities
description: List existing entities linked to a specific transcription
tags:
- entities
/api/v1/image/:
post:
operationId: CreateImage
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment