diff --git a/mayan/apps/tags/apps.py b/mayan/apps/tags/apps.py index 7a95c81e33..6830d952ff 100644 --- a/mayan/apps/tags/apps.py +++ b/mayan/apps/tags/apps.py @@ -25,7 +25,7 @@ from .permissions import ( permission_tag_attach, permission_tag_delete, permission_tag_edit, permission_tag_remove, permission_tag_view ) -from .widgets import widget_inline_tags, widget_single_tag +from .widgets import widget_document_tags, widget_single_tag class TagsApp(MayanAppConfig): @@ -64,7 +64,9 @@ class TagsApp(MayanAppConfig): SourceColumn( source=Document, label=_('Tags'), - func=lambda context: widget_inline_tags(context['object']) + func=lambda context: widget_document_tags( + document=context['object'], user=context['request'].user + ) ) SourceColumn( diff --git a/mayan/apps/tags/tests/literals.py b/mayan/apps/tags/tests/literals.py new file mode 100644 index 0000000000..aac298922d --- /dev/null +++ b/mayan/apps/tags/tests/literals.py @@ -0,0 +1,6 @@ +from __future__ import unicode_literals + +TEST_TAG_LABEL = 'test tag' +TEST_TAG_LABEL_ALTERNATE = 'test tag alternate' +TEST_TAG_COLOR = '#001122' +TEST_TAG_COLOR_ALTERNATE = '#221100' diff --git a/mayan/apps/tags/tests/test_api.py b/mayan/apps/tags/tests/test_api.py index 0e21e12fd0..bbbe399b63 100644 --- a/mayan/apps/tags/tests/test_api.py +++ b/mayan/apps/tags/tests/test_api.py @@ -10,15 +10,15 @@ from rest_framework.test import APITestCase from documents.models import DocumentType from documents.tests import ( TEST_ADMIN_EMAIL, TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME, - TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH, + TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH ) from ..models import Tag -TEST_TAG_LABEL = 'test tag' -TEST_TAG_LABEL_ALTERNATE = 'test tag alternate' -TEST_TAG_COLOR = '#001122' -TEST_TAG_COLOR_ALTERNATE = '#221100' +from .literals import ( + TEST_TAG_COLOR, TEST_TAG_COLOR_ALTERNATE, TEST_TAG_LABEL, + TEST_TAG_LABEL_ALTERNATE +) class TagAPITestCase(APITestCase): diff --git a/mayan/apps/tags/tests/test_models.py b/mayan/apps/tags/tests/test_models.py index 6f0109259a..601e19dd39 100644 --- a/mayan/apps/tags/tests/test_models.py +++ b/mayan/apps/tags/tests/test_models.py @@ -4,11 +4,11 @@ from django.core.files.base import File from django.test import TestCase, override_settings from documents.models import DocumentType -from documents.tests import TEST_DOCUMENT_PATH, TEST_DOCUMENT_TYPE +from documents.tests import TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH from ..models import Tag -TAG_COLOR = '#FF0000' +from .literals import TEST_TAG_COLOR, TEST_TAG_LABEL @override_settings(OCR_AUTO_OCR=False) @@ -18,7 +18,7 @@ class TagTestCase(TestCase): 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(file_object) ) @@ -28,14 +28,12 @@ class TagTestCase(TestCase): self.document_type.delete() def runTest(self): - tag = Tag(label='test', color=TAG_COLOR) - tag.save() - self.assertEqual(tag.label, 'test') + tag = Tag.objects.create(color=TEST_TAG_COLOR, label=TEST_TAG_LABEL) + self.assertEqual(tag.label, TEST_TAG_LABEL) self.assertEqual(tag.get_color_code(), 'red') def test_addition_and_deletion_of_documents(self): - tag = Tag(label='test', color=TAG_COLOR) - tag.save() + tag = Tag.objects.create(color=TEST_TAG_COLOR, label=TEST_TAG_LABEL) tag.documents.add(self.document) diff --git a/mayan/apps/tags/tests/test_views.py b/mayan/apps/tags/tests/test_views.py new file mode 100644 index 0000000000..46d6446dbb --- /dev/null +++ b/mayan/apps/tags/tests/test_views.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import, unicode_literals + +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from django.core.files import File +from django.core.urlresolvers import reverse +from django.test.client import Client +from django.test import TestCase + +from documents.models import DocumentType +from documents.permissions import permission_document_view +from documents.tests import TEST_DOCUMENT_TYPE, TEST_SMALL_DOCUMENT_PATH +from permissions import Permission +from permissions.models import Role +from permissions.tests.literals import ( + TEST_GROUP, TEST_ROLE, TEST_USER_PASSWORD, TEST_USER_USERNAME +) + +from ..models import Tag +from ..permissions import permission_tag_view + +from .literals import TEST_TAG_COLOR, TEST_TAG_LABEL + + +class TagViewTestCase(TestCase): + def setUp(self): + self.user = get_user_model().objects.create_user( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + self.group = Group.objects.create(name=TEST_GROUP) + self.role = Role.objects.create(label=TEST_ROLE) + Permission.invalidate_cache() + + self.document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE + ) + + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: + self.document = self.document_type.new_document( + file_object=File(file_object) + ) + + self.client = Client() + # Login the admin user + logged_in = self.client.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + self.assertTrue(logged_in) + self.assertTrue(self.user.is_authenticated()) + + self.tag = Tag.objects.create( + color=TEST_TAG_COLOR, label=TEST_TAG_LABEL + ) + + self.tag.documents.add(self.document) + + self.group.user_set.add(self.user) + self.role.groups.add(self.group) + self.role.permissions.add(permission_document_view.stored_permission) + + def tearDown(self): + self.group.delete() + self.role.delete() + self.tag.delete() + self.user.delete() + self.document_type + + def test_document_tags_widget_no_permissions(self): + response = self.client.get(reverse('documents:document_list')) + self.assertNotContains(response, text=TEST_TAG_LABEL, status_code=200) + + def test_document_tags_widget_with_permissions(self): + self.role.permissions.add(permission_tag_view.stored_permission) + response = self.client.get(reverse('documents:document_list')) + self.assertContains( + response, text=TEST_TAG_LABEL.replace(' ', ' '), + status_code=200 + ) diff --git a/mayan/apps/tags/widgets.py b/mayan/apps/tags/widgets.py index 1a26e34914..ccd104b102 100644 --- a/mayan/apps/tags/widgets.py +++ b/mayan/apps/tags/widgets.py @@ -1,16 +1,31 @@ -from __future__ import unicode_literals +from __future__ import absolute_import, unicode_literals +from django.core.exceptions import PermissionDenied from django.utils.html import escape from django.utils.safestring import mark_safe +from acls.models import AccessControlList +from permissions import Permission -def widget_inline_tags(document): +from .permissions import permission_tag_view + + +def widget_document_tags(document, user): """ A tag widget that displays the tags for the given document """ tags_template = [] - for tag in document.attached_tags().all(): + tags = document.attached_tags().all() + + try: + Permission.check_permissions(user, (permission_tag_view,)) + except PermissionDenied: + tags = AccessControlList.objects.filter_by_access( + permission_tag_view, user, tags + ) + + for tag in tags: tags_template.append(widget_single_tag(tag)) return mark_safe(''.join(tags_template))