Update DocumentVersionSignatureCreateForm
Use FilteredSelectionForm. Improve document signatures tests. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -62,6 +62,8 @@
|
|||||||
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
||||||
* Rename IndexListForm to IndexTemplateFilteredForm.
|
* Rename IndexListForm to IndexTemplateFilteredForm.
|
||||||
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
||||||
|
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
|
||||||
|
* Improve document signatures tests.
|
||||||
|
|
||||||
3.1.11 (2019-04-XX)
|
3.1.11 (2019-04-XX)
|
||||||
===================
|
===================
|
||||||
|
|||||||
@@ -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
|
to a separate URL file. Convert the single urls.py to a module to
|
||||||
allow multiple URL files to be used.
|
allow multiple URL files to be used.
|
||||||
|
|
||||||
|
|
||||||
Settings
|
Settings
|
||||||
^^^^^^^^
|
^^^^^^^^
|
||||||
|
|
||||||
New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is 65535.
|
New default value for setting DOCUMENTS_HASH_BLOCK_SIZE is 65535.
|
||||||
New default value for setting MIMETYPE_FILE_READ_SIZE is 1024.
|
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
|
Other changes
|
||||||
^^^^^^^^^^^^^
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
@@ -86,6 +94,8 @@ Other changes
|
|||||||
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
* Use FilteredSelectionForm to add a new ACLCreateForm.
|
||||||
* Rename IndexListForm to IndexTemplateFilteredForm.
|
* Rename IndexListForm to IndexTemplateFilteredForm.
|
||||||
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
* Use FilteredSelectionForm for IndexTemplateFilteredForm.
|
||||||
|
* Use FilteredSelectionForm for DocumentVersionSignatureCreateForm.
|
||||||
|
* Improve document signatures tests.
|
||||||
|
|
||||||
Removals
|
Removals
|
||||||
--------
|
--------
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import logging
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from mayan.apps.acls.models import AccessControlList
|
from mayan.apps.common.forms import DetailForm, FilteredSelectionForm
|
||||||
from mayan.apps.common.forms import DetailForm
|
|
||||||
from mayan.apps.django_gpg.models import Key
|
from mayan.apps.django_gpg.models import Key
|
||||||
from mayan.apps.django_gpg.permissions import permission_key_sign
|
from mayan.apps.django_gpg.permissions import permission_key_sign
|
||||||
|
|
||||||
@@ -15,28 +14,30 @@ from .models import SignatureBaseModel
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class DocumentVersionSignatureCreateForm(forms.Form):
|
class DocumentVersionSignatureCreateForm(FilteredSelectionForm):
|
||||||
key = forms.ModelChoiceField(
|
key = forms.ModelChoiceField(
|
||||||
label=_('Key'), queryset=Key.objects.none()
|
label=_('Key'), queryset=Key.objects.none()
|
||||||
)
|
)
|
||||||
|
|
||||||
passphrase = forms.CharField(
|
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
|
widget=forms.widgets.PasswordInput
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
class Meta:
|
||||||
user = kwargs.pop('user', None)
|
allow_multiple = False
|
||||||
logger.debug('user: %s', user)
|
field_name = 'key'
|
||||||
super(
|
label = _('Key')
|
||||||
DocumentVersionSignatureCreateForm, self
|
help_text = _(
|
||||||
).__init__(*args, **kwargs)
|
'Private key that will be used to sign this document version.'
|
||||||
|
|
||||||
queryset = AccessControlList.objects.filter_by_access(
|
|
||||||
permission_key_sign, user, queryset=Key.objects.private_keys()
|
|
||||||
)
|
)
|
||||||
|
permission = permission_key_sign
|
||||||
self.fields['key'].queryset = queryset
|
queryset = Key.objects.private_keys()
|
||||||
|
required = True
|
||||||
|
widget_attributes = {'class': 'select2'}
|
||||||
|
|
||||||
|
|
||||||
class DocumentVersionSignatureDetailForm(DetailForm):
|
class DocumentVersionSignatureDetailForm(DetailForm):
|
||||||
|
|||||||
22
mayan/apps/document_signatures/tests/mixins.py
Normal file
22
mayan/apps/document_signatures/tests/mixins.py
Normal file
@@ -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())
|
||||||
@@ -4,7 +4,6 @@ import hashlib
|
|||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from django.core.files import File
|
|
||||||
from django.test import override_settings
|
from django.test import override_settings
|
||||||
|
|
||||||
from mayan.apps.common.tests import BaseTestCase
|
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 ..tasks import task_verify_missing_embedded_signature
|
||||||
|
|
||||||
from .literals import (
|
from .literals import (
|
||||||
TEST_SIGNED_DOCUMENT_PATH, TEST_SIGNATURE_FILE_PATH, TEST_KEY_FILE,
|
TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE, TEST_KEY_ID, TEST_SIGNATURE_ID
|
||||||
TEST_KEY_ID, TEST_SIGNATURE_ID
|
|
||||||
)
|
)
|
||||||
|
from .mixins import SignaturesTestMixin
|
||||||
|
|
||||||
|
|
||||||
@override_settings(OCR_AUTO_OCR=False)
|
@override_settings(OCR_AUTO_OCR=False)
|
||||||
class DocumentSignaturesTestCase(BaseTestCase):
|
class DocumentSignaturesTestCase(SignaturesTestMixin, BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(DocumentSignaturesTestCase, self).setUp()
|
super(DocumentSignaturesTestCase, self).setUp()
|
||||||
self.document_type = DocumentType.objects.create(
|
self.document_type = DocumentType.objects.create(
|
||||||
@@ -123,66 +122,56 @@ class DocumentSignaturesTestCase(BaseTestCase):
|
|||||||
|
|
||||||
def test_detached_signature_no_key(self):
|
def test_detached_signature_no_key(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
self.assertEqual(DetachedSignature.objects.count(), 1)
|
||||||
|
|
||||||
signature = DetachedSignature.objects.first()
|
self.assertEqual(
|
||||||
|
self.test_signature.document_version, self.document.latest_version
|
||||||
self.assertEqual(signature.document_version, document.latest_version)
|
)
|
||||||
self.assertEqual(signature.key_id, TEST_KEY_ID)
|
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
|
||||||
self.assertEqual(signature.public_key_fingerprint, None)
|
self.assertEqual(self.test_signature.public_key_fingerprint, None)
|
||||||
|
|
||||||
def test_detached_signature_with_key(self):
|
def test_detached_signature_with_key(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
||||||
key = Key.objects.create(key_data=file_object.read())
|
key = Key.objects.create(key_data=file_object.read())
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
self.assertEqual(DetachedSignature.objects.count(), 1)
|
||||||
|
|
||||||
signature = DetachedSignature.objects.first()
|
self.assertEqual(
|
||||||
|
self.test_signature.document_version, self.document.latest_version
|
||||||
self.assertEqual(signature.document_version, document.latest_version)
|
)
|
||||||
self.assertEqual(signature.key_id, TEST_KEY_ID)
|
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
|
||||||
self.assertEqual(signature.public_key_fingerprint, key.fingerprint)
|
self.assertEqual(
|
||||||
|
self.test_signature.public_key_fingerprint, key.fingerprint
|
||||||
|
)
|
||||||
|
|
||||||
def test_detached_signature_post_key_verify(self):
|
def test_detached_signature_post_key_verify(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
self.assertEqual(DetachedSignature.objects.count(), 1)
|
||||||
|
|
||||||
signature = DetachedSignature.objects.first()
|
self.assertEqual(
|
||||||
|
self.test_signature.document_version, self.document.latest_version
|
||||||
self.assertEqual(signature.document_version, document.latest_version)
|
)
|
||||||
self.assertEqual(signature.key_id, TEST_KEY_ID)
|
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
|
||||||
self.assertEqual(signature.public_key_fingerprint, None)
|
self.assertEqual(self.test_signature.public_key_fingerprint, None)
|
||||||
|
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
||||||
key = Key.objects.create(key_data=file_object.read())
|
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())
|
key = Key.objects.create(key_data=file_object.read())
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
self.assertEqual(DetachedSignature.objects.count(), 1)
|
||||||
|
|
||||||
signature = DetachedSignature.objects.first()
|
self.assertEqual(
|
||||||
|
self.test_signature.document_version, self.document.latest_version
|
||||||
self.assertEqual(signature.document_version, document.latest_version)
|
)
|
||||||
self.assertEqual(signature.key_id, TEST_KEY_ID)
|
self.assertEqual(self.test_signature.key_id, TEST_KEY_ID)
|
||||||
self.assertEqual(signature.public_key_fingerprint, key.fingerprint)
|
self.assertEqual(
|
||||||
|
self.test_signature.public_key_fingerprint, key.fingerprint
|
||||||
|
)
|
||||||
|
|
||||||
key.delete()
|
key.delete()
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,8 @@ from __future__ import absolute_import, unicode_literals
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from django.core.files import File
|
|
||||||
|
|
||||||
from django_downloadview.test import assert_download_response
|
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.models import DocumentVersion
|
||||||
from mayan.apps.documents.tests import (
|
from mayan.apps.documents.tests import (
|
||||||
GenericDocumentViewTestCase, TEST_DOCUMENT_PATH
|
GenericDocumentViewTestCase, TEST_DOCUMENT_PATH
|
||||||
@@ -21,15 +18,14 @@ from ..permissions import (
|
|||||||
permission_document_version_signature_view
|
permission_document_version_signature_view
|
||||||
)
|
)
|
||||||
|
|
||||||
from .literals import (
|
from .literals import TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH
|
||||||
TEST_SIGNATURE_FILE_PATH, TEST_SIGNED_DOCUMENT_PATH, TEST_KEY_FILE
|
from .mixins import SignaturesTestMixin
|
||||||
)
|
|
||||||
|
|
||||||
TEST_UNSIGNED_DOCUMENT_COUNT = 4
|
TEST_UNSIGNED_DOCUMENT_COUNT = 4
|
||||||
TEST_SIGNED_DOCUMENT_COUNT = 2
|
TEST_SIGNED_DOCUMENT_COUNT = 2
|
||||||
|
|
||||||
|
|
||||||
class SignaturesViewTestCase(GenericDocumentViewTestCase):
|
class SignaturesViewTestCase(SignaturesTestMixin, GenericDocumentViewTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(SignaturesViewTestCase, self).setUp()
|
super(SignaturesViewTestCase, self).setUp()
|
||||||
self.login_user()
|
self.login_user()
|
||||||
@@ -41,251 +37,198 @@ class SignaturesViewTestCase(GenericDocumentViewTestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def test_signature_list_view_no_permission(self):
|
def test_signature_list_view_no_permission(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
response = self._request_document_version_signature_list_view(
|
response = self._request_document_version_signature_list_view(
|
||||||
document=document
|
document=self.document
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
def test_signature_list_view_with_access(self):
|
def test_signature_list_view_with_access(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_view
|
permission=permission_document_version_signature_view
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_list_view(
|
response = self._request_document_version_signature_list_view(
|
||||||
document=document
|
document=self.document
|
||||||
)
|
)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(response.context['object_list'].count(), 1)
|
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(
|
return self.get(
|
||||||
viewname='signatures:document_version_signature_details',
|
viewname='signatures:document_version_signature_details',
|
||||||
args=(signature.pk,)
|
args=(self.test_signature.pk,)
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_signature_detail_view_no_permission(self):
|
def test_signature_detail_view_no_permission(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
response = self._request_document_version_signature_details_view(
|
response = self._request_document_version_signature_details_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
def test_signature_detail_view_with_access(self):
|
def test_signature_detail_view_with_access(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_view
|
permission=permission_document_version_signature_view
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_details_view(
|
response = self._request_document_version_signature_details_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
self.assertContains(
|
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:
|
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
||||||
return self.post(
|
return self.post(
|
||||||
viewname='signatures:document_version_signature_upload',
|
viewname='signatures:document_version_signature_upload',
|
||||||
args=(document_version.pk,),
|
kwargs={'pk': self.document.latest_version.pk},
|
||||||
data={'signature_file': file_object}
|
data={'signature_file': file_object}
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_signature_upload_view_no_permission(self):
|
def test_signature_upload_view_no_permission(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_upload_view(
|
response = self._request_document_version_signature_upload_view()
|
||||||
document_version=document.latest_version
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 0)
|
self.assertEqual(DetachedSignature.objects.count(), 0)
|
||||||
|
|
||||||
def test_signature_upload_view_with_access(self):
|
def test_signature_upload_view_with_access(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_upload
|
permission=permission_document_version_signature_upload
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_upload_view(
|
response = self._request_document_version_signature_upload_view()
|
||||||
document_version=document.latest_version
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
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(
|
return self.get(
|
||||||
viewname='signatures:document_version_signature_download',
|
viewname='signatures:document_version_signature_download',
|
||||||
args=(signature.pk,),
|
kwargs={'pk': self.test_signature.pk}
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_signature_download_view_no_permission(self):
|
def test_signature_download_view_no_permission(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
response = self._request_document_version_signature_download_view(
|
response = self._request_document_version_signature_download_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
|
|
||||||
def test_signature_download_view_with_access(self):
|
def test_signature_download_view_with_access(self):
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_download
|
permission=permission_document_version_signature_download
|
||||||
)
|
)
|
||||||
|
|
||||||
self.expected_content_type = 'application/octet-stream; charset=utf-8'
|
self.expected_content_type = 'application/octet-stream; charset=utf-8'
|
||||||
|
|
||||||
response = self._request_document_version_signature_download_view(
|
response = self._request_document_version_signature_download_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
|
|
||||||
with signature.signature_file as file_object:
|
with self.test_signature.signature_file as file_object:
|
||||||
assert_download_response(
|
assert_download_response(
|
||||||
self, response=response, content=file_object.read(),
|
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(
|
return self.post(
|
||||||
viewname='signatures:document_version_signature_delete',
|
viewname='signatures:document_version_signature_delete',
|
||||||
args=(signature.pk,)
|
kwargs={'pk': self.test_signature.pk}
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_signature_delete_view_no_permission(self):
|
def test_signature_delete_view_no_permission(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_view
|
permission=permission_document_version_signature_view
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_delete_view(
|
response = self._request_document_version_signature_delete_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 403)
|
self.assertEqual(response.status_code, 403)
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 1)
|
self.assertEqual(DetachedSignature.objects.count(), 1)
|
||||||
|
|
||||||
def test_signature_delete_view_with_access(self):
|
def test_signature_delete_view_with_access(self):
|
||||||
with open(TEST_KEY_FILE, mode='rb') as file_object:
|
self._create_test_key()
|
||||||
Key.objects.create(key_data=file_object.read())
|
|
||||||
|
|
||||||
with open(TEST_DOCUMENT_PATH, mode='rb') as file_object:
|
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
|
file_object=file_object
|
||||||
)
|
)
|
||||||
|
|
||||||
with open(TEST_SIGNATURE_FILE_PATH, mode='rb') as file_object:
|
self._create_detached_signature()
|
||||||
signature = DetachedSignature.objects.create(
|
|
||||||
document_version=document.latest_version,
|
|
||||||
signature_file=File(file_object)
|
|
||||||
)
|
|
||||||
|
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_delete
|
permission=permission_document_version_signature_delete
|
||||||
)
|
)
|
||||||
self.grant_access(
|
self.grant_access(
|
||||||
obj=document,
|
obj=self.document,
|
||||||
permission=permission_document_version_signature_view
|
permission=permission_document_version_signature_view
|
||||||
)
|
)
|
||||||
|
|
||||||
response = self._request_document_version_signature_delete_view(
|
response = self._request_document_version_signature_delete_view()
|
||||||
signature=signature
|
|
||||||
)
|
|
||||||
self.assertEqual(response.status_code, 302)
|
self.assertEqual(response.status_code, 302)
|
||||||
self.assertEqual(DetachedSignature.objects.count(), 0)
|
self.assertEqual(DetachedSignature.objects.count(), 0)
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
|
|||||||
passphrase = form.cleaned_data['passphrase'] or None
|
passphrase = form.cleaned_data['passphrase'] or None
|
||||||
|
|
||||||
AccessControlList.objects.check_access(
|
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:
|
try:
|
||||||
@@ -124,14 +124,8 @@ class DocumentVersionDetachedSignatureCreateView(FormView):
|
|||||||
) % self.get_document_version(),
|
) % self.get_document_version(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_extra_kwargs(self):
|
||||||
result = super(
|
return {'user': self.request.user}
|
||||||
DocumentVersionDetachedSignatureCreateView, self
|
|
||||||
).get_form_kwargs()
|
|
||||||
|
|
||||||
result.update({'user': self.request.user})
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
def get_post_action_redirect(self):
|
def get_post_action_redirect(self):
|
||||||
return reverse(
|
return reverse(
|
||||||
@@ -193,7 +187,7 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
|
|||||||
|
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
reverse(
|
reverse(
|
||||||
'signatures:document_version_signature_list',
|
viewname='signatures:document_version_signature_list',
|
||||||
args=(new_version.pk,)
|
args=(new_version.pk,)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -223,14 +217,8 @@ class DocumentVersionEmbeddedSignatureCreateView(FormView):
|
|||||||
) % self.get_document_version(),
|
) % self.get_document_version(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_extra_kwargs(self):
|
||||||
result = super(
|
return {'user': self.request.user}
|
||||||
DocumentVersionEmbeddedSignatureCreateView, self
|
|
||||||
).get_form_kwargs()
|
|
||||||
|
|
||||||
result.update({'user': self.request.user})
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
class DocumentVersionSignatureDeleteView(SingleObjectDeleteView):
|
class DocumentVersionSignatureDeleteView(SingleObjectDeleteView):
|
||||||
|
|||||||
Reference in New Issue
Block a user