Add new document version list view permission. GitLab issue #379

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2017-05-04 01:04:53 -04:00
parent 310d09586a
commit 16e0b0e0e7
9 changed files with 116 additions and 42 deletions

View File

@@ -15,6 +15,7 @@
- The permission to add or remove documents to cabinets now applies to documents too.
- Equalize dashboard widgets heights.
- Switch the order of the DEFAULT_AUTHENTICATION_CLASSES of DRF. GitLab #400.
- Backport document's version list view permission.
2.5.2 (2017-07-08)
==================

View File

@@ -63,6 +63,12 @@ Backward incompatible changes
Bugs fixed or issues closed
===========================
<<<<<<< HEAD:docs/releases/2.5.1.rst
* None
=======
* `GitLab issue #378 <https://gitlab.com/mayan-edms/mayan-edms/issues/378>`_ Add metadata widget changes from @Macrobb
* `GitLab issue #379 <https://gitlab.com/mayan-edms/mayan-edms/issues/379>`_ Add new document version list view permission.
>>>>>>> 105eab074... Add new document version list view permission. GitLab issue #379:docs/releases/3.0.rst
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -25,7 +25,7 @@ from .permissions import (
permission_document_restore, permission_document_trash,
permission_document_view, permission_document_type_create,
permission_document_type_delete, permission_document_type_edit,
permission_document_type_view
permission_document_type_view, permission_document_version_view
)
from .runtime import cache_storage_backend
from .serializers import (
@@ -529,7 +529,7 @@ class APIDocumentVersionsListView(generics.ListCreateAPIView):
"""
mayan_object_permissions = {
'GET': (permission_document_view,),
'GET': (permission_document_version_view,),
}
mayan_permission_attribute_check = 'document'
mayan_view_permissions = {'POST': (permission_document_new_version,)}

View File

@@ -14,7 +14,8 @@ from .permissions import (
permission_document_version_revert, permission_document_view,
permission_document_trash, permission_document_type_create,
permission_document_type_delete, permission_document_type_edit,
permission_document_type_view, permission_empty_trash
permission_document_type_view, permission_empty_trash,
permission_document_version_view
)
from .settings import setting_zoom_max_level, setting_zoom_min_level
@@ -58,7 +59,7 @@ link_document_properties = Link(
args='resolved_object.id'
)
link_document_version_list = Link(
icon='fa fa-code-fork', permissions=(permission_document_view,),
icon='fa fa-code-fork', permissions=(permission_document_version_view,),
text=_('Versions'), view='documents:document_version_list',
args='resolved_object.pk'
)

View File

@@ -40,6 +40,10 @@ permission_document_version_revert = namespace.add_permission(
name='document_version_revert',
label=_('Revert documents to a previous version')
)
permission_document_version_view = namespace.add_permission(
name='document_version_view',
label=_('View documents\' versions list')
)
permission_document_view = namespace.add_permission(
name='document_view', label=_('View documents')
)

View File

@@ -75,3 +75,4 @@ TEST_SMALL_DOCUMENT_PATH = os.path.join(
settings.BASE_DIR, 'apps', 'documents', 'tests', 'contrib',
'sample_documents', TEST_SMALL_DOCUMENT_FILENAME
)
TEST_VERSION_COMMENT = 'test version comment'

View File

@@ -213,6 +213,32 @@ class DocumentAPITestCase(BaseAPITestCase):
self.assertEqual(document.versions.first(), document.latest_version)
def test_document_version_list(self):
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
document = self.document_type.new_document(
file_object=file_object,
)
# Needed by MySQL as milliseconds value is not store in timestamp field
time.sleep(1)
with open(TEST_DOCUMENT_PATH) as file_object:
document.new_version(file_object=file_object)
self.assertEqual(document.versions.count(), 2)
last_version = document.versions.last()
response = self.client.get(
reverse(
'rest_api:document-version-list',
args=(document.pk,)
)
)
self.assertEqual(
response.data['results'][1]['checksum'], last_version.checksum
)
def test_document_download(self):
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
document = self.document_type.new_document(

View File

@@ -21,13 +21,14 @@ from ..permissions import (
permission_document_tools, permission_document_trash,
permission_document_type_create, permission_document_type_delete,
permission_document_type_edit, permission_document_type_view,
permission_document_version_revert, permission_document_view,
permission_empty_trash
permission_document_version_revert, permission_document_version_view,
permission_document_view, permission_empty_trash
)
from .literals import (
TEST_DOCUMENT_TYPE, TEST_DOCUMENT_TYPE_QUICK_LABEL,
TEST_SMALL_DOCUMENT_FILENAME, TEST_SMALL_DOCUMENT_PATH
TEST_SMALL_DOCUMENT_FILENAME, TEST_SMALL_DOCUMENT_PATH,
TEST_VERSION_COMMENT
)
@@ -434,39 +435,6 @@ class DocumentsViewsTestCase(GenericDocumentViewTestCase):
self.assertEqual(DeletedDocument.objects.count(), 0)
self.assertEqual(Document.objects.count(), 0)
def test_document_version_revert_no_permission(self):
first_version = self.document.latest_version
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
file_object=file_object
)
response = self.post(
'documents:document_version_revert', args=(first_version.pk,)
)
self.assertEqual(response.status_code, 403)
self.assertEqual(self.document.versions.count(), 2)
def test_document_version_revert_with_permission(self):
first_version = self.document.latest_version
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
file_object=file_object
)
self.grant(permission=permission_document_version_revert)
response = self.post(
'documents:document_version_revert', args=(first_version.pk,),
follow=True
)
self.assertContains(response, 'reverted', status_code=200)
self.assertEqual(self.document.versions.count(), 1)
def test_document_page_view_no_permissions(self):
response = self.get(
'documents:document_page_view', args=(
@@ -664,6 +632,73 @@ class DocumentTypeViewsTestCase(GenericDocumentViewTestCase):
self.assertEqual(self.document_type.filenames.count(), 1)
class DocumentVersionTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(DocumentVersionTestCase, self).setUp()
self.login_user()
def test_document_version_list_no_permission(self):
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
comment=TEST_VERSION_COMMENT, file_object=file_object
)
response = self.get(
'documents:document_version_list', args=(self.document.pk,)
)
self.assertEqual(response.status_code, 403)
def test_document_version_list_with_permission(self):
self.grant(permission=permission_document_version_view)
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
comment=TEST_VERSION_COMMENT, file_object=file_object
)
response = self.get(
'documents:document_version_list', args=(self.document.pk,)
)
self.assertContains(response, TEST_VERSION_COMMENT, status_code=200)
def test_document_version_revert_no_permission(self):
first_version = self.document.latest_version
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
file_object=file_object
)
response = self.post(
'documents:document_version_revert', args=(first_version.pk,)
)
self.assertEqual(response.status_code, 403)
self.assertEqual(self.document.versions.count(), 2)
def test_document_version_revert_with_permission(self):
first_version = self.document.latest_version
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
self.document.new_version(
file_object=file_object
)
self.grant(permission=permission_document_version_revert)
response = self.post(
'documents:document_version_revert', args=(first_version.pk,),
follow=True
)
self.assertContains(response, 'reverted', status_code=200)
self.assertEqual(self.document.versions.count(), 1)
class DeletedDocumentTestCase(GenericDocumentViewTestCase):
def setUp(self):
super(DeletedDocumentTestCase, self).setUp()

View File

@@ -12,7 +12,7 @@ from common.generics import ConfirmView, SingleObjectListView
from ..models import Document, DocumentVersion
from ..permissions import (
permission_document_download, permission_document_version_revert,
permission_document_view
permission_document_version_view, permission_document_view
)
from .document_views import DocumentDownloadFormView, DocumentDownloadView
@@ -23,7 +23,7 @@ logger = logging.getLogger(__name__)
class DocumentVersionListView(SingleObjectListView):
def dispatch(self, request, *args, **kwargs):
AccessControlList.objects.check_access(
permissions=permission_document_view, user=request.user,
permissions=permission_document_version_view, user=request.user,
obj=self.get_document()
)