From fc81d4315e4285f2e29059e9137391db40ad9c56 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Wed, 21 Oct 2015 00:50:04 -0400 Subject: [PATCH] Process multiple documents in the tag attach views as querysets not as list of objects. AccessControlList.objects.filter_by_access only supports querysets now. Closes GL issue #228. --- mayan/apps/tags/tests/test_views.py | 109 ++++++++++++++++++++++++++-- mayan/apps/tags/views.py | 25 ++++--- 2 files changed, 115 insertions(+), 19 deletions(-) diff --git a/mayan/apps/tags/tests/test_views.py b/mayan/apps/tags/tests/test_views.py index b841cbedb2..038de6431d 100644 --- a/mayan/apps/tags/tests/test_views.py +++ b/mayan/apps/tags/tests/test_views.py @@ -19,7 +19,7 @@ from user_management.tests import ( ) from ..models import Tag -from ..permissions import permission_tag_view +from ..permissions import permission_tag_attach, permission_tag_view from .literals import TEST_TAG_COLOR, TEST_TAG_LABEL @@ -36,6 +36,8 @@ class TagViewTestCase(TestCase): ) self.group = Group.objects.create(name=TEST_GROUP) self.role = Role.objects.create(label=TEST_ROLE_LABEL) + self.group.user_set.add(self.user) + self.role.groups.add(self.group) Permission.invalidate_cache() self.document_type = DocumentType.objects.create( @@ -54,11 +56,6 @@ class TagViewTestCase(TestCase): 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) - def tearDown(self): self.admin_user.delete() self.document_type @@ -74,9 +71,9 @@ class TagViewTestCase(TestCase): self.assertTrue(logged_in) self.assertTrue(self.user.is_authenticated()) + self.tag.documents.add(self.document) response = self.client.get(reverse('documents:document_list')) self.assertNotContains(response, text=TEST_TAG_LABEL, status_code=200) - # TODO: Verify this test's logic def test_document_tags_widget_with_permissions(self): logged_in = self.client.login( @@ -85,9 +82,107 @@ class TagViewTestCase(TestCase): self.assertTrue(logged_in) self.assertTrue(self.user.is_authenticated()) + self.tag.documents.add(self.document) self.role.permissions.add(permission_tag_view.stored_permission) + self.role.permissions.add(permission_document_view.stored_permission) response = self.client.get(reverse('documents:document_list')) + self.assertContains( response, text=TEST_TAG_LABEL.replace(' ', ' '), status_code=200 ) + + def test_document_attach_tag_user_view(self): + logged_in = self.client.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + self.assertTrue(logged_in) + self.assertTrue(self.user.is_authenticated()) + + self.assertEqual( + self.document.tags.count(), 0 + ) + + response = self.client.post( + reverse( + 'tags:tag_attach', + args=(self.document.pk,) + ), data={ + 'tag': self.tag.pk, + 'user': self.user.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + self.document.tags.count(), 0 + ) + + self.role.permissions.add(permission_tag_attach.stored_permission) + # permission_tag_view is needed because the form filters the + # choices + self.role.permissions.add(permission_tag_view.stored_permission) + + response = self.client.post( + reverse( + 'tags:tag_attach', + args=(self.document.pk,) + ), data={ + 'tag': self.tag.pk, + 'user': self.user.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertQuerysetEqual( + self.document.tags.all(), (repr(self.tag),) + ) + + def test_document_multiple_attach_tag_user_view(self): + logged_in = self.client.login( + username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD + ) + self.assertTrue(logged_in) + self.assertTrue(self.user.is_authenticated()) + + self.assertEqual( + self.document.tags.count(), 0 + ) + + response = self.client.post( + reverse( + 'tags:multiple_documents_tag_attach', + ), data={ + 'id_list': self.document.pk, 'tag': self.tag.pk, + 'user': self.user.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + self.document.tags.count(), 0 + ) + + self.role.permissions.add(permission_tag_attach.stored_permission) + + # permission_tag_view is needed because the form filters the + # choices + self.role.permissions.add(permission_tag_view.stored_permission) + + response = self.client.post( + reverse( + 'tags:multiple_documents_tag_attach', + ), data={ + 'id_list': self.document.pk, 'tag': self.tag.pk, + 'user': self.user.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertQuerysetEqual( + self.document.tags.all(), (repr(self.tag),) + ) diff --git a/mayan/apps/tags/views.py b/mayan/apps/tags/views.py index a58bce3b67..b463fad71a 100644 --- a/mayan/apps/tags/views.py +++ b/mayan/apps/tags/views.py @@ -40,13 +40,12 @@ class TagCreateView(SingleObjectCreateView): def tag_attach(request, document_id=None, document_id_list=None): if document_id: - documents = [get_object_or_404(Document, pk=document_id)] + queryset = Document.objects.filter(pk=document_id) post_action_redirect = reverse('tags:tag_list') elif document_id_list: - documents = [ - get_object_or_404(Document, pk=document_id) for document_id in document_id_list.split(',') - ] - else: + queryset = Document.objects.filter(pk__in=document_id_list) + + if not queryset: messages.error(request, _('Must provide at least one document.')) return HttpResponseRedirect( request.META.get( @@ -57,8 +56,8 @@ def tag_attach(request, document_id=None, document_id_list=None): try: Permission.check_permissions(request.user, (permission_tag_attach,)) except PermissionDenied: - documents = AccessControlList.objects.filter_by_access( - permission_tag_attach, request.user, documents + queryset = AccessControlList.objects.filter_by_access( + permission_tag_attach, request.user, queryset ) post_action_redirect = None @@ -73,7 +72,7 @@ def tag_attach(request, document_id=None, document_id_list=None): form = TagListForm(request.POST, user=request.user) if form.is_valid(): tag = form.cleaned_data['tag'] - for document in documents: + for document in queryset: if tag in document.attached_tags().all(): messages.warning( request, _( @@ -103,12 +102,12 @@ def tag_attach(request, document_id=None, document_id_list=None): 'title': ungettext( 'Attach tag to document', 'Attach tag to documents', - len(documents) + queryset.count() ) } - if len(documents) == 1: - context['object'] = documents[0] + if queryset.count() == 1: + context['object'] = queryset.first() return render_to_response( 'appearance/generic_form.html', context, @@ -118,7 +117,9 @@ def tag_attach(request, document_id=None, document_id_list=None): def tag_multiple_attach(request): return tag_attach( - request, document_id_list=request.GET.get('id_list', []) + request, document_id_list=request.GET.get( + 'id_list', request.POST.get('id_list', '') + ).split(',') )