Add document index reset
Signed-off-by: Roberto Rosario <roberto.rosario@mayan-edms.com>
This commit is contained in:
@@ -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)
|
||||
===================
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user