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

Fix transcription create endpoint

parent 35ef1111
No related branches found
No related tags found
1 merge request!2183Fix transcription create endpoint
......@@ -54,6 +54,8 @@ class TranscriptionCreate(ACLMixin, CreateAPIView):
def get_object(self):
if not hasattr(self, 'element'):
self.element = super().get_object()
if not self.has_access(self.element.corpus, Role.Contributor.value):
raise PermissionDenied(detail="A write access to the element's corpus is required.")
return self.element
def get_queryset(self):
......@@ -65,8 +67,11 @@ class TranscriptionCreate(ACLMixin, CreateAPIView):
# We retrieve the readable objects then check permissions
# instead of retrieving writable objects directly so as not to
# get 404_NOT_FOUND errors on elements the user has access to.
return Element.objects.using('default').filter(
corpus__in=Corpus.objects.readable(self.request.user)
return (
Element.objects
.using('default')
.filter(corpus__in=Corpus.objects.readable(self.request.user))
.select_related('corpus')
)
def get_serializer_context(self):
......@@ -75,23 +80,10 @@ class TranscriptionCreate(ACLMixin, CreateAPIView):
context['element'] = self.get_object()
return context
def check_object_permissions(self, request, context):
super().check_object_permissions(request, context)
role = Role.Contributor
detail = "A write access to the element's corpus is required."
if not self.has_access(context.corpus, role.value):
raise PermissionDenied(detail=detail)
def perform_create(self, serializer):
return Transcription.objects.create(
element=self.element,
**serializer.validated_data
)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
obj = self.perform_create(serializer)
obj = serializer.save()
headers = self.get_success_headers(serializer.data)
return Response(
# Use a single transcription serializer for the response
......
......@@ -362,6 +362,12 @@ class TranscriptionCreateSerializer(serializers.ModelSerializer):
return data
def create(self, validated_data):
return Transcription.objects.create(
element=self.context['element'],
**validated_data,
)
class SimpleTranscriptionSerializer(serializers.Serializer):
"""
......
......@@ -43,7 +43,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_write_right(self):
self.client.force_login(self.private_read_user)
with self.assertNumQueries(7):
with self.assertNumQueries(6):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.private_page.id}),
format='json',
......@@ -76,7 +76,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_manual(self):
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -104,7 +104,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
"""
self.client.force_login(self.user)
ts = self.line.transcriptions.create(text='GLOUBIBOULGA')
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -123,7 +123,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
Check that a transcription is created with the specified orientation
"""
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -147,7 +147,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
Specifying an invalid text-orientation causes an error
"""
self.client.force_login(self.user)
with self.assertNumQueries(7):
with self.assertNumQueries(6):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -158,7 +158,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
@override_settings(ARKINDEX_FEATURES={'search': False})
def test_no_search(self):
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -168,7 +168,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_worker_version(self):
self.client.force_login(self.user)
with self.assertNumQueries(7):
with self.assertNumQueries(6):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -189,7 +189,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
"""
self.client.force_login(self.user)
with self.assertNumQueries(9):
with self.assertNumQueries(10):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -227,7 +227,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
self.worker_run.process.run()
task = self.worker_run.process.tasks.first()
with self.assertNumQueries(8):
with self.assertNumQueries(9):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -263,7 +263,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
self.worker_run.process.run()
task = self.worker_run.process.tasks.first()
with self.assertNumQueries(8):
with self.assertNumQueries(10):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -297,7 +297,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
"""
self.client.force_login(self.superuser)
with self.assertNumQueries(5):
with self.assertNumQueries(4):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -320,7 +320,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
worker_run = self.user.processes.get(mode=ProcessMode.Local).worker_runs.first()
self.client.force_login(self.superuser)
with self.assertNumQueries(5):
with self.assertNumQueries(4):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -349,7 +349,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
self.worker_run.process.run()
task = self.worker_run.process.tasks.first()
with self.assertNumQueries(7):
with self.assertNumQueries(6):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -368,7 +368,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_worker_run_not_found(self):
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -386,7 +386,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_worker_run_required_confidence(self):
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -402,7 +402,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
def test_worker_version_xor_worker_run(self):
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......@@ -424,7 +424,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
null_zone_page = self.corpus.elements.create(type=self.page.type)
self.client.force_login(self.user)
with self.assertNumQueries(8):
with self.assertNumQueries(7):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': null_zone_page.id}),
format='json',
......@@ -450,7 +450,7 @@ class TestTranscriptionCreate(FixtureAPITestCase):
"""
self.client.force_login(self.user)
with self.assertNumQueries(9):
with self.assertNumQueries(10):
response = self.client.post(
reverse('api:transcription-create', kwargs={'pk': self.line.id}),
format='json',
......
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