From 5210fdc9d83576bf0d544dd79d2d62d07dbae806 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 22 Aug 2018 00:36:19 -0400 Subject: [PATCH] The index rebuild permission can now be set as part of the index ACL for each individual index. Add cascade permission check to the index rebuild tool link. The index rebuild tool now responds with the number of indexes queued to rebuild instead of a static acknowledment. Signed-off-by: Roberto Rosario --- HISTORY.rst | 5 +++++ mayan/apps/document_indexing/apps.py | 4 +++- mayan/apps/document_indexing/forms.py | 13 ++++++++++++- mayan/apps/document_indexing/links.py | 6 ++++-- mayan/apps/document_indexing/views.py | 20 +++++++++++++++++--- 5 files changed, 41 insertions(+), 7 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 4e3672ede2..2b4b5e20ca 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -64,6 +64,11 @@ - Apply link permission cascade checks to the message of the day, indexing and parsing, setup link. - Add ACL support to the message of the day app. +- The index rebuild permission can now be set as part of the index + ACL for each individual index. +- Add cascade permission check to the index rebuild tool link. +- The index rebuild tool now responds with the number of indexes + queued to rebuild instead of a static acknowledment. 3.0.1 (2018-07-08) ================= diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index b28324c260..aa46933e6f 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -34,7 +34,8 @@ from .links import ( from .licenses import * # NOQA from .permissions import ( permission_document_indexing_create, permission_document_indexing_delete, - permission_document_indexing_edit, permission_document_indexing_view + permission_document_indexing_edit, permission_document_indexing_rebuild, + permission_document_indexing_view ) from .queues import * # NOQA from .widgets import get_instance_link, index_instance_item_link, node_level @@ -72,6 +73,7 @@ class DocumentIndexingApp(MayanAppConfig): permission_document_indexing_create, permission_document_indexing_delete, permission_document_indexing_edit, + permission_document_indexing_rebuild, permission_document_indexing_view, ) ) diff --git a/mayan/apps/document_indexing/forms.py b/mayan/apps/document_indexing/forms.py index c44915b2f0..4131f91ccf 100644 --- a/mayan/apps/document_indexing/forms.py +++ b/mayan/apps/document_indexing/forms.py @@ -4,19 +4,30 @@ from django import forms from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from acls.models import AccessControlList from common.classes import ModelAttribute from documents.models import Document from .models import Index, IndexTemplateNode +from .permissions import permission_document_indexing_rebuild class IndexListForm(forms.Form): indexes = forms.ModelMultipleChoiceField( help_text=_('Indexes to be queued for rebuilding.'), - label=_('Indexes'), queryset=Index.objects.filter(enabled=True), + label=_('Indexes'), queryset=Index.objects.none(), required=False, widget=forms.widgets.CheckboxSelectMultiple() ) + def __init__(self, *args, **kwargs): + user = kwargs.pop('user') + super(IndexListForm, self).__init__(*args, **kwargs) + queryset = AccessControlList.objects.filter_by_access( + permission=permission_document_indexing_rebuild, user=user, + queryset=Index.objects.filter(enabled=True) + ) + self.fields['indexes'].queryset = queryset + class IndexTemplateNodeForm(forms.ModelForm): """ diff --git a/mayan/apps/document_indexing/links.py b/mayan/apps/document_indexing/links.py index fb6b2b63e0..ab25d3495d 100644 --- a/mayan/apps/document_indexing/links.py +++ b/mayan/apps/document_indexing/links.py @@ -62,11 +62,13 @@ link_index_setup_document_types = Link( view='indexing:index_setup_document_types', ) link_rebuild_index_instances = Link( - icon_class=icon_rebuild_index_instances, + condition=get_cascade_condition( + app_label='document_indexing', model_name='Index', + object_permission=permission_document_indexing_rebuild, + ), icon_class=icon_rebuild_index_instances, description=_( 'Deletes and creates from scratch all the document indexes.' ), - permissions=(permission_document_indexing_rebuild,), text=_('Rebuild indexes'), view='indexing:rebuild_index_instances' ) link_template_node_create = Link( diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index 5fea40b7b9..dd12026a2a 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.shortcuts import get_object_or_404 from django.urls import reverse, reverse_lazy from django.utils.html import mark_safe -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _, ungettext from acls.models import AccessControlList from common.views import ( @@ -329,17 +329,31 @@ class RebuildIndexesView(FormView): 'title': _('Rebuild indexes'), } form_class = IndexListForm - view_permission = permission_document_indexing_rebuild def form_valid(self, form): + count = 0 for index in form.cleaned_data['indexes']: task_rebuild_index.apply_async( kwargs=dict(index_id=index.pk) ) + count += 1 - messages.success(self.request, _('Index rebuild queued successfully.')) + messages.success( + self.request, ungettext( + singular='%(count)d index queued for rebuild.', + plural='%(count)d indexes queued for rebuild.', + number=count + ) % { + 'count': count, + } + ) return super(RebuildIndexesView, self).form_valid(form=form) + def get_form_extra_kwargs(self): + return { + 'user': self.request.user + } + def get_post_action_redirect(self): return reverse('common:tools_list')