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.

This commit is contained in:
Roberto Rosario
2015-10-20 20:03:54 -04:00
parent ebfd37ebf5
commit 9fbc8647b8
4 changed files with 171 additions and 25 deletions

View File

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

View File

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

View File

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

View File

@@ -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(',')
)