diff --git a/HISTORY.rst b/HISTORY.rst index 1437b9facc..67dd94f896 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,14 +7,14 @@ single page navigation to jump to the home view. * Remove redundant Celery queue declarations from the file_metadata app. -* Add internal_name field to workflow serializer. +* Add internal_name field to workflow serializer. Fixes workflow API creation view. * Fix document cabinet list API view. Thanks for forum user "jere" for the report. Forum topic 1039. * Fix document template column field. GitLab issue #655. Thanks to Christian Wiegand (@christianwgd) for the report. -* Increase mailing profile password field max length +* Increase mailing profile password field max length from 48 to 128 characters. GitLab issue #657. Thanks to sigsec (@sigsec) for the report. * Update the Docker entrypoint to update the ownership diff --git a/docs/releases/3.2.7.rst b/docs/releases/3.2.7.rst index a70ac831b9..7dadb0c199 100644 --- a/docs/releases/3.2.7.rst +++ b/docs/releases/3.2.7.rst @@ -34,6 +34,7 @@ Changes for the report. - Rename the MAYAN_USER_GUID environment variable to MAYAN_USER_GID. +- Backport individual index rebuild support. Removals -------- diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 670f3187a6..c28f567daf 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -31,9 +31,10 @@ from .html_widgets import ( ) from .links import ( link_document_index_instance_list, link_document_type_index_templates, - link_index_instance_menu, 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_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 @@ -192,6 +193,7 @@ class DocumentIndexingApp(MayanAppConfig): menu_object.bind_links( links=( link_index_template_delete, link_index_template_edit, + link_index_instance_rebuild ), sources=(Index,) ) menu_object.bind_links( diff --git a/mayan/apps/document_indexing/links.py b/mayan/apps/document_indexing/links.py index fc1f832023..a9441e3e9c 100644 --- a/mayan/apps/document_indexing/links.py +++ b/mayan/apps/document_indexing/links.py @@ -49,6 +49,12 @@ 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_template_setup = Link( condition=get_cascade_condition( diff --git a/mayan/apps/document_indexing/tests/mixins.py b/mayan/apps/document_indexing/tests/mixins.py index a13b2fa2f4..339982fea7 100644 --- a/mayan/apps/document_indexing/tests/mixins.py +++ b/mayan/apps/document_indexing/tests/mixins.py @@ -50,3 +50,10 @@ class IndexViewTestMixin(object): 'label': TEST_INDEX_LABEL_EDITED, 'slug': TEST_INDEX_SLUG } ) + + def _request_test_index_rebuild_view(self): + return self.post( + viewname='indexing:index_setup_rebuild', kwargs={ + 'pk': self.test_index.pk + } + ) diff --git a/mayan/apps/document_indexing/tests/test_views.py b/mayan/apps/document_indexing/tests/test_views.py index 8ce8230d83..c7e163d76c 100644 --- a/mayan/apps/document_indexing/tests/test_views.py +++ b/mayan/apps/document_indexing/tests/test_views.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals from mayan.apps.documents.tests import GenericDocumentViewTestCase -from ..models import Index +from ..models import Index, IndexInstanceNode from ..permissions import ( permission_document_indexing_create, permission_document_indexing_delete, permission_document_indexing_edit, @@ -10,7 +10,10 @@ from ..permissions import ( permission_document_indexing_rebuild ) -from .literals import TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED +from .literals import ( + TEST_INDEX_LABEL, TEST_INDEX_LABEL_EDITED, + TEST_INDEX_TEMPLATE_DOCUMENT_LABEL_EXPRESSION +) from .mixins import IndexTestMixin, IndexViewTestMixin @@ -77,9 +80,42 @@ class IndexViewTestCase( self.assertEqual(self.test_index.label, TEST_INDEX_LABEL_EDITED) -class IndexInstanceViewTestCase( +class IndexInstaceViewTestCase( IndexTestMixin, IndexViewTestMixin, GenericDocumentViewTestCase ): + 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 test_index_rebuild_view_no_permission(self): + self.upload_document() + self._create_test_index() + self._create_index_template_node() + + response = self._request_test_index_rebuild_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(IndexInstanceNode.objects.count(), 0) + + def test_index_rebuild_view_with_access(self): + self.upload_document() + self._create_test_index() + self._create_index_template_node() + + self.grant_access( + obj=self.test_index, + permission=permission_document_indexing_rebuild + ) + + response = self._request_test_index_rebuild_view() + self.assertEqual(response.status_code, 302) + + self.assertNotEqual(IndexInstanceNode.objects.count(), 0) + def _request_index_instance_node_view(self, index_instance_node): return self.get( viewname='indexing:index_instance_node_view', kwargs={ @@ -108,9 +144,13 @@ class IndexInstanceViewTestCase( ) self.assertContains(response, text=TEST_INDEX_LABEL, status_code=200) + +class IndexToolsViewTestCase( + IndexTestMixin, IndexViewTestMixin, GenericDocumentViewTestCase +): def _request_indexes_rebuild_get_view(self): return self.get( - viewname='indexing:rebuild_index_instances', + viewname='indexing:rebuild_index_instances' ) def _request_indexes_rebuild_post_view(self): diff --git a/mayan/apps/document_indexing/urls.py b/mayan/apps/document_indexing/urls.py index 380e1d7fdc..d34650c1b5 100644 --- a/mayan/apps/document_indexing/urls.py +++ b/mayan/apps/document_indexing/urls.py @@ -11,8 +11,8 @@ from .views import ( DocumentIndexNodeListView, DocumentTypeIndexesView, IndexInstanceNodeView, IndexListView, IndexesRebuildView, SetupIndexDocumentTypesView, SetupIndexCreateView, SetupIndexDeleteView, SetupIndexEditView, - SetupIndexListView, SetupIndexTreeTemplateListView, TemplateNodeCreateView, - TemplateNodeDeleteView, TemplateNodeEditView + SetupIndexListView, SetupIndexRebuildView, SetupIndexTreeTemplateListView, + TemplateNodeCreateView, TemplateNodeDeleteView, TemplateNodeEditView ) urlpatterns = [ @@ -46,6 +46,10 @@ urlpatterns = [ view=SetupIndexDocumentTypesView.as_view(), name='index_setup_document_types' ), + url( + regex=r'^setup/index/(?P\d+)/rebuild/$', + view=SetupIndexRebuildView.as_view(), name='index_setup_rebuild' + ), url( regex=r'^setup/template/node/(?P\d+)/create/child/$', view=TemplateNodeCreateView.as_view(), name='template_node_create' diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 5972da6870..f57a72ebdd 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -9,8 +9,8 @@ from django.utils.translation import ugettext_lazy as _, ungettext from mayan.apps.acls.models import AccessControlList from mayan.apps.common.generics import ( - AddRemoveView, FormView, SingleObjectCreateView, SingleObjectDeleteView, - SingleObjectEditView, SingleObjectListView + AddRemoveView, ConfirmView, FormView, SingleObjectCreateView, + SingleObjectDeleteView, SingleObjectEditView, SingleObjectListView ) from mayan.apps.documents.events import event_document_type_edited from mayan.apps.documents.models import Document, DocumentType @@ -32,7 +32,7 @@ from .permissions import ( permission_document_indexing_create, permission_document_indexing_delete, permission_document_indexing_edit, permission_document_indexing_instance_view, - permission_document_indexing_view + permission_document_indexing_rebuild, permission_document_indexing_view ) from .tasks import task_rebuild_index @@ -150,6 +150,36 @@ class SetupIndexListView(SingleObjectListView): } +class SetupIndexRebuildView(ConfirmView): + post_action_redirect = reverse_lazy( + viewname='indexing:index_setup_list' + ) + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'title': _('Rebuild index: %s') % self.get_object() + } + + def get_object(self): + return get_object_or_404(klass=self.get_queryset(), pk=self.kwargs['pk']) + + def get_queryset(self): + return AccessControlList.objects.restrict_queryset( + permission=permission_document_indexing_rebuild, + queryset=Index.objects.all(), user=self.request.user + ) + + def view_action(self): + task_rebuild_index.apply_async( + kwargs=dict(index_id=self.get_object().pk) + ) + + messages.success( + message='Index queued for rebuild.', request=self.request + ) + + class SetupIndexDocumentTypesView(AddRemoveView): main_object_method_add = 'document_types_add' main_object_method_remove = 'document_types_remove'