Indexing: Add document base property reindex

Add support for reindexing documents when their base properties like
the label and description are edited.

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2018-10-31 16:54:19 -04:00
parent 9fc7c4fc09
commit e109068b29
9 changed files with 179 additions and 106 deletions

View File

@@ -5,11 +5,17 @@ from django.utils.encoding import force_text
from common.tests import BaseTestCase
from documents.tests import DocumentTestMixin, TEST_SMALL_DOCUMENT_PATH
from documents.tests.literals import (
TEST_DOCUMENT_DESCRIPTION, TEST_DOCUMENT_DESCRIPTION_EDITED,
TEST_DOCUMENT_LABEL_EDITED
)
from metadata.models import MetadataType, DocumentTypeMetadataType
from ..models import Index, IndexInstanceNode, IndexTemplateNode
from .literals import (
TEST_INDEX_TEMPLATE_DOCUMENT_DESCRIPTION_EXPRESSION,
TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION,
TEST_INDEX_TEMPLATE_METADATA_EXPRESSION, TEST_METADATA_TYPE_LABEL,
TEST_METADATA_TYPE_NAME
)
@@ -18,7 +24,121 @@ from .mixins import DocumentIndexingTestMixin
@override_settings(OCR_AUTO_OCR=False)
class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
def test_indexing(self):
def test_document_description_index(self):
self._create_index()
self.index.node_templates.create(
parent=self.index.template_root,
expression=TEST_INDEX_TEMPLATE_DOCUMENT_DESCRIPTION_EXPRESSION,
link_documents=True
)
self.document.description = TEST_DOCUMENT_DESCRIPTION
self.document.save()
self.index.rebuild()
self.assertEqual(
IndexInstanceNode.objects.last().value, self.document.description
)
self.document.description = TEST_DOCUMENT_DESCRIPTION_EDITED
self.document.save()
self.assertEqual(
IndexInstanceNode.objects.last().value, self.document.description
)
def test_document_label_index(self):
self._create_index()
self.index.node_templates.create(
parent=self.index.template_root,
expression=TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION,
link_documents=True
)
self.index.rebuild()
self.assertEqual(
IndexInstanceNode.objects.last().value, self.document.label
)
self.document.label = TEST_DOCUMENT_LABEL_EDITED
self.document.save()
self.assertEqual(
IndexInstanceNode.objects.last().value, self.document.label
)
def test_date_based_index(self):
self._create_index()
level_year = self.index.node_templates.create(
parent=self.index.template_root,
expression='{{ document.date_added|date:"Y" }}',
link_documents=False
)
self.index.node_templates.create(
parent=level_year,
expression='{{ document.date_added|date:"m" }}',
link_documents=True
)
# Index the document created by default
Index.objects.rebuild()
self.document.delete()
# Uploading a new should not trigger an error
document = self.upload_document()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[
'', force_text(document.date_added.year),
force_text(document.date_added.month).zfill(2)
]
)
self.assertTrue(
document in list(IndexInstanceNode.objects.order_by('pk').last().documents.all())
)
def test_dual_level_dual_document_index(self):
"""
Test creation of an index instance with two first levels with different
values and two second levels with the same value but as separate
children of each of the first levels. GitLab issue #391
"""
with open(TEST_SMALL_DOCUMENT_PATH, mode='rb') as file_object:
self.document_2 = self.document_type.new_document(
file_object=file_object
)
self._create_index()
# Create simple index template
root = self.index.template_root
level_1 = self.index.node_templates.create(
parent=root, expression='{{ document.uuid }}',
link_documents=False
)
self.index.node_templates.create(
parent=level_1, expression='{{ document.label }}',
link_documents=True
)
Index.objects.rebuild()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[
'', force_text(self.document_2.uuid), self.document_2.label,
force_text(self.document.uuid), self.document.label
]
)
def test_metadata_indexing(self):
metadata_type = MetadataType.objects.create(
name=TEST_METADATA_TYPE_NAME, label=TEST_METADATA_TYPE_LABEL
)
@@ -106,6 +226,26 @@ class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
), ['']
)
def test_multi_level_template_with_no_result_parent(self):
"""
On a two level template if the first level doesn't return a result
the indexing should stop. GitLab issue #391.
"""
self._create_index()
level_1 = self.index.node_templates.create(
parent=self.index.template_root,
expression='',
link_documents=True
)
self.index.node_templates.create(
parent=level_1, expression='{{ document.label }}',
link_documents=True
)
Index.objects.rebuild()
def test_rebuild_all_indexes(self):
# Add metadata type and connect to document type
metadata_type = MetadataType.objects.create(name='test', label='test')
@@ -143,92 +283,3 @@ class IndexTestCase(DocumentIndexingTestMixin, DocumentTestMixin, BaseTestCase):
self.assertQuerysetEqual(
instance_node.documents.all(), [repr(self.document)]
)
def test_dual_level_dual_document_index(self):
"""
Test creation of an index instance with two first levels with different
values and two second levels with the same value but as separate
children of each of the first levels. GitLab issue #391
"""
with open(TEST_SMALL_DOCUMENT_PATH, 'rb') as file_object:
self.document_2 = self.document_type.new_document(
file_object=file_object
)
self._create_index()
# Create simple index template
root = self.index.template_root
level_1 = self.index.node_templates.create(
parent=root, expression='{{ document.uuid }}',
link_documents=False
)
self.index.node_templates.create(
parent=level_1, expression='{{ document.label }}',
link_documents=True
)
Index.objects.rebuild()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[
'', force_text(self.document_2.uuid), self.document_2.label,
force_text(self.document.uuid), self.document.label
]
)
def test_multi_level_template_with_no_result_parent(self):
"""
On a two level template if the first level doesn't return a result
the indexing should stop. GitLab issue #391.
"""
self._create_index()
level_1 = self.index.node_templates.create(
parent=self.index.template_root,
expression='',
link_documents=True
)
self.index.node_templates.create(
parent=level_1, expression='{{ document.label }}',
link_documents=True
)
Index.objects.rebuild()
def test_date_based_index(self):
self._create_index()
level_year = self.index.node_templates.create(
parent=self.index.template_root,
expression='{{ document.date_added|date:"Y" }}',
link_documents=False
)
self.index.node_templates.create(
parent=level_year,
expression='{{ document.date_added|date:"m" }}',
link_documents=True
)
# Index the document created by default
Index.objects.rebuild()
self.document.delete()
# Uploading a new should not trigger an error
document = self.upload_document()
self.assertEqual(
[instance.value for instance in IndexInstanceNode.objects.all().order_by('pk')],
[
'', force_text(document.date_added.year),
force_text(document.date_added.month).zfill(2)
]
)
self.assertTrue(
document in list(IndexInstanceNode.objects.order_by('pk').last().documents.all())
)