diff --git a/HISTORY.rst b/HISTORY.rst index c845b3a87f..b2e64f6692 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -191,6 +191,15 @@ - Move the file patching code from the Dependency class to a generalized utility of the storages app. - Add book link to the documentation. +- Make the statistics slug field unique. +- Self-heal statistics results model when multiple + results are created using the same slug value. + Forum topic 1404. +- Update mayan_statistics migration 0002 to rename + duplicate slugs. +- Fix reverse inheritance permissions. +- Remove index create permission as an ACL permission + for indexes. 3.2.10 (2019-11-19) =================== diff --git a/mayan/apps/acls/classes.py b/mayan/apps/acls/classes.py index 17484c3178..898c0f8cfe 100644 --- a/mayan/apps/acls/classes.py +++ b/mayan/apps/acls/classes.py @@ -6,12 +6,15 @@ import logging from django.apps import apps from django.utils.encoding import force_text +from mayan.apps.common.utils import get_related_field + logger = logging.getLogger(__name__) class ModelPermission(object): _functions = {} _inheritances = {} + _inheritances_reverse = {} _manager_names = {} _registry = {} @@ -52,7 +55,14 @@ class ModelPermission(object): return results else: - return cls._registry.get(klass, ()) + # Return the permissions for the klass and the models that + # inherit from it. + result = [] + result.extend(cls._registry.get(klass, ())) + for model in cls._inheritances_reverse.get(klass, ()): + result.extend(cls._registry.get(model, ())) + + return result @classmethod def get_for_instance(cls, instance): @@ -124,6 +134,12 @@ class ModelPermission(object): @classmethod def register_inheritance(cls, model, related): + model_reverse = get_related_field( + model=model, related_field_name=related + ).related_model + cls._inheritances_reverse.setdefault(model_reverse, []) + cls._inheritances_reverse[model_reverse].append(model) + cls._inheritances[model] = related @classmethod diff --git a/mayan/apps/acls/tests/test_views.py b/mayan/apps/acls/tests/test_views.py index 72b3a7d19c..dc73247753 100644 --- a/mayan/apps/acls/tests/test_views.py +++ b/mayan/apps/acls/tests/test_views.py @@ -8,7 +8,7 @@ from ..permissions import permission_acl_edit, permission_acl_view from .mixins import ACLTestMixin -class AccessControlListViewTestCase(ACLTestMixin, GenericViewTestCase): +class AccessControlListViewTestMixin(object): def _request_test_acl_create_get_view(self): return self.get( viewname='acls:acl_create', @@ -17,6 +17,18 @@ class AccessControlListViewTestCase(ACLTestMixin, GenericViewTestCase): } ) + def _request_test_acl_create_post_view(self): + return self.post( + viewname='acls:acl_create', + kwargs=self.test_content_object_view_kwargs, data={ + 'role': self.test_role.pk + } + ) + + +class AccessControlListViewTestCase( + AccessControlListViewTestMixin, ACLTestMixin, GenericViewTestCase +): def test_acl_create_get_view_no_permission(self): self._setup_test_object() @@ -40,14 +52,6 @@ class AccessControlListViewTestCase(ACLTestMixin, GenericViewTestCase): self.assertEqual(AccessControlList.objects.count(), acl_count) - def _request_test_acl_create_post_view(self): - return self.post( - viewname='acls:acl_create', - kwargs=self.test_content_object_view_kwargs, data={ - 'role': self.test_role.pk - } - ) - def test_acl_create_view_post_no_permission(self): self._setup_test_object() diff --git a/mayan/apps/document_indexing/apps.py b/mayan/apps/document_indexing/apps.py index 93e0375b50..73234d3070 100644 --- a/mayan/apps/document_indexing/apps.py +++ b/mayan/apps/document_indexing/apps.py @@ -85,7 +85,6 @@ class DocumentIndexingApp(MayanAppConfig): ModelPermission.register( model=Index, permissions=( permission_acl_edit, permission_acl_view, - permission_document_indexing_create, permission_document_indexing_delete, permission_document_indexing_edit, permission_document_indexing_instance_view, diff --git a/mayan/apps/documents/apps.py b/mayan/apps/documents/apps.py index cb358a0c90..a39baa0e33 100644 --- a/mayan/apps/documents/apps.py +++ b/mayan/apps/documents/apps.py @@ -219,15 +219,7 @@ class DocumentsApp(MayanAppConfig): permission_document_create, permission_document_type_delete, permission_document_type_edit, permission_document_type_view, permission_acl_edit, permission_acl_view, - permission_document_delete, 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_version_view, permission_document_view, - permission_events_view, permission_transformation_create, - permission_transformation_delete, - permission_transformation_edit, permission_transformation_view, + permission_events_view, ) ) diff --git a/mayan/apps/documents/tests/test_permissions.py b/mayan/apps/documents/tests/test_permissions.py new file mode 100644 index 0000000000..be38906523 --- /dev/null +++ b/mayan/apps/documents/tests/test_permissions.py @@ -0,0 +1,38 @@ +from __future__ import unicode_literals + +from mayan.apps.acls.classes import ModelPermission +from mayan.apps.acls.permissions import permission_acl_edit +from mayan.apps.acls.tests.mixins import ACLTestMixin +from mayan.apps.common.tests import BaseTestCase + +from ..models import DocumentType +from ..permissions import permission_document_view + +from .base import GenericDocumentViewTestCase + + +class DocumentTypeACLPermissionsTestCase(BaseTestCase): + def test_document_type_permission_test(self): + result = ModelPermission.get_for_class(klass=DocumentType) + self.assertTrue(permission_document_view in result) + + +class DocumentTypeACLPermissionsViewTestCase( + ACLTestMixin, GenericDocumentViewTestCase +): + auto_upload_document = False + + def test_document_type_acl_permission_view_test(self): + self.test_object = self.test_document_type + self._create_test_acl() + self.grant_access( + obj=self.test_object, permission=permission_acl_edit + ) + + response = self.get( + viewname='acls:acl_permissions', kwargs={'pk': self.test_acl.pk} + ) + self.assertContains( + response=response, text=permission_document_view.label, + status_code=200 + )