From f9eb7d0fb5f04890604495b1baccc8533ab5e3e2 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Mon, 17 Jul 2017 20:41:11 -0400 Subject: [PATCH] Renamed the document type permission namespace from "Document setup" to "Document types". Add support for granting the document type edit, document type delete, and document type view permissions to individual document type instances. Improved tests by testing for accesses. Signed-off-by: Roberto Rosario --- HISTORY.rst | 4 + docs/releases/2.6.rst | 14 + mayan/apps/cabinets/tests/test_views.py | 26 +- mayan/apps/common/tests/test_views.py | 8 +- mayan/apps/converter/tests/test_views.py | 6 +- .../apps/document_states/tests/test_views.py | 4 +- mayan/apps/documents/apps.py | 23 +- mayan/apps/documents/permissions.py | 3 +- mayan/apps/documents/tests/literals.py | 18 +- mayan/apps/documents/tests/test_api.py | 37 +- mayan/apps/documents/tests/test_models.py | 14 +- mayan/apps/documents/tests/test_views.py | 464 ++++++++++++------ .../documents/views/document_type_views.py | 12 +- mayan/apps/linking/tests/test_models.py | 4 +- mayan/apps/mailer/tests/test_views.py | 12 +- mayan/apps/metadata/tests/test_views.py | 30 +- mayan/apps/ocr/tests/test_views.py | 4 +- .../tests/test_view_permissions.py | 2 +- mayan/apps/sources/tests/test_views.py | 22 +- mayan/apps/tags/tests/test_views.py | 36 +- .../apps/user_management/tests/test_views.py | 24 +- 21 files changed, 490 insertions(+), 277 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 1a809e1b1f..ab7dcf2908 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -17,6 +17,10 @@ - Switch the order of the DEFAULT_AUTHENTICATION_CLASSES of DRF. GitLab #400. - Backport document's version list view permission. - Improve code to unbind menu entries. +- Renamed the document type permission namespace from "Document setup" to "Document types". +- Add support for granting the document type edit, document type delete, and document type view + permissions to individual document type instances. +- Improved tests by testing for accesses. 2.5.2 (2017-07-08) ================== diff --git a/docs/releases/2.6.rst b/docs/releases/2.6.rst index e614e46da4..cc9ace2ddd 100644 --- a/docs/releases/2.6.rst +++ b/docs/releases/2.6.rst @@ -59,6 +59,20 @@ access control now works on two levels. Now to attach a tag to a document, the permission to attach tags must be granted to the tag to attach and to the document that will receive the tag. +ACL changes +----------- +The document type permissions namespace was renamed from "Document setup" to +"Document types" for clarity. Along with that change, support was added +for granting the document type edit, document type delete, and document type view +permissions to individual document type instances instead of just globally. + +Testing +------- +The documents app view tests now test for view access and not just permission. +Testing against access is more robust and also tests for permissions +implicitly. + + Other Changes ------------- - Fix HTML mark up in window title. GitLab #397. diff --git a/mayan/apps/cabinets/tests/test_views.py b/mayan/apps/cabinets/tests/test_views.py index 8fde2589a3..577afb8db5 100644 --- a/mayan/apps/cabinets/tests/test_views.py +++ b/mayan/apps/cabinets/tests/test_views.py @@ -31,7 +31,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): self.assertEqual(Cabinet.objects.count(), 0) def test_cabinet_create_view_with_permission(self): - self.grant(permission=permission_cabinet_create) + self.grant_permission(permission=permission_cabinet_create) response = self._request_create_cabinet(label=TEST_CABINET_LABEL) @@ -41,7 +41,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_create_duplicate_view_with_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_create) + self.grant_permission(permission=permission_cabinet_create) response = self._request_create_cabinet(label=TEST_CABINET_LABEL) # HTTP 200 with error message @@ -60,7 +60,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): self.assertEqual(Cabinet.objects.count(), 1) def test_cabinet_delete_view_with_permission(self): - self.grant(permission=permission_cabinet_delete) + self.grant_permission(permission=permission_cabinet_delete) cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) @@ -89,7 +89,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_edit_view_with_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_edit) + self.grant_permission(permission=permission_cabinet_edit) response = self._edit_cabinet( cabinet=cabinet, label=TEST_CABINET_EDITED_LABEL @@ -109,7 +109,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_add_document_view_no_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_view) + self.grant_permission(permission=permission_cabinet_view) response = self._add_document_to_cabinet(cabinet=cabinet) @@ -122,9 +122,9 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_add_document_view_with_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_view) - self.grant(permission=permission_cabinet_add_document) - self.grant(permission=permission_document_view) + self.grant_permission(permission=permission_cabinet_view) + self.grant_permission(permission=permission_cabinet_add_document) + self.grant_permission(permission=permission_document_view) response = self._add_document_to_cabinet(cabinet=cabinet) @@ -146,7 +146,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_add_multiple_documents_view_no_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_view) + self.grant_permission(permission=permission_cabinet_view) response = self._add_multiple_documents_to_cabinet(cabinet=cabinet) @@ -159,8 +159,8 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_add_multiple_documents_view_with_permission(self): cabinet = Cabinet.objects.create(label=TEST_CABINET_LABEL) - self.grant(permission=permission_cabinet_view) - self.grant(permission=permission_cabinet_add_document) + self.grant_permission(permission=permission_cabinet_view) + self.grant_permission(permission=permission_cabinet_add_document) response = self._add_multiple_documents_to_cabinet(cabinet=cabinet) @@ -198,7 +198,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): cabinet.documents.add(self.document) - self.grant(permission=permission_cabinet_remove_document) + self.grant_permission(permission=permission_cabinet_remove_document) response = self._remove_document_from_cabinet(cabinet=cabinet) @@ -221,7 +221,7 @@ class CabinetViewTestCase(GenericDocumentViewTestCase): def test_cabinet_list_view_with_permission(self): self._create_cabinet() - self.grant(permission=permission_cabinet_view) + self.grant_permission(permission=permission_cabinet_view) response = self._request_cabinet_list() self.assertContains( diff --git a/mayan/apps/common/tests/test_views.py b/mayan/apps/common/tests/test_views.py index a5716a1c65..988567145d 100644 --- a/mayan/apps/common/tests/test_views.py +++ b/mayan/apps/common/tests/test_views.py @@ -7,6 +7,7 @@ from django.core.urlresolvers import clear_url_caches, reverse from django.http import HttpResponse from django.template import Context, Template +from acls.models import AccessControlList from permissions.models import Role from permissions.tests.literals import TEST_ROLE_LABEL from user_management.tests import ( @@ -74,7 +75,12 @@ class GenericViewTestCase(BaseTestCase): data=data, follow=follow ) - def grant(self, permission): + def grant_access(self, permission, obj): + AccessControlList.objects.grant( + permission=permission, role=self.role, obj=obj + ) + + def grant_permission(self, permission): self.role.permissions.add( permission.stored_permission ) diff --git a/mayan/apps/converter/tests/test_views.py b/mayan/apps/converter/tests/test_views.py index 1ede5e71a6..9deb586989 100644 --- a/mayan/apps/converter/tests/test_views.py +++ b/mayan/apps/converter/tests/test_views.py @@ -32,7 +32,7 @@ class TransformationViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) def test_transformation_list_view_with_permissions(self): - self.grant(permission=permission_transformation_view) + self.grant_permission(permission=permission_transformation_view) response = self._transformation_list_view() self.assertContains( @@ -57,7 +57,7 @@ class TransformationViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(Transformation.objects.count(), 0) def test_transformation_create_view_with_permissions(self): - self.grant(permission=permission_transformation_create) + self.grant_permission(permission=permission_transformation_create) response = self._transformation_create_view() self.assertEqual(response.status_code, 302) @@ -85,7 +85,7 @@ class TransformationViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(Transformation.objects.count(), 1) def test_transformation_delete_view_with_permissions(self): - self.grant(permission=permission_transformation_delete) + self.grant_permission(permission=permission_transformation_delete) response = self._transformation_delete_view() self.assertEqual(response.status_code, 302) diff --git a/mayan/apps/document_states/tests/test_views.py b/mayan/apps/document_states/tests/test_views.py index 04fdac14bc..4b45acc09f 100644 --- a/mayan/apps/document_states/tests/test_views.py +++ b/mayan/apps/document_states/tests/test_views.py @@ -197,7 +197,7 @@ class DocumentStateToolViewTestCase(GenericDocumentViewTestCase): self._create_workflow_transition() self.login_user() - self.grant(permission_workflow_tools) + self.grant_permission(permission=permission_workflow_tools) self.assertEqual(self.document.workflows.count(), 0) @@ -287,7 +287,7 @@ class DocumentStateTransitionViewTestCase(GenericDocumentViewTestCase): workflow_instance = self.document_2.workflows.first() - self.grant(permission_workflow_transition) + self.grant_permission(permission=permission_workflow_transition) response = self._request_workflow_transition( workflow_instance=workflow_instance ) diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index 179eea52e8..ddc620863f 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -70,7 +70,9 @@ from .permissions import ( permission_document_download, permission_document_edit, permission_document_new_version, permission_document_print, permission_document_properties_edit, permission_document_restore, - permission_document_trash, permission_document_version_revert, + permission_document_trash, permission_document_type_delete, + permission_document_type_edit, permission_document_type_view, + permission_document_version_revert, permission_document_version_view, permission_document_view ) from .queues import * # NOQA @@ -173,7 +175,8 @@ class DocumentsApp(MayanAppConfig): permission_document_edit, permission_document_new_version, permission_document_print, permission_document_properties_edit, permission_document_restore, permission_document_trash, - permission_document_version_revert, permission_document_view, + permission_document_version_revert, + permission_document_version_view, permission_document_view, permission_events_view, permission_transformation_create, permission_transformation_delete, permission_transformation_edit, permission_transformation_view, @@ -181,7 +184,10 @@ class DocumentsApp(MayanAppConfig): ) ModelPermission.register( - model=DocumentType, permissions=(permission_document_create,) + model=DocumentType, permissions=( + permission_document_create, permission_document_type_delete, + permission_document_type_edit, permission_document_type_view + ) ) ModelPermission.register_proxy( @@ -191,14 +197,15 @@ class DocumentsApp(MayanAppConfig): ModelPermission.register_inheritance( model=Document, related='document_type', ) - - ModelPermission.register_inheritance( - model=DocumentVersion, related='document', - ) - ModelPermission.register_inheritance( model=DocumentPage, related='document', ) + ModelPermission.register_inheritance( + model=DocumentTypeFilename, related='document_type', + ) + ModelPermission.register_inheritance( + model=DocumentVersion, related='document', + ) # Document and document page thumbnail widget document_thumbnail_widget = DocumentThumbnailWidget() diff --git a/mayan/apps/documents/permissions.py b/mayan/apps/documents/permissions.py index c928a1a909..fd40d9303b 100644 --- a/mayan/apps/documents/permissions.py +++ b/mayan/apps/documents/permissions.py @@ -51,8 +51,9 @@ permission_empty_trash = namespace.add_permission( name='document_empty_trash', label=_('Empty trash') ) +# TODO: rename 'document_setup' to 'document_types' on the next major version setup_namespace = PermissionNamespace( - 'documents_setup', label=_('Documents setup') + 'documents_setup', label=_('Document types') ) permission_document_type_create = setup_namespace.add_permission( name='document_type_create', label=_('Create document types') diff --git a/mayan/apps/documents/tests/literals.py b/mayan/apps/documents/tests/literals.py index c282c5783d..c90794b81c 100644 --- a/mayan/apps/documents/tests/literals.py +++ b/mayan/apps/documents/tests/literals.py @@ -9,10 +9,10 @@ __all__ = ( 'TEST_COMPRESSED_DOCUMENTS_FILENAME', 'TEST_COMPRESSED_DOCUMENT_PATH', 'TEST_DEU_DOCUMENT_FILENAME', 'TEST_DEU_DOCUMENT_PATH', 'TEST_DOCUMENT_PATH', 'TEST_HYBRID_DOCUMENT_PATH', - 'TEST_DOCUMENT_FILENAME', 'TEST_DOCUMENT_TYPE', - 'TEST_DOCUMENT_DESCRIPTION', 'TEST_HYBRID_DOCUMENT', - 'TEST_MULTI_PAGE_TIFF', 'TEST_MULTI_PAGE_TIFF_PATH', - 'TEST_NON_ASCII_COMPRESSED_DOCUMENT_FILENAME', + 'TEST_DOCUMENT_FILENAME', 'TEST_DOCUMENT_TYPE_LABEL', + 'TEST_DOCUMENT_TYPE_LABEL_EDITED', 'TEST_DOCUMENT_DESCRIPTION', + 'TEST_HYBRID_DOCUMENT', 'TEST_MULTI_PAGE_TIFF', + 'TEST_MULTI_PAGE_TIFF_PATH', 'TEST_NON_ASCII_COMPRESSED_DOCUMENT_FILENAME', 'TEST_NON_ASCII_COMPRESSED_DOCUMENT_PATH', 'TEST_NON_ASCII_DOCUMENT_FILENAME', 'TEST_NON_ASCII_DOCUMENT_PATH', 'TEST_SMALL_DOCUMENT_CHECKSUM', 'TEST_SMALL_DOCUMENT_FILENAME', @@ -25,8 +25,11 @@ TEST_DEU_DOCUMENT_FILENAME = 'deu_website.png' TEST_DOCUMENT_DESCRIPTION = 'test description' TEST_DOCUMENT_DESCRIPTION_EDITED = 'test document description edited' TEST_DOCUMENT_FILENAME = 'mayan_11_1.pdf' -TEST_DOCUMENT_TYPE = 'test_document_type' -TEST_DOCUMENT_TYPE_2 = 'test document type 2' +TEST_DOCUMENT_TYPE_LABEL = 'test_document_type' +TEST_DOCUMENT_TYPE_2_LABEL = 'test document type 2' +TEST_DOCUMENT_TYPE_LABEL_EDITED = 'test document type edited label' +TEST_DOCUMENT_TYPE_QUICK_LABEL = 'test quick label' +TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED = 'test quick label edited' TEST_DOCUMENT_VERSION_COMMENT_EDITED = 'test document version comment edited' TEST_HYBRID_DOCUMENT = 'hybrid_text_and_image.pdf' TEST_MULTI_PAGE_TIFF = 'multi_page.tiff' @@ -36,6 +39,8 @@ TEST_OFFICE_DOCUMENT = 'simple_2_page_document.doc' TEST_SMALL_DOCUMENT_FILENAME = 'title_page.png' TEST_SMALL_DOCUMENT_CHECKSUM = 'efa10e6cc21f83078aaa94d5cbe51de67b51af706143b\ afc7fd6d4c02124879a' +TEST_TRANSFORMATION_NAME = 'rotate' +TEST_TRANSFORMATION_ARGUMENT = 'degrees: 180' # File paths TEST_COMPRESSED_DOCUMENT_PATH = os.path.join( @@ -50,7 +55,6 @@ TEST_DOCUMENT_PATH = os.path.join( settings.BASE_DIR, 'apps', 'documents', 'tests', 'contrib', 'sample_documents', TEST_DOCUMENT_FILENAME ) -TEST_DOCUMENT_TYPE_QUICK_LABEL = 'test quick label' TEST_HYBRID_DOCUMENT_PATH = os.path.join( settings.BASE_DIR, 'apps', 'documents', 'tests', 'contrib', 'sample_documents', TEST_HYBRID_DOCUMENT diff --git a/mayan/apps/documents/tests/test_api.py b/mayan/apps/documents/tests/test_api.py index 95fd104978..4b53236c17 100644 --- a/mayan/apps/documents/tests/test_api.py +++ b/mayan/apps/documents/tests/test_api.py @@ -21,9 +21,9 @@ from user_management.tests.literals import ( from .literals import ( TEST_DOCUMENT_DESCRIPTION_EDITED, TEST_DOCUMENT_FILENAME, - TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE, - TEST_DOCUMENT_VERSION_COMMENT_EDITED, TEST_SMALL_DOCUMENT_FILENAME, - TEST_SMALL_DOCUMENT_PATH + TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE_LABEL, + TEST_DOCUMENT_TYPE_LABEL_EDITED, TEST_DOCUMENT_VERSION_COMMENT_EDITED, + TEST_SMALL_DOCUMENT_FILENAME, TEST_SMALL_DOCUMENT_PATH ) from ..models import Document, DocumentType @@ -49,40 +49,46 @@ class DocumentTypeAPITestCase(BaseAPITestCase): response = self.client.post( reverse('rest_api:documenttype-list'), data={ - 'label': TEST_DOCUMENT_TYPE + 'label': TEST_DOCUMENT_TYPE_LABEL } ) self.assertEqual(response.status_code, 201) self.assertEqual(DocumentType.objects.all().count(), 1) self.assertEqual( - DocumentType.objects.all().first().label, TEST_DOCUMENT_TYPE + DocumentType.objects.all().first().label, TEST_DOCUMENT_TYPE_LABEL ) def test_document_type_edit_via_put(self): - document_type = DocumentType.objects.create(label=TEST_DOCUMENT_TYPE) + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_LABEL + ) self.client.put( reverse('rest_api:documenttype-detail', args=(document_type.pk,)), - {'label': TEST_DOCUMENT_TYPE + 'edited'} + {'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} ) document_type = DocumentType.objects.get(pk=document_type.pk) - self.assertEqual(document_type.label, TEST_DOCUMENT_TYPE + 'edited') + self.assertEqual(document_type.label, TEST_DOCUMENT_TYPE_LABEL_EDITED) def test_document_type_edit_via_patch(self): - document_type = DocumentType.objects.create(label=TEST_DOCUMENT_TYPE) + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_LABEL + ) self.client.patch( reverse('rest_api:documenttype-detail', args=(document_type.pk,)), - {'label': TEST_DOCUMENT_TYPE + 'edited'} + {'label': TEST_DOCUMENT_TYPE_LABEL_EDITED} ) document_type = DocumentType.objects.get(pk=document_type.pk) - self.assertEqual(document_type.label, TEST_DOCUMENT_TYPE + 'edited') + self.assertEqual(document_type.label, TEST_DOCUMENT_TYPE_LABEL_EDITED) def test_document_type_delete(self): - document_type = DocumentType.objects.create(label=TEST_DOCUMENT_TYPE) + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_LABEL + ) self.client.delete( reverse('rest_api:documenttype-detail', args=(document_type.pk,)) @@ -105,7 +111,7 @@ class DocumentAPITestCase(BaseAPITestCase): ) self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) def tearDown(self): @@ -361,7 +367,7 @@ class TrashedDocumentAPITestCase(BaseAPITestCase): ) self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) def tearDown(self): @@ -430,6 +436,3 @@ class TrashedDocumentAPITestCase(BaseAPITestCase): self.assertEqual(Document.trash.count(), 0) self.assertEqual(Document.objects.count(), 1) - - # TODO: def test_document_set_document_type(self): - # pass diff --git a/mayan/apps/documents/tests/test_models.py b/mayan/apps/documents/tests/test_models.py index cbcf1345c9..4977cefa99 100644 --- a/mayan/apps/documents/tests/test_models.py +++ b/mayan/apps/documents/tests/test_models.py @@ -10,7 +10,7 @@ from ..literals import STUB_EXPIRATION_INTERVAL from ..models import DeletedDocument, Document, DocumentType from .literals import ( - TEST_DOCUMENT_TYPE, TEST_DOCUMENT_PATH, TEST_MULTI_PAGE_TIFF_PATH, + TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_PATH, TEST_MULTI_PAGE_TIFF_PATH, TEST_OFFICE_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH ) @@ -21,7 +21,7 @@ class GenericDocumentTestCase(BaseTestCase): super(GenericDocumentTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) with open(TEST_SMALL_DOCUMENT_PATH) as file_object: @@ -40,7 +40,7 @@ class DocumentTestCase(BaseTestCase): super(DocumentTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) with open(TEST_DOCUMENT_PATH) as file_object: @@ -53,7 +53,7 @@ class DocumentTestCase(BaseTestCase): super(DocumentTestCase, self).tearDown() def test_document_creation(self): - self.assertEqual(self.document_type.label, TEST_DOCUMENT_TYPE) + self.assertEqual(self.document_type.label, TEST_DOCUMENT_TYPE_LABEL) self.assertEqual(self.document.exists(), True) self.assertEqual(self.document.size, 272213) @@ -162,7 +162,7 @@ class OfficeDocumentTestCase(BaseTestCase): super(OfficeDocumentTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) with open(TEST_OFFICE_DOCUMENT_PATH) as file_object: @@ -191,7 +191,7 @@ class MultiPageTiffTestCase(BaseTestCase): def setUp(self): super(MultiPageTiffTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) with open(TEST_MULTI_PAGE_TIFF_PATH) as file_object: @@ -253,7 +253,7 @@ class DocumentManagerTestCase(BaseTestCase): def setUp(self): super(DocumentManagerTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) def tearDown(self): diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index bdeb16fabd..5210c6a88c 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -26,24 +26,19 @@ from ..permissions import ( ) from .literals import ( - TEST_DOCUMENT_TYPE, TEST_DOCUMENT_TYPE_QUICK_LABEL, - TEST_SMALL_DOCUMENT_FILENAME, TEST_SMALL_DOCUMENT_PATH, - TEST_VERSION_COMMENT + TEST_DOCUMENT_TYPE_LABEL, TEST_DOCUMENT_TYPE_2_LABEL, + TEST_DOCUMENT_TYPE_LABEL_EDITED, TEST_DOCUMENT_TYPE_QUICK_LABEL, + TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, TEST_SMALL_DOCUMENT_FILENAME, + TEST_SMALL_DOCUMENT_PATH, TEST_TRANSFORMATION_ARGUMENT, + TEST_TRANSFORMATION_NAME, TEST_VERSION_COMMENT ) - -TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label' -TEST_DOCUMENT_TYPE_2_LABEL = 'test document type 2 label' -TEST_TRANSFORMATION_NAME = 'rotate' -TEST_TRANSFORMATION_ARGUMENT = 'degrees: 180' - - @override_settings(OCR_AUTO_OCR=False) class GenericDocumentViewTestCase(GenericViewTestCase): def setUp(self): super(GenericDocumentViewTestCase, self).setUp() self.document_type = DocumentType.objects.create( - label=TEST_DOCUMENT_TYPE + label=TEST_DOCUMENT_TYPE_LABEL ) with open(TEST_SMALL_DOCUMENT_PATH) as file_object: @@ -70,7 +65,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) def test_document_view_with_permissions(self): - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.get( 'documents:document_properties', args=(self.document.pk,), follow=True @@ -85,11 +82,13 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertContains(response, 'Total: 0', status_code=200) def test_document_list_view_with_permissions(self): - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.get('documents:document_list') self.assertContains(response, self.document.label, status_code=200) - def _edit_document_type(self, document_type): + def _request_document_type_edit(self, document_type): return self.post( 'documents:document_document_type_edit', args=(self.document.pk,), @@ -101,11 +100,13 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type_2 = DocumentType.objects.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) - response = self._edit_document_type(document_type=document_type) + response = self._request_document_type_edit( + document_type=document_type_2 + ) self.assertContains( response, text='Select a valid choice', status_code=200 @@ -121,23 +122,29 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type_2 = DocumentType.objects.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) - self.grant(permission=permission_document_properties_edit) - self.grant(permission=permission_document_create) + self.grant_access( + obj=self.document, permission=permission_document_properties_edit + ) + self.grant_access( + obj=document_type_2, permission=permission_document_create + ) - response = self._edit_document_type(document_type=document_type) + response = self._request_document_type_edit( + document_type=document_type_2 + ) self.assertEqual(response.status_code, 302) self.assertEqual( Document.objects.get(pk=self.document.pk).document_type, - document_type + document_type_2 ) - def _multiple_document_type_edit(self, document_type): + def _request_multiple_document_type_edit(self, document_type): return self.post( 'documents:document_multiple_document_type_edit', data={ @@ -151,12 +158,12 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): Document.objects.first().document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type_2 = DocumentType.objects.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) - response = self._multiple_document_type_edit( - document_type=document_type + response = self._request_multiple_document_type_edit( + document_type=document_type_2 ) self.assertContains( @@ -172,21 +179,25 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): Document.objects.first().document_type, self.document_type ) - document_type = DocumentType.objects.create( + document_type_2 = DocumentType.objects.create( label=TEST_DOCUMENT_TYPE_2_LABEL ) - self.grant(permission=permission_document_properties_edit) - self.grant(permission=permission_document_create) + self.grant_access( + obj=self.document, permission=permission_document_properties_edit + ) + self.grant_access( + obj=document_type_2, permission=permission_document_create + ) - response = self._multiple_document_type_edit( - document_type=document_type + response = self._request_multiple_document_type_edit( + document_type=document_type_2 ) self.assertEqual(response.status_code, 302) self.assertEqual( - Document.objects.first().document_type, document_type + Document.objects.first().document_type, document_type_2 ) def test_document_download_view_no_permission(self): @@ -203,7 +214,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.file_mimetype ) - self.grant(permission=permission_document_download) + self.grant_access( + obj=self.document, permission=permission_document_download + ) response = self.get( 'documents:document_download', args=(self.document.pk,) ) @@ -231,7 +244,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.expected_content_type = '{}; charset=utf-8'.format( self.document.file_mimetype ) - self.grant(permission=permission_document_download) + self.grant_access( + obj=self.document, permission=permission_document_download + ) response = self.get( 'documents:document_multiple_download', @@ -261,7 +276,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): # common.tests.mixins.ContentTypeCheckMixin self.expected_content_type = 'application/octet-stream; charset=utf-8' - self.grant(permission=permission_document_download) + self.grant_access( + obj=self.document, permission=permission_document_download + ) response = self.get( 'documents:document_version_download', args=( self.document.latest_version.pk, @@ -290,12 +307,14 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 302) self.assertEqual(self.document.pages.count(), 0) - def test_document_update_page_count_view_with_permissions(self): + def test_document_update_page_count_view_with_permission(self): + # TODO: Revise permission association + page_count = self.document.pages.count() self.document.pages.all().delete() self.assertEqual(self.document.pages.count(), 0) - self.grant(permission=permission_document_tools) + self.grant_permission(permission=permission_document_tools) response = self.post( 'documents:document_update_page_count', @@ -316,12 +335,12 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 302) self.assertEqual(self.document.pages.count(), 0) - def test_document_multiple_update_page_count_view_with_permissions(self): + def test_document_multiple_update_page_count_view_with_permission(self): page_count = self.document.pages.count() self.document.pages.all().delete() self.assertEqual(self.document.pages.count(), 0) - self.grant(permission=permission_document_tools) + self.grant_permission(permission=permission_document_tools) response = self.post( 'documents:document_multiple_update_page_count', @@ -344,7 +363,9 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): (repr(transformation),) ) - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.post( 'documents:document_clear_transformations', @@ -357,7 +378,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): (repr(transformation),) ) - def test_document_clear_transformations_view_with_permissions(self): + def test_document_clear_transformations_view_with_access(self): document_page = self.document.pages.first() content_type = ContentType.objects.get_for_model(document_page) transformation = Transformation.objects.create( @@ -370,8 +391,12 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): (repr(transformation),) ) - self.grant(permission=permission_transformation_delete) - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_transformation_delete + ) + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.post( 'documents:document_clear_transformations', @@ -397,7 +422,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): (repr(transformation),) ) - self.grant(permission=permission_document_view) + self.grant_permission(permission=permission_document_view) response = self.post( 'documents:document_multiple_clear_transformations', @@ -410,10 +435,41 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): (repr(transformation),) ) + def test_document_multiple_clear_transformations_view_with_access(self): + document_page = self.document.pages.first() + content_type = ContentType.objects.get_for_model(document_page) + transformation = Transformation.objects.create( + content_type=content_type, object_id=document_page.pk, + name=TEST_TRANSFORMATION_NAME, + arguments=TEST_TRANSFORMATION_ARGUMENT + ) + + self.assertQuerysetEqual( + Transformation.objects.get_for_model(document_page), + (repr(transformation),) + ) + + self.grant_access( + obj=self.document, permission=permission_document_view + ) + self.grant_access( + obj=self.document, permission=permission_transformation_delete + ) + + response = self.post( + 'documents:document_multiple_clear_transformations', + data={'id_list': self.document.pk}, follow=True + ) + + self.assertEqual(response.status_code, 200) + self.assertEqual( + Transformation.objects.get_for_model(document_page).count(), 0 + ) + def _empty_trash(self): return self.post('documents:trash_can_empty') - def test_trash_can_empty_view_no_permissions(self): + def test_trash_can_empty_view_no_permission(self): self.document.delete() self.assertEqual(DeletedDocument.objects.count(), 1) @@ -427,7 +483,7 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.document.delete() self.assertEqual(DeletedDocument.objects.count(), 1) - self.grant(permission=permission_empty_trash) + self.grant_permission(permission=permission_empty_trash) response = self._empty_trash() @@ -444,8 +500,10 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) - def test_document_page_view_with_permissions(self): - self.grant(permission=permission_document_view) + def test_document_page_view_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.get( 'documents:document_page_view', args=( self.document.pages.first().pk, @@ -470,8 +528,10 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase): response = self._request_print_view() self.assertEqual(response.status_code, 403) - def test_document_print_view_with_permissions(self): - self.grant(permission=permission_document_print) + def test_document_print_view_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_print + ) response = self._request_print_view() self.assertEqual(response.status_code, 200) @@ -490,8 +550,10 @@ class DocumentPageViewTestCase(GenericDocumentViewTestCase): response = self._document_page_list_view() self.assertEqual(response.status_code, 403) - def test_document_page_list_view_with_permission(self): - self.grant(permission_document_view) + def test_document_page_list_view_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self._document_page_list_view() self.assertContains( response, text=self.document.label, status_code=200 @@ -503,21 +565,25 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): super(DocumentTypeViewsTestCase, self).setUp() self.login_user() + def _request_document_type_create(self): + return self.post( + 'documents:document_type_create', + data={ + 'label': TEST_DOCUMENT_TYPE_LABEL, + 'delete_time_period': DEFAULT_DELETE_PERIOD, + 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT + }, follow=True + ) + def test_document_type_create_view_no_permission(self): self.document_type.delete() self.assertEqual(Document.objects.count(), 0) - response = self.post( - 'documents:document_type_create', - data={ - 'label': TEST_DOCUMENT_TYPE, - 'delete_time_period': DEFAULT_DELETE_PERIOD, - 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT - } - ) - - self.assertEqual(response.status_code, 403) + # Grant the document type view permission so that the post create + # redirect works + self.grant_permission(permission=permission_document_type_view) + response = self._request_document_type_create() self.assertEqual(DocumentType.objects.count(), 0) @@ -526,111 +592,197 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(Document.objects.count(), 0) - self.grant(permission=permission_document_type_create) - self.grant(permission=permission_document_type_view) + self.grant_permission(permission=permission_document_type_create) + # Grant the document type view permission so that the post create + # redirect works + self.grant_permission(permission=permission_document_type_view) - response = self.post( - 'documents:document_type_create', - data={ - 'label': TEST_DOCUMENT_TYPE, - 'delete_time_period': DEFAULT_DELETE_PERIOD, - 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT - }, follow=True - ) + response = self._request_document_type_create() self.assertContains(response, text='successfully', status_code=200) self.assertEqual(DocumentType.objects.count(), 1) self.assertEqual( - DocumentType.objects.first().label, TEST_DOCUMENT_TYPE + DocumentType.objects.first().label, TEST_DOCUMENT_TYPE_LABEL ) - def test_document_type_delete_view_no_permission(self): - response = self.post( - 'documents:document_type_delete', - args=(self.document_type.pk,) - ) - - self.assertEqual(response.status_code, 403) - self.assertEqual(DocumentType.objects.count(), 1) - - def test_document_type_delete_view_with_permission(self): - self.grant(permission=permission_document_type_delete) - self.grant(permission=permission_document_type_view) - - response = self.post( + def _request_document_type_delete(self): + return self.post( 'documents:document_type_delete', args=(self.document_type.pk,), follow=True ) + def test_document_type_delete_view_no_permission(self): + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + self._request_document_type_delete() + + self.assertEqual(DocumentType.objects.count(), 1) + + def test_document_type_delete_view_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_delete + ) + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + response = self._request_document_type_delete() + self.assertContains(response, 'successfully', status_code=200) self.assertEqual(DocumentType.objects.count(), 0) - def test_document_type_edit_view_no_permission(self): - response = self.post( + def _request_document_type_edit(self): + return self.post( 'documents:document_type_edit', args=(self.document_type.pk,), data={ - 'label': TEST_DOCUMENT_TYPE_EDITED_LABEL, - 'delete_time_period': DEFAULT_DELETE_PERIOD, - 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT - } - ) - - self.assertEqual(response.status_code, 403) - - self.assertEqual( - DocumentType.objects.get(pk=self.document_type.pk).label, - TEST_DOCUMENT_TYPE - ) - - def test_document_type_edit_view_with_permission(self): - self.grant(permission=permission_document_type_edit) - self.grant(permission=permission_document_type_view) - - response = self.post( - 'documents:document_type_edit', - args=(self.document_type.pk,), - data={ - 'label': TEST_DOCUMENT_TYPE_EDITED_LABEL, + 'label': TEST_DOCUMENT_TYPE_LABEL_EDITED, 'delete_time_period': DEFAULT_DELETE_PERIOD, 'delete_time_unit': DEFAULT_DELETE_TIME_UNIT }, follow=True ) + def test_document_type_edit_view_no_permission(self): + response = self._request_document_type_edit() + + self.assertEqual( + DocumentType.objects.get(pk=self.document_type.pk).label, + TEST_DOCUMENT_TYPE_LABEL + ) + + def test_document_type_edit_view_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + + # Grant the document type view permission so that the post delete + # redirect works + self.grant_permission(permission=permission_document_type_view) + + response = self._request_document_type_edit() + self.assertContains(response, 'successfully', status_code=200) self.assertEqual( DocumentType.objects.get(pk=self.document_type.pk).label, - TEST_DOCUMENT_TYPE_EDITED_LABEL + TEST_DOCUMENT_TYPE_LABEL_EDITED + ) + + def _request_quick_label_create(self): + return self.post( + 'documents:document_type_filename_create', + args=(self.document_type.pk,), + data={ + 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, + }, follow=True ) def test_document_type_quick_label_create_no_permission(self): - response = self.post( - 'documents:document_type_filename_create', - args=(self.document_type.pk,), - data={ - 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, - }, follow=True + self.grant_access( + obj=self.document_type, permission=permission_document_type_view ) + self._request_quick_label_create() - self.assertEqual(response.status_code, 403) self.assertEqual(self.document_type.filenames.count(), 0) - def test_document_type_quick_label_create_with_permission(self): - self.grant(permission=permission_document_type_edit) - - response = self.post( - 'documents:document_type_filename_create', - args=(self.document_type.pk,), - data={ - 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL, - }, follow=True + def test_document_type_quick_label_create_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_view ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + + response = self._request_quick_label_create() self.assertContains(response, 'reated', status_code=200) self.assertEqual(self.document_type.filenames.count(), 1) + def _create_quick_label(self): + self.document_type_filename = self.document_type.filenames.create( + filename=TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def _request_quick_label_edit(self): + return self.post( + 'documents:document_type_filename_edit', + args=(self.document_type_filename.pk,), + data={ + 'filename': TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED, + }, follow=True + ) + + def test_document_type_quick_label_edit_no_permission(self): + self._create_quick_label() + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + response = self._request_quick_label_edit() + + self.assertEqual(response.status_code, 403) + self.assertEqual( + self.document_type_filename.filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def test_document_type_quick_label_edit_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + + self._create_quick_label() + response = self._request_quick_label_edit() + self.assertEqual(response.status_code, 200) + + self.document_type_filename.refresh_from_db() + self.assertEqual( + self.document_type_filename.filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL_EDITED + ) + + def _request_quick_label_delete(self): + return self.post( + 'documents:document_type_filename_delete', + args=(self.document_type_filename.pk,), + follow=True + ) + + def test_document_type_quick_label_delete_no_permission(self): + self._create_quick_label() + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + response = self._request_quick_label_delete() + + self.assertEqual( + self.document_type.filenames.count(), 1 + ) + self.assertEqual( + self.document_type.filenames.first().filename, + TEST_DOCUMENT_TYPE_QUICK_LABEL + ) + + def test_document_type_quick_label_delete_with_access(self): + self.grant_access( + obj=self.document_type, permission=permission_document_type_edit + ) + self.grant_access( + obj=self.document_type, permission=permission_document_type_view + ) + + self._create_quick_label() + response = self._request_quick_label_delete() + + self.assertEqual(response.status_code, 200) + self.assertEqual( + self.document_type.filenames.count(), 0 + ) class DocumentVersionTestCase(GenericDocumentViewTestCase): def setUp(self): @@ -649,8 +801,10 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) - def test_document_version_list_with_permission(self): - self.grant(permission=permission_document_version_view) + def test_document_version_list_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_version_view + ) with open(TEST_SMALL_DOCUMENT_PATH) as file_object: self.document.new_version( @@ -678,7 +832,7 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) self.assertEqual(self.document.versions.count(), 2) - def test_document_version_revert_with_permission(self): + def test_document_version_revert_with_access(self): first_version = self.document.latest_version with open(TEST_SMALL_DOCUMENT_PATH) as file_object: @@ -686,7 +840,9 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): file_object=file_object ) - self.grant(permission=permission_document_version_revert) + self.grant_access( + obj=self.document, permission=permission_document_version_revert + ) response = self.post( 'documents:document_version_revert', args=(first_version.pk,), @@ -697,8 +853,6 @@ class DocumentVersionTestCase(GenericDocumentViewTestCase): self.assertEqual(self.document.versions.count(), 1) - - class DeletedDocumentTestCase(GenericDocumentViewTestCase): def setUp(self): super(DeletedDocumentTestCase, self).setUp() @@ -715,11 +869,13 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(DeletedDocument.objects.count(), 1) self.assertEqual(Document.objects.count(), 0) - def test_document_restore_view_with_permission(self): + def test_document_restore_view_with_access(self): self.document.delete() self.assertEqual(Document.objects.count(), 0) - self.grant(permission=permission_document_restore) + self.grant_access( + obj=self.document, permission=permission_document_restore + ) response = self.post( 'documents:document_restore', args=(self.document.pk,), follow=True @@ -737,8 +893,10 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(DeletedDocument.objects.count(), 0) self.assertEqual(Document.objects.count(), 1) - def test_document_trash_with_permissions(self): - self.grant(permission=permission_document_trash) + def test_document_trash_with_access(self): + self.grant_access( + obj=self.document, permission=permission_document_trash + ) response = self.post( 'documents:document_trash', args=(self.document.pk,), @@ -761,12 +919,14 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): self.assertEqual(Document.objects.count(), 0) self.assertEqual(DeletedDocument.objects.count(), 1) - def test_document_delete_with_permissions(self): + def test_document_delete_with_access(self): self.document.delete() self.assertEqual(Document.objects.count(), 0) self.assertEqual(DeletedDocument.objects.count(), 1) - self.grant(permission=permission_document_delete) + self.grant_access( + obj=self.document, permission=permission_document_delete + ) response = self.post( 'documents:document_delete', args=(self.document.pk,), @@ -784,10 +944,12 @@ class DeletedDocumentTestCase(GenericDocumentViewTestCase): self.assertNotContains(response, self.document.label, status_code=200) - def test_deleted_document_list_view_with_permissions(self): + def test_deleted_document_list_view_with_access(self): self.document.delete() - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) response = self.get('documents:document_list_deleted') self.assertContains(response, self.document.label, status_code=200) @@ -820,9 +982,15 @@ class DuplicatedDocumentsViewsTestCase(GenericDocumentViewTestCase): response, text=self.document.label, status_code=200 ) - def test_duplicated_document_list_with_permissions(self): + def test_duplicated_document_list_with_access(self): self._upload_duplicate_document() - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) + self.grant_access( + obj=self.document_duplicate, + permission=permission_document_view + ) response = self._request_duplicated_document_list() self.assertContains( @@ -835,9 +1003,15 @@ class DuplicatedDocumentsViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) - def test_document_duplicates_list_with_permissions(self): + def test_document_duplicates_list_with_access(self): self._upload_duplicate_document() - self.grant(permission=permission_document_view) + self.grant_access( + obj=self.document, permission=permission_document_view + ) + self.grant_access( + obj=self.document_duplicate, + permission=permission_document_view + ) response = self._request_document_duplicates_list() self.assertContains( diff --git a/mayan/apps/documents/views/document_type_views.py b/mayan/apps/documents/views/document_type_views.py index de853710df..b5f13ee0b5 100644 --- a/mayan/apps/documents/views/document_type_views.py +++ b/mayan/apps/documents/views/document_type_views.py @@ -44,7 +44,7 @@ class DocumentTypeDocumentListView(DocumentListView): class DocumentTypeListView(SingleObjectListView): model = DocumentType - view_permission = permission_document_type_view + object_permission = permission_document_type_view def get_extra_context(self): return { @@ -70,8 +70,8 @@ class DocumentTypeCreateView(SingleObjectCreateView): class DocumentTypeDeleteView(SingleObjectDeleteView): model = DocumentType + object_permission = permission_document_type_delete post_action_redirect = reverse_lazy('documents:document_type_list') - view_permission = permission_document_type_delete def get_extra_context(self): return { @@ -87,8 +87,8 @@ class DocumentTypeEditView(SingleObjectEditView): 'delete_time_unit' ) model = DocumentType + object_permission = permission_document_type_edit post_action_redirect = reverse_lazy('documents:document_type_list') - view_permission = permission_document_type_edit def get_extra_context(self): return { @@ -129,7 +129,7 @@ class DocumentTypeFilenameCreateView(SingleObjectCreateView): class DocumentTypeFilenameEditView(SingleObjectEditView): fields = ('enabled', 'filename',) model = DocumentTypeFilename - view_permission = permission_document_type_edit + object_permission = permission_document_type_edit def get_extra_context(self): document_type_filename = self.get_object() @@ -156,7 +156,7 @@ class DocumentTypeFilenameEditView(SingleObjectEditView): class DocumentTypeFilenameDeleteView(SingleObjectDeleteView): model = DocumentTypeFilename - view_permission = permission_document_type_edit + object_permission = permission_document_type_edit def get_extra_context(self): return { @@ -181,7 +181,7 @@ class DocumentTypeFilenameDeleteView(SingleObjectDeleteView): class DocumentTypeFilenameListView(SingleObjectListView): model = DocumentType - view_permission = permission_document_type_view + object_permission = permission_document_type_view def get_document_type(self): return get_object_or_404(DocumentType, pk=self.kwargs['pk']) diff --git a/mayan/apps/linking/tests/test_models.py b/mayan/apps/linking/tests/test_models.py index 306c03ec4e..d1982696f0 100644 --- a/mayan/apps/linking/tests/test_models.py +++ b/mayan/apps/linking/tests/test_models.py @@ -7,7 +7,7 @@ from django.test import override_settings from common.tests import BaseTestCase from documents.models import DocumentType -from documents.tests import TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE +from documents.tests import TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE from user_management.tests.literals import ( TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME ) @@ -25,7 +25,7 @@ class SmartLinkTestCase(BaseTestCase): label=TEST_DOCUMENT_TYPE ) - with open(TEST_DOCUMENT_PATH) as file_object: + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: self.document = self.document_type.new_document( file_object=file_object ) diff --git a/mayan/apps/mailer/tests/test_views.py b/mayan/apps/mailer/tests/test_views.py index ef52f39785..9f05fdd97d 100644 --- a/mayan/apps/mailer/tests/test_views.py +++ b/mayan/apps/mailer/tests/test_views.py @@ -62,8 +62,8 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase): self._create_user_mailer() self.login_user() - self.grant(permission_mailing_link) - self.grant(permission_user_mailer_use) + self.grant_permission(permission=permission_mailing_link) + self.grant_permission(permission=permission_user_mailer_use) self._request_document_link_send() @@ -83,8 +83,8 @@ class MailerViewsTestCase(MailerTestMixin, GenericDocumentViewTestCase): self._create_user_mailer() self.login_user() - self.grant(permission_mailing_send_document) - self.grant(permission_user_mailer_use) + self.grant_permission(permission=permission_mailing_send_document) + self.grant_permission(permission=permission_user_mailer_use) self._request_document_send() @@ -113,7 +113,7 @@ class UserMailerViewTestCase(MailerTestMixin, GenericViewTestCase): self._create_user_mailer() self.login_user() - self.grant(permission_user_mailer_view) + self.grant_permission(permission=permission_user_mailer_view) response = self.get( 'mailer:user_mailer_list', @@ -137,7 +137,7 @@ class UserMailerViewTestCase(MailerTestMixin, GenericViewTestCase): self._create_user_mailer() self.login_user() - self.grant(permission_user_mailer_view) + self.grant_permission(permission=permission_user_mailer_view) self._request_user_mailer_delete() diff --git a/mayan/apps/metadata/tests/test_views.py b/mayan/apps/metadata/tests/test_views.py index 4b1b1ab03d..f08d6792e1 100644 --- a/mayan/apps/metadata/tests/test_views.py +++ b/mayan/apps/metadata/tests/test_views.py @@ -36,7 +36,7 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): def test_metadata_add_view_no_permission(self): self.login_user() - self.grant(permission_document_view) + self.grant_permission(permission=permission_document_view) response = self.post( 'metadata:metadata_add', args=(self.document.pk,), @@ -51,9 +51,9 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): def test_metadata_add_view_with_permission(self): self.login_user() - self.grant(permission_document_view) - self.grant(permission_metadata_document_add) - self.grant(permission_metadata_document_edit) + self.grant_permission(permission=permission_document_view) + self.grant_permission(permission=permission_metadata_document_add) + self.grant_permission(permission=permission_metadata_document_edit) response = self.post( 'metadata:metadata_add', args=(self.document.pk,), @@ -69,8 +69,8 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): self.login_user() - self.grant(permission_document_properties_edit) - self.grant(permission_metadata_document_edit) + self.grant_permission(permission=permission_document_properties_edit) + self.grant_permission(permission=permission_metadata_document_edit) document_type_2 = DocumentType.objects.create( label=TEST_DOCUMENT_TYPE_2 @@ -119,7 +119,7 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): self.assertEqual(len(self.document.metadata.all()), 1) - self.grant(permission_document_view) + self.grant_permission(permission=permission_document_view) # Test display of metadata removal form response = self.get( @@ -154,8 +154,8 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): self.assertEqual(len(self.document.metadata.all()), 1) - self.grant(permission_document_view) - self.grant(permission_metadata_document_remove) + self.grant_permission(permission=permission_document_view) + self.grant_permission(permission=permission_metadata_document_remove) # Test display of metadata removal form response = self.get( @@ -186,9 +186,9 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): def test_multiple_document_metadata_edit(self): self.login_user() - self.grant(permission_document_view) - self.grant(permission_metadata_document_add) - self.grant(permission_metadata_document_edit) + self.grant_permission(permission=permission_document_view) + self.grant_permission(permission=permission_metadata_document_add) + self.grant_permission(permission=permission_metadata_document_edit) with open(TEST_SMALL_DOCUMENT_PATH) as file_object: document_2 = self.document_type.new_document( @@ -209,9 +209,9 @@ class DocumentMetadataTestCase(GenericDocumentViewTestCase): def test_multiple_document_metadata_add(self): self.login_user() - self.grant(permission_document_view) - self.grant(permission_metadata_document_add) - self.grant(permission_metadata_document_edit) + self.grant_permission(permission=permission_document_view) + self.grant_permission(permission=permission_metadata_document_add) + self.grant_permission(permission=permission_metadata_document_edit) with open(TEST_SMALL_DOCUMENT_PATH) as file_object: document_2 = self.document_type.new_document( diff --git a/mayan/apps/ocr/tests/test_views.py b/mayan/apps/ocr/tests/test_views.py index f8b258584c..0c67c5041d 100644 --- a/mayan/apps/ocr/tests/test_views.py +++ b/mayan/apps/ocr/tests/test_views.py @@ -30,7 +30,7 @@ class OCRViewsTestCase(GenericDocumentViewTestCase): self.assertEqual(response.status_code, 403) def test_document_content_view_with_permission(self): - self.grant(permission_ocr_content_view) + self.grant_permission(permission=permission_ocr_content_view) response = self._document_content_view() @@ -48,7 +48,7 @@ class OCRViewsTestCase(GenericDocumentViewTestCase): def test_document_download_view_with_permission(self): self.expected_content_type = 'application/octet-stream; charset=utf-8' - self.grant(permission=permission_ocr_content_view) + self.grant_permission(permission=permission_ocr_content_view) response = self.get( 'ocr:document_ocr_download', args=(self.document.pk,) ) diff --git a/mayan/apps/smart_settings/tests/test_view_permissions.py b/mayan/apps/smart_settings/tests/test_view_permissions.py index 010f32097c..7afca43d83 100644 --- a/mayan/apps/smart_settings/tests/test_view_permissions.py +++ b/mayan/apps/smart_settings/tests/test_view_permissions.py @@ -21,7 +21,7 @@ class SmartSettingViewPermissionsTestCase(GenericViewTestCase): self.assertEqual(response.status_code, 403) def test_view_access_permitted(self): - self.grant(permission_settings_view) + self.grant_permission(permission=permission_settings_view) response = self.get('settings:namespace_list') self.assertEqual(response.status_code, 200) diff --git a/mayan/apps/sources/tests/test_views.py b/mayan/apps/sources/tests/test_views.py index 41d5131a16..081d79511a 100644 --- a/mayan/apps/sources/tests/test_views.py +++ b/mayan/apps/sources/tests/test_views.py @@ -12,7 +12,7 @@ from common.utils import fs_cleanup, mkdtemp from documents.models import Document, DocumentType from documents.permissions import permission_document_create from documents.tests import ( - TEST_DOCUMENT_DESCRIPTION, TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE, + TEST_DOCUMENT_DESCRIPTION, TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_CHECKSUM, TEST_SMALL_DOCUMENT_PATH ) from documents.tests.test_views import GenericDocumentViewTestCase @@ -60,7 +60,7 @@ class DocumentUploadTestCase(GenericDocumentViewTestCase): def test_upload_wizard_with_permission(self): self.login_user() - self.grant(permission_document_create) + self.grant_permission(permission=permission_document_create) response = self._request_upload_wizard() @@ -85,7 +85,7 @@ class DocumentUploadTestCase(GenericDocumentViewTestCase): ) acl.permissions.add(permission_document_create.stored_permission) - with open(TEST_DOCUMENT_PATH) as file_object: + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: response = self.post( 'sources:upload_interactive', args=(self.source.pk,), data={ 'source-file': file_object, @@ -227,7 +227,7 @@ class StagingFolderTestCase(GenericViewTestCase): def test_staging_folder_delete_with_permission(self): self.login_user() - self.grant(permission_staging_file_delete) + self.grant_permission(permission=permission_staging_file_delete) staging_folder = StagingFolderSource.objects.create( label=TEST_SOURCE_LABEL, @@ -262,7 +262,7 @@ class SourcesTestCase(GenericDocumentViewTestCase): self.login_user() - self.grant(permission_sources_setup_view) + self.grant_permission(permission=permission_sources_setup_view) response = self.get(viewname='sources:setup_source_list') @@ -280,8 +280,8 @@ class SourcesTestCase(GenericDocumentViewTestCase): def test_source_create_view_with_permission(self): self.login_user() - self.grant(permission_sources_setup_create) - self.grant(permission_sources_setup_view) + self.grant_permission(permission=permission_sources_setup_create) + self.grant_permission(permission=permission_sources_setup_view) response = self.post( args=(SOURCE_CHOICE_WEB_FORM,), follow=True, @@ -301,7 +301,7 @@ class SourcesTestCase(GenericDocumentViewTestCase): def test_source_create_view_no_permission(self): self.login_user() - self.grant(permission_sources_setup_view) + self.grant_permission(permission=permission_sources_setup_view) response = self.post( args=(SOURCE_CHOICE_WEB_FORM,), follow=True, @@ -319,8 +319,8 @@ class SourcesTestCase(GenericDocumentViewTestCase): self.login_user() - self.grant(permission_sources_setup_delete) - self.grant(permission_sources_setup_view) + self.grant_permission(permission=permission_sources_setup_delete) + self.grant_permission(permission=permission_sources_setup_view) response = self.post( args=(self.source.pk,), follow=True, @@ -335,7 +335,7 @@ class SourcesTestCase(GenericDocumentViewTestCase): self.login_user() - self.grant(permission_sources_setup_view) + self.grant_permission(permission=permission_sources_setup_view) response = self.post( args=(self.source.pk,), follow=True, diff --git a/mayan/apps/tags/tests/test_views.py b/mayan/apps/tags/tests/test_views.py index 03175b5704..6b4301694a 100644 --- a/mayan/apps/tags/tests/test_views.py +++ b/mayan/apps/tags/tests/test_views.py @@ -50,7 +50,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.tag.delete() self.assertEqual(Tag.objects.count(), 0) - self.grant(permission_tag_create) + self.grant_permission(permission=permission_tag_create) response = self.post( 'tags:tag_create', data={ @@ -83,7 +83,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.assertEqual(Tag.objects.count(), 1) - self.grant(permission_tag_delete) + self.grant_permission(permission=permission_tag_delete) response = self.post( 'tags:tag_delete', args=(self.tag.pk,), follow=True @@ -110,7 +110,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.assertEqual(Tag.objects.count(), 1) - self.grant(permission_tag_delete) + self.grant_permission(permission=permission_tag_delete) response = self.post( 'tags:tag_multiple_delete', data={'id_list': self.tag.pk}, @@ -138,7 +138,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): def test_tag_edit_view_with_permissions(self): self.login_user() - self.grant(permission_tag_edit) + self.grant_permission(permission=permission_tag_edit) response = self.post( 'tags:tag_edit', args=(self.tag.pk,), data={ @@ -163,8 +163,8 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.tag.documents.add(self.document) - self.grant(permission_tag_view) - self.grant(permission_document_view) + self.grant_permission(permission=permission_tag_view) + self.grant_permission(permission=permission_document_view) response = self.get('documents:document_list') @@ -175,7 +175,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.assertEqual(self.document.tags.count(), 0) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:tag_attach', args=(self.document.pk,), data={ @@ -194,10 +194,10 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.assertEqual(self.document.tags.count(), 0) - self.grant(permission_tag_attach) + self.grant_permission(permission=permission_tag_attach) # permission_tag_view is needed because the form filters the # choices - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:tag_attach', args=(self.document.pk,), data={ @@ -216,7 +216,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.login_user() self.assertEqual(self.document.tags.count(), 0) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:multiple_documents_tag_attach', data={ @@ -233,11 +233,11 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.assertEqual(self.document.tags.count(), 0) - self.grant(permission_tag_attach) + self.grant_permission(permission=permission_tag_attach) # permission_tag_view is needed because the form filters the # choices - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:multiple_documents_tag_attach', data={ @@ -258,7 +258,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.document.tags.add(self.tag) self.assertQuerysetEqual(self.document.tags.all(), (repr(self.tag),)) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:single_document_multiple_tag_remove', @@ -277,8 +277,8 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.document.tags.add(self.tag) self.assertQuerysetEqual(self.document.tags.all(), (repr(self.tag),)) - self.grant(permission_tag_remove) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_remove) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:single_document_multiple_tag_remove', @@ -297,7 +297,7 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.document.tags.add(self.tag) self.assertQuerysetEqual(self.document.tags.all(), (repr(self.tag),)) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:multiple_documents_selection_tag_remove', @@ -316,8 +316,8 @@ class TagViewTestCase(GenericDocumentViewTestCase): self.document.tags.add(self.tag) self.assertQuerysetEqual(self.document.tags.all(), (repr(self.tag),)) - self.grant(permission_tag_remove) - self.grant(permission_tag_view) + self.grant_permission(permission=permission_tag_remove) + self.grant_permission(permission=permission_tag_view) response = self.post( 'tags:multiple_documents_selection_tag_remove', diff --git a/mayan/apps/user_management/tests/test_views.py b/mayan/apps/user_management/tests/test_views.py index d32f751fb2..3ff80d9008 100644 --- a/mayan/apps/user_management/tests/test_views.py +++ b/mayan/apps/user_management/tests/test_views.py @@ -35,7 +35,7 @@ class UserManagementViewTestCase(GenericViewTestCase): ) def test_user_set_password_view_no_permissions(self): - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_view) response = self._set_password(password=TEST_USER_PASSWORD_EDITED) @@ -53,8 +53,8 @@ class UserManagementViewTestCase(GenericViewTestCase): self.assertEqual(response.status_code, 302) def test_user_set_password_view_with_permissions(self): - self.grant(permission=permission_user_edit) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_edit) + self.grant_permission(permission=permission_user_view) response = self._set_password(password=TEST_USER_PASSWORD_EDITED) @@ -78,7 +78,7 @@ class UserManagementViewTestCase(GenericViewTestCase): ) def test_user_multiple_set_password_view_no_permissions(self): - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_view) response = self._multiple_user_set_password( password=TEST_USER_PASSWORD_EDITED @@ -98,8 +98,8 @@ class UserManagementViewTestCase(GenericViewTestCase): self.assertEqual(response.status_code, 302) def test_user_multiple_set_password_view_with_permissions(self): - self.grant(permission=permission_user_edit) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_edit) + self.grant_permission(permission=permission_user_view) response = self._multiple_user_set_password( password=TEST_USER_PASSWORD_EDITED @@ -120,7 +120,7 @@ class UserManagementViewTestCase(GenericViewTestCase): username=TEST_USER_TO_DELETE_USERNAME ) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_view) response = self.post( 'user_management:user_delete', args=(user.pk,) @@ -134,8 +134,8 @@ class UserManagementViewTestCase(GenericViewTestCase): username=TEST_USER_TO_DELETE_USERNAME ) - self.grant(permission=permission_user_delete) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_delete) + self.grant_permission(permission=permission_user_view) response = self.post( 'user_management:user_delete', args=(user.pk,), follow=True @@ -149,7 +149,7 @@ class UserManagementViewTestCase(GenericViewTestCase): username=TEST_USER_TO_DELETE_USERNAME ) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_view) response = self.post( 'user_management:user_multiple_delete', data={ @@ -165,8 +165,8 @@ class UserManagementViewTestCase(GenericViewTestCase): username=TEST_USER_TO_DELETE_USERNAME ) - self.grant(permission=permission_user_delete) - self.grant(permission=permission_user_view) + self.grant_permission(permission=permission_user_delete) + self.grant_permission(permission=permission_user_view) response = self.post( 'user_management:user_multiple_delete', data={