diff --git a/HISTORY.rst b/HISTORY.rst index e5cbad2385..02773763df 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -62,6 +62,8 @@ * Use FilteredSelectionForm to add a new ACLCreateForm. * Rename IndexListForm to IndexTemplateFilteredForm. * Use FilteredSelectionForm for IndexTemplateFilteredForm. +* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm. +* Improve document signatures tests. 3.1.11 (2019-04-XX) =================== diff --git a/docs/releases/3.2.rst b/docs/releases/3.2.rst index a9b8d61e79..bf6189b508 100644 --- a/docs/releases/3.2.rst +++ b/docs/releases/3.2.rst @@ -34,12 +34,20 @@ Move the development URL definitions for Rosetta and Debug toolbar to a separate URL file. Convert the single urls.py to a module to allow multiple URL files to be used. + Settings ^^^^^^^^ New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is 65535. New default value for setting MIMETYPE_FILE_READ_SIZE is 1024. +User interface +^^^^^^^^^^^^^^ + +Usage of select2 in more places (FilteredSelectionForm). +Cabinets, Tags, Rebuild index. + + Other changes ^^^^^^^^^^^^^ @@ -86,6 +94,8 @@ Other changes * Use FilteredSelectionForm to add a new ACLCreateForm. * Rename IndexListForm to IndexTemplateFilteredForm. * Use FilteredSelectionForm for IndexTemplateFilteredForm. +* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm. +* Improve document signatures tests. Removals -------- diff --git a/mayan/apps/document_signatures/forms.py b/mayan/apps/document_signatures/forms.py index e0403a23c9..43b155f768 100644 --- a/mayan/apps/document_signatures/forms.py +++ b/mayan/apps/document_signatures/forms.py @@ -5,8 +5,7 @@ import logging from django import forms from django.utils.translation import ugettext_lazy as _ -from mayan.apps.acls.models import AccessControlList -from mayan.apps.common.forms import DetailForm +from mayan.apps.common.forms import DetailForm, FilteredSelectionForm from mayan.apps.django_gpg.models import Key from mayan.apps.django_gpg.permissions import permission_key_sign @@ -15,28 +14,30 @@ from .models import SignatureBaseModel logger = logging.getLogger(__name__) -class DocumentVersionSignatureCreateForm(forms.Form): +class DocumentVersionSignatureCreateForm(FilteredSelectionForm): key = forms.ModelChoiceField( label=_('Key'), queryset=Key.objects.none() ) passphrase = forms.CharField( - label=_('Passphrase'), required=False, + help_text=_( + 'The passphrase to unlock the key and allow it to be used to ' + 'sign the document version.' + ), label=_('Passphrase'), required=False, widget=forms.widgets.PasswordInput ) - def __init__(self, *args, **kwargs): - user = kwargs.pop('user', None) - logger.debug('user: %s', user) - super( - DocumentVersionSignatureCreateForm, self - ).__init__(*args, **kwargs) - - queryset = AccessControlList.objects.filter_by_access( - permission_key_sign, user, queryset=Key.objects.private_keys() + class Meta: + allow_multiple = False + field_name = 'key' + label = _('Key') + help_text = _( + 'Private key that will be used to sign this document version.' ) - - self.fields['key'].queryset = queryset + permission = permission_key_sign + queryset = Key.objects.private_keys() + required = True + widget_attributes = {'class': 'select2'} class DocumentVersionSignatureDetailForm(DetailForm): diff --git a/mayan/apps/document_signatures/tests/mixins.py b/mayan/apps/document_signatures/tests/mixins.py new file mode 100644 index 0000000000..ad014e6589 --- /dev/null +++ b/mayan/apps/document_signatures/tests/mixins.py @@ -0,0 +1,22 @@ +from __future__ import absolute_import, unicode_literals + +from django.core.files import File + +from mayan.apps.django_gpg.models import Key + +from ..models import DetachedSignature + +from .literals import TEST_KEY_FILE, TEST_SIGNATURE_FILE_PATH + + +class SignaturesTestMixin(object): + def _create_detached_signature(self): + with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: + self.test_signature = DetachedSignature.objects.create( + document_version=self.document.latest_version, + signature_file=File(file_object) + ) + + def _create_test_key(self): + with open(TEST_KEY_FILE, mode='rb') as file_object: + self.test_key = Key.objects.create(key_data=file_object.read()) diff --git a/mayan/apps/document_signatures/tests/test_models.py b/mayan/apps/document_signatures/tests/test_models.py index 2113397882..0bbad0be73 100644 --- a/mayan/apps/document_signatures/tests/test_models.py +++ b/mayan/apps/document_signatures/tests/test_models.py @@ -4,7 +4,6 @@ import hashlib import logging import time -from django.core.files import File from django.test import override_settings from mayan.apps.common.tests import BaseTestCase @@ -19,13 +18,13 @@ from ..models import DetachedSignature, EmbeddedSignature from ..tasks import task_verify_missing_embedded_signature from .literals import ( - TEST_SIGNED_DOCUMENT_PATH, TEST_SIGNATURE_FILE_PATH, TEST_KEY_FILE, - TEST_KEY_ID, TEST_SIGNATURE_ID + TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE, TEST_KEY_ID, TEST_SIGNATURE_ID ) +from .mixins import SignaturesTestMixin @override_settings(OCR_AUTO_OCR=False) -class DocumentSignaturesTestCase(BaseTestCase): +class DocumentSignaturesTestCase(SignaturesTestMixin, BaseTestCase): def setUp(self): super(DocumentSignaturesTestCase, self).setUp() self.document_type = DocumentType.objects.create( @@ -123,66 +122,56 @@ class DocumentSignaturesTestCase(BaseTestCase): def test_detached_signature_no_key(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.assertEqual(DetachedSignature.objects.count(), 1) - signature = DetachedSignature.objects.first() - - self.assertEqual(signature.document_version, document.latest_version) - self.assertEqual(signature.key_id, TEST_KEY_ID) - self.assertEqual(signature.public_key_fingerprint, None) + self.assertEqual( + self.test_signature.document_version, self.document.latest_version + ) + self.assertEqual(self.test_signature.key_id, TEST_KEY_ID) + self.assertEqual(self.test_signature.public_key_fingerprint, None) def test_detached_signature_with_key(self): with open(TEST_KEY_FILE, mode='rb') as file_object: key = Key.objects.create(key_data=file_object.read()) with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.assertEqual(DetachedSignature.objects.count(), 1) - signature = DetachedSignature.objects.first() - - self.assertEqual(signature.document_version, document.latest_version) - self.assertEqual(signature.key_id, TEST_KEY_ID) - self.assertEqual(signature.public_key_fingerprint, key.fingerprint) + self.assertEqual( + self.test_signature.document_version, self.document.latest_version + ) + self.assertEqual(self.test_signature.key_id, TEST_KEY_ID) + self.assertEqual( + self.test_signature.public_key_fingerprint, key.fingerprint + ) def test_detached_signature_post_key_verify(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.assertEqual(DetachedSignature.objects.count(), 1) - signature = DetachedSignature.objects.first() - - self.assertEqual(signature.document_version, document.latest_version) - self.assertEqual(signature.key_id, TEST_KEY_ID) - self.assertEqual(signature.public_key_fingerprint, None) + self.assertEqual( + self.test_signature.document_version, self.document.latest_version + ) + self.assertEqual(self.test_signature.key_id, TEST_KEY_ID) + self.assertEqual(self.test_signature.public_key_fingerprint, None) with open(TEST_KEY_FILE, mode='rb') as file_object: key = Key.objects.create(key_data=file_object.read()) @@ -196,23 +185,21 @@ class DocumentSignaturesTestCase(BaseTestCase): key = Key.objects.create(key_data=file_object.read()) with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.assertEqual(DetachedSignature.objects.count(), 1) - signature = DetachedSignature.objects.first() - - self.assertEqual(signature.document_version, document.latest_version) - self.assertEqual(signature.key_id, TEST_KEY_ID) - self.assertEqual(signature.public_key_fingerprint, key.fingerprint) + self.assertEqual( + self.test_signature.document_version, self.document.latest_version + ) + self.assertEqual(self.test_signature.key_id, TEST_KEY_ID) + self.assertEqual( + self.test_signature.public_key_fingerprint, key.fingerprint + ) key.delete() diff --git a/mayan/apps/document_signatures/tests/test_views.py b/mayan/apps/document_signatures/tests/test_views.py index befe4c0247..416ff9abb3 100644 --- a/mayan/apps/document_signatures/tests/test_views.py +++ b/mayan/apps/document_signatures/tests/test_views.py @@ -2,11 +2,8 @@ from __future__ import absolute_import, unicode_literals import logging -from django.core.files import File - from django_downloadview.test import assert_download_response -from mayan.apps.django_gpg.models import Key from mayan.apps.documents.models import DocumentVersion from mayan.apps.documents.tests import ( GenericDocumentViewTestCase, TEST_DOCUMENT_PATH @@ -21,15 +18,14 @@ from ..permissions import ( permission_document_version_signature_view ) -from .literals import ( - TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE -) +from .literals import TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH +from .mixins import SignaturesTestMixin TEST_UNSIGNED_DOCUMENT_COUNT = 4 TEST_SIGNED_DOCUMENT_COUNT = 2 -class SignaturesViewTestCase(GenericDocumentViewTestCase): +class SignaturesViewTestCase(SignaturesTestMixin, GenericDocumentViewTestCase): def setUp(self): super(SignaturesViewTestCase, self).setUp() self.login_user() @@ -41,251 +37,198 @@ class SignaturesViewTestCase(GenericDocumentViewTestCase): ) def test_signature_list_view_no_permission(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() response = self._request_document_version_signature_list_view( - document=document + document=self.document ) self.assertEqual(response.status_code, 403) def test_signature_list_view_with_access(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_view ) response = self._request_document_version_signature_list_view( - document=document + document=self.document ) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['object_list'].count(), 1) - def _request_document_version_signature_details_view(self, signature): + def _request_document_version_signature_details_view(self): return self.get( viewname='signatures:document_version_signature_details', - args=(signature.pk,) + args=(self.test_signature.pk,) ) def test_signature_detail_view_no_permission(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() - response = self._request_document_version_signature_details_view( - signature=signature - ) + response = self._request_document_version_signature_details_view() self.assertEqual(response.status_code, 403) def test_signature_detail_view_with_access(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_view ) - response = self._request_document_version_signature_details_view( - signature=signature - ) + response = self._request_document_version_signature_details_view() self.assertContains( - response=response, text=signature.signature_id, status_code=200 + response=response, text=self.test_signature.signature_id, + status_code=200 ) - def _request_document_version_signature_upload_view(self, document_version): + def _request_document_version_signature_upload_view(self): with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: return self.post( viewname='signatures:document_version_signature_upload', - args=(document_version.pk,), + kwargs={'pk': self.document.latest_version.pk}, data={'signature_file': file_object} ) def test_signature_upload_view_no_permission(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - response = self._request_document_version_signature_upload_view( - document_version=document.latest_version - ) + response = self._request_document_version_signature_upload_view() self.assertEqual(response.status_code, 403) self.assertEqual(DetachedSignature.objects.count(), 0) def test_signature_upload_view_with_access(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_upload ) - response = self._request_document_version_signature_upload_view( - document_version=document.latest_version - ) + response = self._request_document_version_signature_upload_view() self.assertEqual(response.status_code, 302) self.assertEqual(DetachedSignature.objects.count(), 1) - def _request_document_version_signature_download_view(self, signature): + def _request_document_version_signature_download_view(self): return self.get( viewname='signatures:document_version_signature_download', - args=(signature.pk,), + kwargs={'pk': self.test_signature.pk} ) def test_signature_download_view_no_permission(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() - response = self._request_document_version_signature_download_view( - signature=signature - ) + response = self._request_document_version_signature_download_view() self.assertEqual(response.status_code, 403) def test_signature_download_view_with_access(self): with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_download ) self.expected_content_type = 'application/octet-stream; charset=utf-8' - response = self._request_document_version_signature_download_view( - signature=signature - ) + response = self._request_document_version_signature_download_view() - with signature.signature_file as file_object: + with self.test_signature.signature_file as file_object: assert_download_response( self, response=response, content=file_object.read(), ) - def _request_document_version_signature_delete_view(self, signature): + def _request_document_version_signature_delete_view(self): return self.post( viewname='signatures:document_version_signature_delete', - args=(signature.pk,) + kwargs={'pk': self.test_signature.pk} ) def test_signature_delete_view_no_permission(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_view ) - response = self._request_document_version_signature_delete_view( - signature=signature - ) + response = self._request_document_version_signature_delete_view() self.assertEqual(response.status_code, 403) self.assertEqual(DetachedSignature.objects.count(), 1) def test_signature_delete_view_with_access(self): - with open(TEST_KEY_FILE, mode='rb') as file_object: - Key.objects.create(key_data=file_object.read()) + self._create_test_key() with open(TEST_DOCUMENT_PATH, mode='rb') as file_object: - document = self.document_type.new_document( + self.document = self.document_type.new_document( file_object=file_object ) - with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object: - signature = DetachedSignature.objects.create( - document_version=document.latest_version, - signature_file=File(file_object) - ) + self._create_detached_signature() self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_delete ) self.grant_access( - obj=document, + obj=self.document, permission=permission_document_version_signature_view ) - response = self._request_document_version_signature_delete_view( - signature=signature - ) + response = self._request_document_version_signature_delete_view() self.assertEqual(response.status_code, 302) self.assertEqual(DetachedSignature.objects.count(), 0) diff --git a/mayan/apps/document_signatures/views.py b/mayan/apps/document_signatures/views.py index 51055ca89f..c553c8a86e 100644 --- a/mayan/apps/document_signatures/views.py +++ b/mayan/apps/document_signatures/views.py @@ -54,7 +54,7 @@ class DocumentVersionDetachedSignatureCreateView(FormView): passphrase = form.cleaned_data['passphrase'] or None AccessControlList.objects.check_access( - permissions=permission_key_sign, user=self.request.user, obj=key + obj=key, permissions=permission_key_sign, user=self.request.user ) try: @@ -124,14 +124,8 @@ class DocumentVersionDetachedSignatureCreateView(FormView): ) % self.get_document_version(), } - def get_form_kwargs(self): - result = super( - DocumentVersionDetachedSignatureCreateView, self - ).get_form_kwargs() - - result.update({'user': self.request.user}) - - return result + def get_form_extra_kwargs(self): + return {'user': self.request.user} def get_post_action_redirect(self): return reverse( @@ -193,7 +187,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView): return HttpResponseRedirect( reverse( - 'signatures:document_version_signature_list', + viewname='signatures:document_version_signature_list', args=(new_version.pk,) ) ) @@ -223,14 +217,8 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView): ) % self.get_document_version(), } - def get_form_kwargs(self): - result = super( - DocumentVersionEmbeddedSignatureCreateView, self - ).get_form_kwargs() - - result.update({'user': self.request.user}) - - return result + def get_form_extra_kwargs(self): + return {'user': self.request.user} class DocumentVersionSignatureDeleteView(SingleObjectDeleteView):