From 9fbc8647b8e1b8bf26f6b899b1397ce0d12f9e76 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Tue, 20 Oct 2015 20:03:54 -0400 Subject: [PATCH] Fix document list generation for the document's type change views. Move type change event and recent document addition to the models. Add view tests for the document's type change views. --- mayan/apps/authentication/tests/literals.py | 6 +- mayan/apps/documents/models.py | 9 +- mayan/apps/documents/tests/test_views.py | 132 +++++++++++++++++++- mayan/apps/documents/views.py | 49 +++++--- 4 files changed, 171 insertions(+), 25 deletions(-) diff --git a/mayan/apps/authentication/tests/literals.py b/mayan/apps/authentication/tests/literals.py index a24465f647..afebd42a48 100644 --- a/mayan/apps/authentication/tests/literals.py +++ b/mayan/apps/authentication/tests/literals.py @@ -1,6 +1,10 @@ from __future__ import unicode_literals -TEST_ADMIN_EMAIL = 'admin@admin.com' +TEST_ADMIN_EMAIL = 'admin@example.com' TEST_ADMIN_PASSWORD = 'test_admin_password' TEST_ADMIN_USERNAME = 'test_admin' TEST_EMAIL_AUTHENTICATION_BACKEND = 'authentication.auth.email_auth_backend.EmailAuthBackend' + +TEST_USER_EMAIL = 'user@example.com' +TEST_USER_PASSWORD = 'test_user_password' +TEST_USER_USERNAME = 'test_user' diff --git a/mayan/apps/documents/models.py b/mayan/apps/documents/models.py index b41afb137f..3006bd2ee9 100644 --- a/mayan/apps/documents/models.py +++ b/mayan/apps/documents/models.py @@ -28,7 +28,8 @@ from permissions import Permission from .events import ( event_document_create, event_document_new_version, - event_document_properties_edit, event_document_version_revert + event_document_properties_edit, event_document_type_change, + event_document_version_revert ) from .literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from .managers import ( @@ -268,7 +269,7 @@ class Document(models.Model): def save_to_file(self, *args, **kwargs): return self.latest_version.save_to_file(*args, **kwargs) - def set_document_type(self, document_type, force=False): + def set_document_type(self, document_type, force=False, _user=None): has_changed = self.document_type != document_type self.document_type = document_type @@ -278,6 +279,10 @@ class Document(models.Model): sender=self.__class__, instance=self ) + event_document_type_change.commit(actor=_user, target=self) + if _user: + self.add_as_recent_document_for_user(user=_user) + @property def size(self): return self.latest_version.size diff --git a/mayan/apps/documents/tests/test_views.py b/mayan/apps/documents/tests/test_views.py index 8f71612e36..59d12511d2 100644 --- a/mayan/apps/documents/tests/test_views.py +++ b/mayan/apps/documents/tests/test_views.py @@ -2,14 +2,25 @@ from __future__ import unicode_literals -from django.contrib.auth.models import User +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, override_settings +from authentication.tests.literals import ( + TEST_USER_EMAIL, TEST_USER_PASSWORD, TEST_USER_USERNAME +) +from permissions.classes import Permission +from permissions.models import Role +from permissions.tests.literals import ( + TEST_GROUP, TEST_ROLE_LABEL, TEST_USER_USERNAME +) + from ..literals import DEFAULT_DELETE_PERIOD, DEFAULT_DELETE_TIME_UNIT from ..models import DeletedDocument, Document, DocumentType +from ..permissions import permission_document_properties_edit from .literals import ( TEST_ADMIN_PASSWORD, TEST_ADMIN_USERNAME, TEST_ADMIN_EMAIL, @@ -17,6 +28,7 @@ from .literals import ( ) TEST_DOCUMENT_TYPE_EDITED_LABEL = 'test document type edited label' +TEST_DOCUMENT_TYPE_2_LABEL = 'test document type 2 label' @override_settings(OCR_AUTO_OCR=False) @@ -26,7 +38,7 @@ class DocumentsViewsTestCase(TestCase): label=TEST_DOCUMENT_TYPE ) - self.admin_user = User.objects.create_superuser( + self.admin_user = get_user_model().objects.create_superuser( username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, password=TEST_ADMIN_PASSWORD ) @@ -38,14 +50,27 @@ class DocumentsViewsTestCase(TestCase): self.assertTrue(logged_in) self.assertTrue(self.admin_user.is_authenticated()) + self.user = get_user_model().objects.create_user( + username=TEST_USER_USERNAME, email=TEST_USER_EMAIL, + password=TEST_USER_PASSWORD + ) + self.group = Group.objects.create(name=TEST_GROUP) + self.role = Role.objects.create(label=TEST_ROLE_LABEL) + Permission.invalidate_cache() + self.group.user_set.add(self.user) + self.role.groups.add(self.group) + with open(TEST_SMALL_DOCUMENT_PATH) as file_object: self.document = self.document_type.new_document( file_object=File(file_object), label='mayan_11_1.pdf' ) def tearDown(self): - self.document_type.delete() self.admin_user.delete() + self.document_type.delete() + self.group.delete() + self.role.delete() + self.user.delete() def test_restoring_documents(self): self.assertEqual(Document.objects.count(), 1) @@ -93,11 +118,110 @@ class DocumentsViewsTestCase(TestCase): response, 'roperties for document', status_code=200 ) + def test_document_document_type_change_view(self): + self.assertEqual(Document.objects.count(), 1) + self.assertEqual( + Document.objects.first().document_type, self.document_type + ) + + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_2_LABEL + ) + + response = self.client.post( + reverse( + 'documents:document_document_type_edit', + args=(self.document.pk,) + ), data={'document_type': document_type.pk}, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + Document.objects.first().document_type, document_type + ) + + def test_document_multiple_document_type_change_view(self): + self.assertEqual(Document.objects.count(), 1) + self.assertEqual( + Document.objects.first().document_type, self.document_type + ) + + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_2_LABEL + ) + + response = self.client.post( + reverse( + 'documents:document_multiple_document_type_edit', + ), data={ + 'id_list': self.document.pk, 'document_type': document_type.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + Document.objects.first().document_type, document_type + ) + + def test_document_multiple_document_type_change_user_view(self): + self.client.logout() + 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(Document.objects.count(), 1) + self.assertEqual( + Document.objects.first().document_type, self.document_type + ) + + document_type = DocumentType.objects.create( + label=TEST_DOCUMENT_TYPE_2_LABEL + ) + + response = self.client.post( + reverse( + 'documents:document_multiple_document_type_edit', + ), data={ + 'id_list': self.document.pk, 'document_type': document_type.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + # Fails to change the document type + self.assertEqual( + Document.objects.first().document_type, self.document_type + ) + + # Create ACL for a positive test result + + self.role.permissions.add( + permission_document_properties_edit.stored_permission + ) + + response = self.client.post( + reverse( + 'documents:document_multiple_document_type_edit', + ), data={ + 'id_list': self.document.pk, 'document_type': document_type.pk + }, follow=True + ) + + self.assertEqual(response.status_code, 200) + + self.assertEqual( + Document.objects.first().document_type, document_type + ) + @override_settings(OCR_AUTO_OCR=False) class DocumentTypeViewsTestCase(TestCase): def setUp(self): - self.admin_user = User.objects.create_superuser( + self.admin_user = get_user_model().objects.create_superuser( username=TEST_ADMIN_USERNAME, email=TEST_ADMIN_EMAIL, password=TEST_ADMIN_PASSWORD ) diff --git a/mayan/apps/documents/views.py b/mayan/apps/documents/views.py index 67678cfdb0..ddbc9382d3 100644 --- a/mayan/apps/documents/views.py +++ b/mayan/apps/documents/views.py @@ -624,21 +624,24 @@ def document_document_type_edit(request, document_id=None, document_id_list=None post_action_redirect = None if document_id: - documents = [get_object_or_404(Document, pk=document_id)] + queryset = Document.objects.filter(pk=document_id) post_action_redirect = reverse('documents:document_list_recent') 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('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))) + return HttpResponseRedirect( + request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)) + ) try: Permission.check_permissions( request.user, (permission_document_properties_edit,) ) except PermissionDenied: - documents = AccessControlList.objects.filter_by_access( - permission_document_properties_edit, request.user, documents + queryset = AccessControlList.objects.filter_by_access( + permission_document_properties_edit, request.user, queryset ) previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)))) @@ -648,15 +651,21 @@ def document_document_type_edit(request, document_id=None, document_id_list=None form = DocumentTypeSelectForm(request.POST) if form.is_valid(): - for document in documents: - document.set_document_type(form.cleaned_data['document_type']) - event_document_type_change.commit(actor=request.user, target=document) - document.add_as_recent_document_for_user(request.user) + for instance in queryset: + instance.set_document_type( + form.cleaned_data['document_type'], _user=request.user + ) - messages.success(request, _('Document type changed successfully.')) + messages.success( + request, _( + 'Document type for "%s" changed successfully.' + ) % instance + ) return HttpResponseRedirect(next) else: - form = DocumentTypeSelectForm(initial={'document_type': documents[0].document_type}) + form = DocumentTypeSelectForm( + initial={'document_type': queryset.first().document_type} + ) context = { 'form': form, @@ -666,20 +675,24 @@ def document_document_type_edit(request, document_id=None, document_id_list=None 'title': ungettext( 'Change the type of the selected document.', 'Change the type of the selected 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, - context_instance=RequestContext(request)) + return render_to_response( + 'appearance/generic_form.html', context, + context_instance=RequestContext(request) + ) def document_multiple_document_type_edit(request): return document_document_type_edit( - request, document_id_list=request.GET.get('id_list', []) + request, document_id_list=request.GET.get( + 'id_list', request.POST.get('id_list', '') + ).split(',') )