Make document tags widget permissions aware, closes GL #182.

This commit is contained in:
Roberto Rosario
2015-10-08 02:58:11 -04:00
parent 5da248375f
commit f6c4b153c7
6 changed files with 117 additions and 18 deletions

View File

@@ -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(

View 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'

View File

@@ -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):

View File

@@ -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)

View 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
)

View File

@@ -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))