Add document index reset

Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-11-23 02:38:04 -04:00
parent 9576d5ce17
commit 5a0f54864e
8 changed files with 141 additions and 31 deletions

View File

@@ -179,6 +179,7 @@
- Add book link to the documentation.
- Update mayan_statistics migration 0002 to rename
duplicate slugs.
- Add document index reset view.
3.2.11 (2019-XX-XX)
===================

View File

@@ -32,12 +32,12 @@ from .html_widgets import (
from .links import (
link_document_index_instance_list, link_document_type_index_templates,
link_index_instance_menu, link_index_instance_rebuild,
link_index_template_setup, link_index_template_create,
link_index_template_document_types, link_index_template_delete,
link_index_template_edit, link_index_template_list,
link_index_template_node_tree_view, link_index_instances_rebuild,
link_index_template_node_create, link_index_template_node_delete,
link_index_template_node_edit
link_index_instances_reset, link_index_template_setup,
link_index_template_create, link_index_template_document_types,
link_index_template_delete, link_index_template_edit,
link_index_template_list, link_index_template_node_tree_view,
link_index_instances_rebuild, link_index_template_node_create,
link_index_template_node_delete, link_index_template_node_edit
)
from .permissions import (
permission_document_indexing_create, permission_document_indexing_delete,
@@ -220,7 +220,9 @@ class DocumentIndexingApp(MayanAppConfig):
)
)
menu_setup.bind_links(links=(link_index_template_setup,))
menu_tools.bind_links(links=(link_index_instances_rebuild,))
menu_tools.bind_links(
links=(link_index_instances_rebuild, link_index_instances_reset)
)
post_delete.connect(
dispatch_uid='document_indexing_handler_delete_empty',

View File

@@ -16,7 +16,12 @@ icon_index_instance_node_with_documents = Icon(
driver_name='fontawesome', symbol='folder'
)
icon_index_instances_rebuild = Icon(
driver_name='fontawesome', symbol='list-ul'
driver_name='fontawesome-dual', primary_symbol='list-ul',
secondary_symbol='hammer'
)
icon_index_instances_reset = Icon(
driver_name='fontawesome-dual', primary_symbol='list-ul',
secondary_symbol='times'
)
icon_index_template_create = Icon(

View File

@@ -37,6 +37,12 @@ link_index_instance_menu = Link(
), icon_class_path='mayan.apps.document_indexing.icons.icon_index',
text=_('Indexes'), view='indexing:index_list'
)
link_index_instance_rebuild = Link(
args='resolved_object.pk',
icon_class_path='mayan.apps.document_indexing.icons.icon_index_instances_rebuild',
permissions=(permission_document_indexing_rebuild,),
text=_('Rebuild index'), view='indexing:index_setup_rebuild'
)
link_index_instances_rebuild = Link(
condition=get_cascade_condition(
app_label='document_indexing', model_name='Index',
@@ -48,11 +54,16 @@ link_index_instances_rebuild = Link(
),
text=_('Rebuild indexes'), view='indexing:rebuild_index_instances'
)
link_index_instance_rebuild = Link(
args='resolved_object.pk',
icon_class_path='mayan.apps.document_indexing.icons.icon_index_instances_rebuild',
permissions=(permission_document_indexing_rebuild,),
text=_('Rebuild index'), view='indexing:index_setup_rebuild'
link_index_instances_reset = Link(
condition=get_cascade_condition(
app_label='document_indexing', model_name='Index',
object_permission=permission_document_indexing_rebuild,
),
icon_class_path='mayan.apps.document_indexing.icons.icon_index_instances_reset',
description=_(
'Deletes and creates from scratch all the document indexes.'
),
text=_('Reset indexes'), view='indexing:index_instances_reset'
)
link_index_template_setup = Link(

View File

@@ -3,7 +3,8 @@ from __future__ import unicode_literals
from ..models import Index
from .literals import (
TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED, TEST_INDEX_SLUG
TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED, TEST_INDEX_SLUG,
TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION
)
@@ -20,6 +21,13 @@ class IndexTestMixin(object):
if rebuild:
Index.objects.rebuild()
def _create_test_index_template_node(self):
self.test_index.node_templates.create(
parent=self.test_index.template_root,
expression=TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION,
link_documents=True
)
class IndexViewTestMixin(object):
def _request_test_index_create_view(self):

View File

@@ -12,10 +12,7 @@ from ..permissions import (
permission_document_indexing_rebuild
)
from .literals import (
TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED,
TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION
)
from .literals import TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED
from .mixins import IndexTestMixin, IndexViewTestMixin
@@ -81,13 +78,6 @@ class IndexViewTestCase(
class IndexInstaceViewTestMixin(object):
def _create_index_template_node(self):
self.test_index.node_templates.create(
parent=self.test_index.template_root,
expression=TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION,
link_documents=True
)
def _request_test_index_instance_node_view(self, index_instance_node):
return self.get(
viewname='indexing:index_instance_node_view', kwargs={
@@ -103,7 +93,7 @@ class IndexInstaceViewTestCase(
def test_index_rebuild_view_no_permission(self):
self.upload_document()
self._create_test_index()
self._create_index_template_node()
self._create_test_index_template_node()
response = self._request_test_index_rebuild_view()
self.assertEqual(response.status_code, 404)
@@ -113,7 +103,7 @@ class IndexInstaceViewTestCase(
def test_index_rebuild_view_with_access(self):
self.upload_document()
self._create_test_index()
self._create_index_template_node()
self._create_test_index_template_node()
self.grant_access(
obj=self.test_index,
@@ -160,6 +150,18 @@ class IndexToolsViewTestMixin(object):
}
)
def _request_indexes_reset_get_view(self):
return self.get(
viewname='indexing:index_instances_reset'
)
def _request_indexes_reset_post_view(self):
return self.post(
viewname='indexing:index_instances_reset', data={
'index_templates': self.test_index.pk
}
)
class IndexToolsViewTestCase(
IndexTestMixin, IndexViewTestMixin, IndexToolsViewTestMixin,
@@ -199,3 +201,43 @@ class IndexToolsViewTestCase(
# An instance root exists
self.assertTrue(self.test_index.instance_root.pk)
def test_indexes_reset_no_permission(self):
self._create_test_index(rebuild=False)
self._create_test_index_template_node()
self.test_index.rebuild()
response = self._request_indexes_reset_get_view()
self.assertNotContains(
response=response, text=self.test_index.label, status_code=200
)
response = self._request_indexes_reset_post_view()
# No error since we just don't see the index
self.assertEqual(response.status_code, 200)
self.assertEqual(
self.test_index.instance_root.get_children_count(), 1
)
def test_indexes_reset_with_access(self):
self._create_test_index(rebuild=False)
self._create_test_index_template_node()
self.test_index.rebuild()
self.grant_access(
obj=self.test_index,
permission=permission_document_indexing_rebuild
)
response = self._request_indexes_reset_get_view()
self.assertContains(
response=response, text=self.test_index.label, status_code=200
)
response = self._request_indexes_reset_post_view()
self.assertEqual(response.status_code, 302)
self.assertEqual(
self.test_index.instance_root.get_children_count(), 0
)

View File

@@ -9,10 +9,11 @@ from .api_views import (
)
from .views import (
DocumentIndexNodeListView, DocumentTypeIndexesView, IndexInstanceNodeView,
IndexListView, IndexesRebuildView, SetupIndexDocumentTypesView,
SetupIndexCreateView, SetupIndexDeleteView, SetupIndexEditView,
SetupIndexListView, SetupIndexRebuildView, SetupIndexTreeTemplateListView,
TemplateNodeCreateView, TemplateNodeDeleteView, TemplateNodeEditView
IndexListView, IndexesRebuildView, IndexesResetView,
SetupIndexDocumentTypesView, SetupIndexCreateView, SetupIndexDeleteView,
SetupIndexEditView, SetupIndexListView, SetupIndexRebuildView,
SetupIndexTreeTemplateListView, TemplateNodeCreateView,
TemplateNodeDeleteView, TemplateNodeEditView
)
urlpatterns_templates = [
@@ -83,6 +84,10 @@ urlpatterns_tools = [
regex=r'^instances/rebuild/$', view=IndexesRebuildView.as_view(),
name='rebuild_index_instances'
),
url(
regex=r'^instances/reset/$', view=IndexesResetView.as_view(),
name='index_instances_reset'
),
]
urlpatterns = []

View File

@@ -474,3 +474,39 @@ class IndexesRebuildView(FormView):
def get_post_action_redirect(self):
return reverse(viewname='common:tools_list')
class IndexesResetView(FormView):
extra_context = {
'title': _('Reset indexes'),
}
form_class = IndexTemplateFilteredForm
def form_valid(self, form):
count = 0
for index in form.cleaned_data['index_templates']:
index.instance_root.delete()
count += 1
messages.success(
message=ungettext(
singular='%(count)d index reset.',
plural='%(count)d indexes reset.',
number=count
) % {
'count': count,
}, request=self.request
)
return super(IndexesResetView, self).form_valid(form=form)
def get_form_extra_kwargs(self):
return {
'help_text': _(
'Index templates for which their instances will be deleted.'
),
'user': self.request.user
}
def get_post_action_redirect(self):
return reverse(viewname='common:tools_list')