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 b91f7f685a
commit 105eab0740
9 changed files with 118 additions and 41 deletions

View File

@@ -1,3 +1,9 @@
3.0 (2017-XX-XX)
================
- Metadat widget appearance changes
- Content windows appearance changes
- Add new document's version list view permission
2.2 (2017-04-26)
================
- Remove the installation app (GitLab #301).

View File

@@ -12,6 +12,7 @@ Other changes
-------------
- Metadat widget appearance changes
- Content windows appearance changes
- Add new document's version list view permission
Removals
--------
@@ -71,5 +72,7 @@ Bugs fixed or issues closed
===========================
* `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.
.. _PyPI: https://pypi.python.org/pypi/mayan-edms/

View File

@@ -24,7 +24,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 (
@@ -500,7 +500,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

@@ -20,12 +20,14 @@ from ..permissions import (
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_view, permission_empty_trash,
permission_document_version_view
)
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
)
@@ -432,39 +434,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=(
@@ -644,6 +613,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()
)