Skip to content
Snippets Groups Projects
Commit 4187f41c authored by Manon Blanco's avatar Manon Blanco Committed by Erwan Rouchet
Browse files

Create entity and entity link

parent 2e841269
No related branches found
No related tags found
No related merge requests found
......@@ -9,7 +9,7 @@ from arkindex.documents.serializers.light import PageLightSerializer
from arkindex.documents.serializers.elements import (
ElementSerializer, ElementSlimSerializer, CorpusSerializer, PageSerializer,
ActSerializer, SurfaceSerializer, ElementCreateSerializer, EntitySerializer,
EntityRoleSerializer,
EntityCreateSerializer, EntityRoleSerializer, EntityLinkCreateSerializer
)
from arkindex.documents.serializers.ml import TranscriptionSerializer
from arkindex.documents.models import (
......@@ -294,3 +294,19 @@ class EntityElements(ListAPIView):
.distinct() \
.order_by('name', 'type') \
.prefetch_related('metadatas__entity', 'metadatas__dates', 'metadatas__revision', 'corpus')
class EntityCreate(CreateAPIView):
"""
Create a new entity
"""
permission_classes = (IsVerified, )
serializer_class = EntityCreateSerializer
class EntityLinkCreate(CreateAPIView):
"""
Create a new link
"""
permission_classes = (IsVerified, )
serializer_class = EntityLinkCreateSerializer
......@@ -387,3 +387,57 @@ class EntitySerializer(EntityLightSerializer):
'children',
'parents'
)
class EntityCreateSerializer(EntityLightSerializer):
"""
Serialize an entity with a possible parents and children
"""
corpus = serializers.PrimaryKeyRelatedField(queryset=Corpus.objects.none())
metas = serializers.HStoreField(child=serializers.CharField())
children = EntityLinkSerializer(many=True, read_only=True)
parents = EntityLinkSerializer(many=True, read_only=True)
class Meta:
model = Entity
fields = EntityLightSerializer.Meta.fields + ('corpus', 'metas', 'parents', 'children')
read_only_fields = ('id', )
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.context.get('request'):
# Do not raise Error in order to create OpenAPI schema
return
corpora = Corpus.objects.writable(self.context['request'].user)
self.fields['corpus'].queryset = corpora
class EntityLinkCreateSerializer(EntityLinkSerializer):
"""
Serialize an entity with a possible parents and children
"""
parent = serializers.PrimaryKeyRelatedField(queryset=Entity.objects.none())
child = serializers.PrimaryKeyRelatedField(queryset=Entity.objects.none())
role = serializers.PrimaryKeyRelatedField(queryset=Entity.objects.none())
class Meta:
model = EntityLink
fields = EntityLinkSerializer.Meta.fields
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if not self.context.get('request'):
# Do not raise Error in order to create OpenAPI schema
return
corpora = Corpus.objects.writable(self.context['request'].user)
entities = Entity.objects.all().filter(corpus__in=corpora)
roles = EntityRole.objects.all().filter(corpus__in=corpora)
self.fields['parent'].queryset = entities
self.fields['child'].queryset = entities
self.fields['role'].queryset = roles
def validate(self, data):
data = super().validate(data)
link = EntityLink(**data)
link.full_clean()
return data
......@@ -58,7 +58,7 @@ class CorpusLightSerializer(serializers.ModelSerializer):
class EntityLightSerializer(serializers.ModelSerializer):
"""
Serializes entity for any MetaData
Serializes an entity
"""
type = EnumField(EntityType)
......
......@@ -3,7 +3,7 @@ from rest_framework import status
from arkindex_common.enums import MetaType
from arkindex.documents.models import Element, ElementType, DataSource, \
TranscriptionType, Page, Act, Corpus, DateType, Entity, EntityType, \
EntityRole, MetaData
EntityRole, EntityLink, MetaData
from arkindex.images.models import ImageServer
from arkindex.project.tests import FixtureAPITestCase
from arkindex.project.aws import S3FileStatus
......@@ -288,8 +288,8 @@ class TestElementsAPI(FixtureAPITestCase):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': 'person',
'child_type': 'location'
'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)
......@@ -322,8 +322,8 @@ class TestElementsAPI(FixtureAPITestCase):
data = {
'parent_name': 'other parent',
'child_name': 'other child',
'parent_type': 'organization',
'child_type': 'location'
'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)
......@@ -332,3 +332,68 @@ class TestElementsAPI(FixtureAPITestCase):
'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)
......@@ -4,7 +4,8 @@ from django.views.generic.base import RedirectView
from arkindex.documents.api.elements import (
ElementsList, RelatedElementsList, ElementRetrieve, ElementPages, ElementSurfaces,
CorpusList, CorpusRetrieve, CorpusPages, CorpusRoles, ActEdit, PageDetails, SurfaceDetails,
ElementTranscriptions, ElementsCreate, EntityDetails, EntityElements
ElementTranscriptions, ElementsCreate, EntityDetails, EntityCreate, EntityElements,
EntityLinkCreate
)
from arkindex.documents.api.search import PageSearch, ActSearch
from arkindex.documents.api.ml import \
......@@ -47,6 +48,8 @@ api = [
path('corpus/<uuid:pk>/', CorpusRetrieve.as_view(), name='corpus-retrieve'),
path('corpus/<uuid:pk>/pages/', CorpusPages.as_view(), name='corpus-pages'),
path('corpus/<uuid:pk>/roles/', CorpusRoles.as_view(), name='corpus-roles'),
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'),
......
......@@ -191,6 +191,18 @@ paths:
security: []
tags:
- elements
/api/v1/entity/:
post:
operationId: CreateEntity
description: Create a new entity
tags:
- elements
/api/v1/entity/link/:
post:
operationId: CreateEntityLink
description: Create a new link between two entities with a role
tags:
- elements
/api/v1/entity/{id}/:
get:
description: Get all information about entity
......
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