Skip to content
Snippets Groups Projects
Commit 68c4d2b6 authored by Erwan Rouchet's avatar Erwan Rouchet
Browse files

Merge branch 'fix-transcriptionentity-create-validation' into 'master'

Fix transcriptionentity create validation

See merge request !350
parents 44468856 8b01b3dc
No related branches found
No related tags found
1 merge request!350Fix transcriptionentity create validation
......@@ -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