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

Fix transcriptionentity create validation

parent 44468856
No related branches found
No related tags found
No related merge requests found
......@@ -8,7 +8,8 @@ from arkindex.documents.serializers.entities import (
TranscriptionEntitySerializer, TranscriptionEntityDetailsSerializer
)
from arkindex.documents.serializers.elements import ElementSerializer
from rest_framework.exceptions import ValidationError
from rest_framework import serializers
from django.core.exceptions import ValidationError
from arkindex.project.permissions import IsVerified
......@@ -32,7 +33,7 @@ class CorpusRoles(CorpusACLMixin, ListCreateAPIView):
child_type=data['child_type'],
corpus_id=self.request.parser_context['kwargs']['pk']
).exists():
raise ValidationError({
raise serializers.ValidationError({
'corpus': ['Role already exists in this corpus'],
'id': self.request.parser_context['kwargs']['pk']
})
......@@ -101,14 +102,27 @@ class TranscriptionEntityCreate(CreateAPIView):
def get_serializer_context(self):
context = super().get_serializer_context()
if not self.kwargs.get('pk'):
# Do not raise in order to build openapi doc
if not self.request:
# OpenAPI cannot pass request context
return context
tr = Transcription.objects.filter(id=self.kwargs['pk']).first()
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']})
tr = Transcription.objects.filter(
id=self.kwargs.get('pk'),
element__corpus__in=Corpus.objects.writable(self.request.user)
).first()
return {**context, 'transcription': tr}
def perform_create(self, serializer):
data = serializer.validated_data
if TranscriptionEntity.objects.filter(**data).exists():
raise serializers.ValidationError({
'__all__': ['Entity is already linked to this transcription at this position']
})
try:
TranscriptionEntity(**data).full_clean()
except ValidationError as e:
raise serializers.ValidationError(serializers.as_serializer_error(e))
super().perform_create(serializer)
class TranscriptionEntities(ListAPIView):
"""
......
from rest_framework import serializers
from django.core.exceptions import ValidationError as DjangoValidationError
from arkindex.documents.models import \
Corpus, Entity, EntityLink, EntityRole, TranscriptionEntity
from arkindex_common.enums import EntityType
......@@ -143,11 +142,10 @@ class TranscriptionEntitySerializer(serializers.ModelSerializer):
def validate(self, data):
data = super().validate(data)
data['transcription'] = self.context['transcription']
try:
# Assert link is not already present in database and check clean constraints
TranscriptionEntity(**data).full_clean()
except DjangoValidationError as e:
raise serializers.ValidationError(serializers.as_serializer_error(e))
if not data['transcription']:
raise serializers.ValidationError({
'transcription': ['invalid UUID or Corpus write-access is forbidden']
})
return data
......
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