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:
@@ -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'
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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(',')
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user