Skip to content
Snippets Groups Projects
Commit 652799d8 authored by Manon Blanco's avatar Manon Blanco Committed by Bastien Abadie
Browse files

Exclude manual results from deletion

parent d2d6c3f3
No related branches found
No related tags found
No related merge requests found
......@@ -114,8 +114,17 @@ class MLResultsConsumer(SyncConsumer):
if element_id:
logger.info('Deleting ML results on element {}'.format(element_id))
# This element and its direct children
elements = Element.objects.filter(Q(id=element_id) | Q(paths__path__last=element_id))
element = Element.objects.get(id=element_id)
if element.type.folder:
# The folder AND its children
elements = Element.objects.filter(id=element_id).values('id').union(
# Disable ordering here because we do not need it and it adds an extra column,
# causing the UNION to fail
Element.objects.get_descending(element_id).order_by().values('id')
)
else:
elements = [element]
if not corpus_id:
# The corpus ID is still used in some deletions; deduce it from the element.
corpus_id = Element.objects.get(id=element_id).corpus_id
......@@ -124,8 +133,8 @@ class MLResultsConsumer(SyncConsumer):
elements = Element.objects.filter(corpus_id=corpus_id)
# Simple deletions for classifications and transcriptions.
_delete_queryset(Classification.objects.filter(element__in=elements), batch_size)
_delete_queryset(Transcription.objects.filter(element__in=elements), batch_size)
_delete_queryset(Classification.objects.filter(element__in=elements).exclude(source__slug='manual'), batch_size)
_delete_queryset(Transcription.objects.filter(element__in=elements).exclude(source__slug='manual'), batch_size)
# Entity deletion is complex: they can be linked to different elements both on transcriptions and metadata.
# Metadata are not considered ML results so we need to keep them: update them to unlink entities.
......
from unittest.mock import patch
from mock import AsyncMock
from django.db.models import Q
from django.test import override_settings
from arkindex_common.enums import TranscriptionType, MetaType, EntityType
from arkindex.project.tests import FixtureTestCase
......@@ -130,13 +129,17 @@ class TestMLResultsConsumer(FixtureTestCase):
self.assertFalse(get_layer_mock().send.called)
@patch('arkindex.project.triggers.get_channel_layer')
def test_delete_element(self, get_layer_mock):
def test_delete_folder(self, get_layer_mock):
get_layer_mock.return_value.send = AsyncMock()
folder1_querysets = self._get_querysets(
Element.objects.filter(Q(id=self.folder1.id) | Q(paths__path__last=self.folder1.id))
Element.objects.filter(id=self.folder1.id).values('id').union(
Element.objects.get_descending(self.folder1.id).order_by().values('id')
)
)
folder2_querysets = self._get_querysets(
Element.objects.filter(Q(id=self.folder2.id) | Q(paths__path__last=self.folder2.id))
Element.objects.filter(id=self.folder2.id).values('id').union(
Element.objects.get_descending(self.folder2.id).order_by().values('id')
)
)
for queryset in folder1_querysets:
......@@ -144,7 +147,7 @@ class TestMLResultsConsumer(FixtureTestCase):
for queryset in folder2_querysets:
self.assertTrue(queryset.exists())
with self.assertNumQueries(14):
with self.assertNumQueries(16):
MLResultsConsumer({}).ml_results_delete({'element_id': str(self.folder1.id)})
for queryset in folder1_querysets:
......@@ -172,6 +175,51 @@ class TestMLResultsConsumer(FixtureTestCase):
'drop': False,
})
@patch('arkindex.project.triggers.get_channel_layer')
def test_delete_page(self, get_layer_mock):
get_layer_mock.return_value.send = AsyncMock()
page1_querysets = self._get_querysets(
Element.objects.filter(id=self.page1.id).values('id')
)
folder2_querysets = self._get_querysets(
Element.objects.filter(id=self.folder2.id).values('id').union(
Element.objects.get_descending(self.folder2.id).order_by().values('id')
)
)
for queryset in page1_querysets:
self.assertTrue(queryset.exists())
for queryset in folder2_querysets:
self.assertTrue(queryset.exists())
with self.assertNumQueries(16):
MLResultsConsumer({}).ml_results_delete({'element_id': str(self.page1.id)})
for queryset in page1_querysets:
self.assertFalse(queryset.exists())
for queryset in folder2_querysets: # This folder should not change
self.assertTrue(queryset.exists())
self.assertEqual(self.page1.metadatas.count(), 2)
self.assertEqual(self.page2.metadatas.count(), 2)
metadata = self.page1.metadatas.get(value='Some entity 1')
self.assertEqual(metadata.type, MetaType.Text)
self.assertIsNone(metadata.entity)
metadata = self.page2.metadatas.get(value='Some entity 2')
self.assertEqual(metadata.type, MetaType.Text)
self.assertIsNotNone(metadata.entity)
get_layer_mock().send.assert_called_once_with('reindex', {
'type': 'reindex.start',
'element': str(self.page1.id),
'corpus': str(self.corpus.id),
'entity': None,
'transcriptions': True,
'elements': True,
'entities': True,
'drop': False,
})
@override_settings(ARKINDEX_FEATURES={'search': False})
@patch('arkindex.project.triggers.get_channel_layer')
def test_delete_element_no_search(self, get_layer_mock):
......
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