From dfd2d3dc78027b05d1cd1db6b2976301c549d634 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 22 Aug 2018 01:04:36 -0400 Subject: [PATCH] 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. Modernize the document index view tests. Signed-off-by: Roberto Rosario --- HISTORY.rst | 4 + mayan/apps/document_indexing/apps.py | 6 +- mayan/apps/document_indexing/links.py | 10 ++- mayan/apps/document_indexing/permissions.py | 4 + .../document_indexing/tests/test_views.py | 88 ++++++++++--------- mayan/apps/document_indexing/views.py | 11 +-- 6 files changed, 72 insertions(+), 51 deletions(-) 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):