From 5a0f54864e3dac9b827102dd59701fc039ae4316 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Sat, 23 Nov 2019 02:38:04 -0400 Subject: [PATCH] Add document index reset Signed-off-by: Roberto Rosario --- HISTORY.rst | 1 + mayan/apps/document_indexing/apps.py | 16 +++-- mayan/apps/document_indexing/icons.py | 7 +- mayan/apps/document_indexing/links.py | 21 ++++-- mayan/apps/document_indexing/tests/mixins.py | 10 ++- .../document_indexing/tests/test_views.py | 68 +++++++++++++++---- mayan/apps/document_indexing/urls.py | 13 ++-- mayan/apps/document_indexing/views.py | 36 ++++++++++ 8 files changed, 141 insertions(+), 31 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 3fa582de1b..c845b3a87f 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -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) =================== diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 71e0bf5b65..93e0375b50 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -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', diff --git a/mayan/apps/document_indexing/icons.py b/mayan/apps/document_indexing/icons.py index 581e31d5e6..98a4491696 100644 --- a/mayan/apps/document_indexing/icons.py +++ b/mayan/apps/document_indexing/icons.py @@ -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( diff --git a/mayan/apps/document_indexing/links.py b/mayan/apps/document_indexing/links.py index 6573b0a0dd..c7b50107c4 100644 --- a/mayan/apps/document_indexing/links.py +++ b/mayan/apps/document_indexing/links.py @@ -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( diff --git a/mayan/apps/document_indexing/tests/mixins.py b/mayan/apps/document_indexing/tests/mixins.py index 12e1e28c1a..e4b720d26a 100644 --- a/mayan/apps/document_indexing/tests/mixins.py +++ b/mayan/apps/document_indexing/tests/mixins.py @@ -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): diff --git a/mayan/apps/document_indexing/tests/test_views.py b/mayan/apps/document_indexing/tests/test_views.py index 10cc7000d2..7fd815e163 100644 --- a/mayan/apps/document_indexing/tests/test_views.py +++ b/mayan/apps/document_indexing/tests/test_views.py @@ -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 + ) diff --git a/mayan/apps/document_indexing/urls.py b/mayan/apps/document_indexing/urls.py index 0cdefeeb6c..b7a0414e0b 100644 --- a/mayan/apps/document_indexing/urls.py +++ b/mayan/apps/document_indexing/urls.py @@ -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 = [] diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index c6cc7573d3..a7d7ae7c74 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -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')