Make document tags widget permissions aware, closes GL #182.
This commit is contained in:
@@ -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(
|
||||
|
||||
6
mayan/apps/tags/tests/literals.py
Normal file
6
mayan/apps/tags/tests/literals.py
Normal file
@@ -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'
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
78
mayan/apps/tags/tests/test_views.py
Normal file
78
mayan/apps/tags/tests/test_views.py
Normal file
@@ -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
|
||||
)
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user