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 <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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'])
|
||||
|
||||
Reference in New Issue
Block a user