diff --git a/HISTORY.rst b/HISTORY.rst index 359c247b8c..61a13c3007 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -71,6 +71,10 @@ queued to rebuild instead of a static acknowledment. - Add missing permission check to the document duplicate scan link. +- Add new document indexing permission. This permission allows + user to view an index instance as opposed to the current + permission which allows viewing an index definiton on the + setup menu. 3.0.1 (2018-07-08) ================= diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index aa46933e6f..e174d75847 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -34,8 +34,9 @@ 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_rebuild, - permission_document_indexing_view + permission_document_indexing_edit, + permission_document_indexing_instance_view, + permission_document_indexing_rebuild, permission_document_indexing_view ) from .queues import * # NOQA from .widgets import get_instance_link, index_instance_item_link, node_level @@ -73,6 +74,7 @@ class DocumentIndexingApp(MayanAppConfig): permission_document_indexing_create, permission_document_indexing_delete, permission_document_indexing_edit, + permission_document_indexing_instance_view, permission_document_indexing_rebuild, permission_document_indexing_view, ) diff --git a/mayan/apps/document_indexing/links.py b/mayan/apps/document_indexing/links.py index ab25d3495d..00661bca41 100644 --- a/mayan/apps/document_indexing/links.py +++ b/mayan/apps/document_indexing/links.py @@ -9,8 +9,9 @@ from .icons import ( ) from .permissions import ( permission_document_indexing_create, permission_document_indexing_edit, - permission_document_indexing_delete, permission_document_indexing_rebuild, - permission_document_indexing_view + permission_document_indexing_delete, + permission_document_indexing_instance_view, + permission_document_indexing_rebuild,permission_document_indexing_view ) @@ -23,7 +24,10 @@ link_document_index_list = Link( text=_('Indexes'), view='indexing:document_index_list', ) link_index_main_menu = Link( - icon_class=icon_index, text=_('Indexes'), + condition=get_cascade_condition( + app_label='document_indexing', model_name='Index', + object_permission=permission_document_indexing_instance_view, + ), icon_class=icon_index, text=_('Indexes'), view='indexing:index_list' ) link_index_setup = Link( diff --git a/mayan/apps/document_indexing/permissions.py b/mayan/apps/document_indexing/permissions.py index 4fa5ad4253..c29a219e49 100644 --- a/mayan/apps/document_indexing/permissions.py +++ b/mayan/apps/document_indexing/permissions.py @@ -15,6 +15,10 @@ permission_document_indexing_edit = namespace.add_permission( permission_document_indexing_delete = namespace.add_permission( name='document_index_delete', label=_('Delete document indexes') ) +permission_document_indexing_instance_view = namespace.add_permission( + name='document_index_instance_view', + label=_('View document index instances') +) permission_document_indexing_view = namespace.add_permission( name='document_index_view', label=_('View document indexes') ) diff --git a/mayan/apps/document_indexing/tests/test_views.py b/mayan/apps/document_indexing/tests/test_views.py index 2dfbd425a5..6f47248d4c 100644 --- a/mayan/apps/document_indexing/tests/test_views.py +++ b/mayan/apps/document_indexing/tests/test_views.py @@ -5,7 +5,9 @@ from documents.tests import GenericDocumentViewTestCase from ..models import Index 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_instance_view, + permission_document_indexing_view ) from .literals import ( @@ -15,35 +17,36 @@ from .literals import ( class IndexViewTestCase(GenericDocumentViewTestCase): - def test_index_create_view_no_permission(self): - self.login_user() - - response = self.post( + def _request_index_create_view(self): + return self.post( 'indexing:index_setup_create', data={ 'label': TEST_INDEX_LABEL, 'slug': TEST_INDEX_SLUG } ) + def test_index_create_view_no_permission(self): + self.login_user() + + response = self._request_index_create_view() self.assertEquals(response.status_code, 403) self.assertEqual(Index.objects.count(), 0) def test_index_create_view_with_permission(self): self.login_user() - self.role.permissions.add( - permission_document_indexing_create.stored_permission + self.grant_permission( + permission=permission_document_indexing_create ) - response = self.post( - 'indexing:index_setup_create', data={ - 'label': TEST_INDEX_LABEL, 'slug': TEST_INDEX_SLUG - }, follow=True - ) + response = self._request_index_create_view() - self.assertContains(response, text='created', status_code=200) + self.assertEqual(response.status_code, 302) self.assertEqual(Index.objects.count(), 1) self.assertEqual(Index.objects.first().label, TEST_INDEX_LABEL) + def _request_index_delete_view(self, index): + return self.post('indexing:index_setup_delete', args=(index.pk,)) + def test_index_delete_view_no_permission(self): self.login_user() @@ -51,7 +54,7 @@ class IndexViewTestCase(GenericDocumentViewTestCase): label=TEST_INDEX_LABEL, slug=TEST_INDEX_SLUG ) - response = self.post('indexing:index_setup_delete', args=(index.pk,)) + response = self._request_index_delete_view(index=index) self.assertEqual(response.status_code, 403) self.assertEqual(Index.objects.count(), 1) @@ -66,13 +69,18 @@ class IndexViewTestCase(GenericDocumentViewTestCase): label=TEST_INDEX_LABEL, slug=TEST_INDEX_SLUG ) - response = self.post( - 'indexing:index_setup_delete', args=(index.pk,), follow=True - ) + response = self._request_index_delete_view(index=index) - self.assertContains(response, text='deleted', status_code=200) + self.assertEqual(response.status_code, 302) self.assertEqual(Index.objects.count(), 0) + def _request_index_edit_view(self, index): + return self.post( + 'indexing:index_setup_edit', args=(index.pk,), data={ + 'label': TEST_INDEX_LABEL_EDITED, 'slug': TEST_INDEX_SLUG + } + ) + def test_index_edit_view_no_permission(self): self.login_user() @@ -80,34 +88,26 @@ class IndexViewTestCase(GenericDocumentViewTestCase): label=TEST_INDEX_LABEL, slug=TEST_INDEX_SLUG ) - response = self.post( - 'indexing:index_setup_edit', args=(index.pk,), data={ - 'label': TEST_INDEX_LABEL_EDITED, 'slug': TEST_INDEX_SLUG - } - ) + response = self._request_index_edit_view(index=index) self.assertEqual(response.status_code, 403) index = Index.objects.get(pk=index.pk) self.assertEqual(index.label, TEST_INDEX_LABEL) - def test_index_edit_view_with_permission(self): + def test_index_edit_view_with_access(self): self.login_user() - self.role.permissions.add( - permission_document_indexing_edit.stored_permission - ) - index = Index.objects.create( label=TEST_INDEX_LABEL, slug=TEST_INDEX_SLUG ) - response = self.post( - 'indexing:index_setup_edit', args=(index.pk,), data={ - 'label': TEST_INDEX_LABEL_EDITED, 'slug': TEST_INDEX_SLUG - }, follow=True + self.grant_access( + permission=permission_document_indexing_edit, + obj=index ) - index = Index.objects.get(pk=index.pk) - self.assertContains(response, text='update', status_code=200) + response = self._request_index_edit_view(index=index) + self.assertEqual(response.status_code, 302) + index.refresh_from_db() self.assertEqual(index.label, TEST_INDEX_LABEL_EDITED) def create_test_index(self): @@ -129,28 +129,34 @@ class IndexViewTestCase(GenericDocumentViewTestCase): return index + def _request_index_instance_node_view(self, index_instance_node): + return self.get( + 'indexing:index_instance_node_view', args=(index_instance_node.pk,) + ) + def test_index_instance_node_view_no_permission(self): index = self.create_test_index() self.login_user() - response = self.get( - 'indexing:index_instance_node_view', args=(index.instance_root.pk,) + response = self._request_index_instance_node_view( + index_instance_node=index.instance_root ) self.assertEqual(response.status_code, 403) - def test_index_instance_node_view_with_permission(self): + def test_index_instance_node_view_with_access(self): index = self.create_test_index() self.login_user() - self.role.permissions.add( - permission_document_indexing_view.stored_permission + self.grant_access( + permission=permission_document_indexing_instance_view, + obj=index ) - response = self.get( - 'indexing:index_instance_node_view', args=(index.instance_root.pk,) + response = self._request_index_instance_node_view( + index_instance_node=index.instance_root ) self.assertContains(response, text=TEST_INDEX_LABEL, status_code=200) diff --git a/mayan/apps/document_indexing/views.py b/mayan/apps/document_indexing/views.py index dd12026a2a..b2c0f88fb3 100644 --- a/mayan/apps/document_indexing/views.py +++ b/mayan/apps/document_indexing/views.py @@ -22,8 +22,9 @@ from .models import ( ) from .permissions import ( permission_document_indexing_create, permission_document_indexing_delete, - permission_document_indexing_edit, permission_document_indexing_rebuild, - permission_document_indexing_view + permission_document_indexing_edit, + permission_document_indexing_instance_view, + permission_document_indexing_rebuild, permission_document_indexing_view ) from .tasks import task_rebuild_index from .widgets import node_tree @@ -211,7 +212,7 @@ class TemplateNodeEditView(SingleObjectEditView): class IndexListView(SingleObjectListView): - object_permission = permission_document_indexing_view + object_permission = permission_document_indexing_instance_view def get_extra_context(self): return { @@ -233,7 +234,7 @@ class IndexInstanceNodeView(DocumentListView): ) AccessControlList.objects.check_access( - permissions=permission_document_indexing_view, + permissions=permission_document_indexing_instance_view, user=request.user, obj=self.index_instance_node.index() ) @@ -295,7 +296,7 @@ class DocumentIndexNodeListView(SingleObjectListView): """ Show a list of indexes where the current document can be found """ - object_permission = permission_document_indexing_view + object_permission = permission_document_indexing_instance_view object_permission_related = 'index' def dispatch(self, request, *args, **kwargs):