Merge remote-tracking branch 'origin/master' into development
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -75,6 +75,9 @@ class Source(models.Model):
|
||||
return ' '.join([self.class_fullname(), '"%s"' % self.label])
|
||||
|
||||
def upload_document(self, file_object, document_type, description=None, label=None, language=None, metadata_dict_list=None, metadata_dictionary=None, tag_ids=None, user=None):
|
||||
"""
|
||||
Upload an individual document
|
||||
"""
|
||||
try:
|
||||
with transaction.atomic():
|
||||
document = Document.objects.create(
|
||||
@@ -83,7 +86,15 @@ class Source(models.Model):
|
||||
language=language or setting_language.value
|
||||
)
|
||||
document.save(_user=user)
|
||||
|
||||
except Exception as exception:
|
||||
logger.critical(
|
||||
'Unexpected exception while trying to create new document '
|
||||
'"%s" from source "%s"; %s',
|
||||
label or file_object.name, self, exception
|
||||
)
|
||||
raise
|
||||
else:
|
||||
try:
|
||||
document_version = document.new_version(
|
||||
file_object=file_object, _user=user
|
||||
)
|
||||
@@ -109,16 +120,20 @@ class Source(models.Model):
|
||||
if tag_ids:
|
||||
for tag in Tag.objects.filter(pk__in=tag_ids):
|
||||
tag.documents.add(document)
|
||||
except Exception as exception:
|
||||
logger.critical(
|
||||
'Unexpected exception while trying to create version for '
|
||||
'new document "%s" from source "%s"; %s',
|
||||
label or file_object.name, self, exception
|
||||
)
|
||||
document.delete(to_trash=False)
|
||||
raise
|
||||
|
||||
except Exception as exception:
|
||||
logger.critical(
|
||||
'Unexpected exception while trying to create new document '
|
||||
'"%s" from source "%s"; %s',
|
||||
label or file_object.name, self, exception
|
||||
)
|
||||
raise
|
||||
|
||||
def handle_upload(self, file_object, description=None, document_type=None, expand=False, label=None, language=None, metadata_dict_list=None, metadata_dictionary=None, user=None):
|
||||
def handle_upload(self, file_object, description=None, document_type=None, expand=False, label=None, language=None, metadata_dict_list=None, metadata_dictionary=None, tag_ids=None, user=None):
|
||||
"""
|
||||
Handle an upload request from a file object which may be an individual
|
||||
document or a compressed file containing multiple documents.
|
||||
"""
|
||||
if not document_type:
|
||||
document_type = self.document_type
|
||||
|
||||
@@ -126,7 +141,8 @@ class Source(models.Model):
|
||||
'description': description, 'document_type': document_type,
|
||||
'label': label, 'language': language,
|
||||
'metadata_dict_list': metadata_dict_list,
|
||||
'metadata_dictionary': metadata_dictionary, 'user': user
|
||||
'metadata_dictionary': metadata_dictionary, 'tag_ids': tag_ids,
|
||||
'user': user
|
||||
}
|
||||
|
||||
if expand:
|
||||
@@ -147,11 +163,11 @@ class Source(models.Model):
|
||||
|
||||
def get_upload_file_object(self, form_data):
|
||||
pass
|
||||
# TODO: Should raise NotImplementedError()?
|
||||
# TODO: Should raise NotImplementedError?
|
||||
|
||||
def clean_up_upload_file(self, upload_file_object):
|
||||
pass
|
||||
# TODO: Should raise NotImplementedError()?
|
||||
# TODO: Should raise NotImplementedError?
|
||||
|
||||
class Meta:
|
||||
ordering = ('label',)
|
||||
@@ -410,7 +426,7 @@ class IntervalBaseModel(OutOfProcessSource):
|
||||
DocumentType,
|
||||
help_text=_(
|
||||
'Assign a document type to documents uploaded from this source.'
|
||||
),
|
||||
), on_delete=models.CASCADE,
|
||||
verbose_name=_('Document type')
|
||||
)
|
||||
uncompress = models.CharField(
|
||||
@@ -500,14 +516,14 @@ class EmailBaseModel(IntervalBaseModel):
|
||||
MetadataType, blank=True, help_text=_(
|
||||
'Select a metadata type valid for the document type selected in '
|
||||
'which to store the email\'s subject.'
|
||||
), null=True, related_name='email_subject',
|
||||
), on_delete=models.CASCADE, null=True, related_name='email_subject',
|
||||
verbose_name=_('Subject metadata type')
|
||||
)
|
||||
from_metadata_type = models.ForeignKey(
|
||||
MetadataType, blank=True, help_text=_(
|
||||
'Select a metadata type valid for the document type selected in '
|
||||
'which to store the email\'s "from" value.'
|
||||
), null=True, related_name='email_from',
|
||||
), on_delete=models.CASCADE, null=True, related_name='email_from',
|
||||
verbose_name=_('From metadata type')
|
||||
)
|
||||
store_body = models.BooleanField(
|
||||
@@ -758,7 +774,8 @@ class WatchFolderSource(IntervalBaseModel):
|
||||
|
||||
class SourceLog(models.Model):
|
||||
source = models.ForeignKey(
|
||||
Source, related_name='logs', verbose_name=_('Source')
|
||||
Source, on_delete=models.CASCADE, related_name='logs',
|
||||
verbose_name=_('Source')
|
||||
)
|
||||
datetime = models.DateTimeField(
|
||||
auto_now_add=True, editable=False, verbose_name=_('Date time')
|
||||
|
||||
@@ -9,7 +9,7 @@ from common.utils import mkdtemp
|
||||
from common.tests import BaseTestCase
|
||||
from documents.models import Document, DocumentType
|
||||
from documents.tests import (
|
||||
TEST_COMPRESSED_DOCUMENT_PATH, TEST_DOCUMENT_TYPE,
|
||||
TEST_COMPRESSED_DOCUMENT_PATH, TEST_DOCUMENT_TYPE_LABEL,
|
||||
TEST_NON_ASCII_DOCUMENT_FILENAME, TEST_NON_ASCII_DOCUMENT_PATH,
|
||||
TEST_NON_ASCII_COMPRESSED_DOCUMENT_PATH
|
||||
)
|
||||
@@ -30,7 +30,7 @@ class UploadDocumentTestCase(BaseTestCase):
|
||||
def setUp(self):
|
||||
super(UploadDocumentTestCase, self).setUp()
|
||||
self.document_type = DocumentType.objects.create(
|
||||
label=TEST_DOCUMENT_TYPE
|
||||
label=TEST_DOCUMENT_TYPE_LABEL
|
||||
)
|
||||
|
||||
self.admin_user = get_user_model().objects.create_superuser(
|
||||
@@ -97,7 +97,7 @@ class CompressedUploadsTestCase(BaseTestCase):
|
||||
def setUp(self):
|
||||
super(CompressedUploadsTestCase, self).setUp()
|
||||
self.document_type = DocumentType.objects.create(
|
||||
label=TEST_DOCUMENT_TYPE
|
||||
label=TEST_DOCUMENT_TYPE_LABEL
|
||||
)
|
||||
|
||||
def tearDown(self):
|
||||
|
||||
@@ -12,8 +12,8 @@ from common.utils import fs_cleanup, mkdtemp
|
||||
from documents.models import Document, DocumentType
|
||||
from documents.permissions import permission_document_create
|
||||
from documents.tests import (
|
||||
TEST_DOCUMENT_PATH, TEST_SMALL_DOCUMENT_PATH, TEST_DOCUMENT_DESCRIPTION,
|
||||
TEST_DOCUMENT_TYPE
|
||||
TEST_DOCUMENT_DESCRIPTION, TEST_DOCUMENT_TYPE_LABEL,
|
||||
TEST_SMALL_DOCUMENT_CHECKSUM, TEST_SMALL_DOCUMENT_PATH
|
||||
)
|
||||
from documents.tests.test_views import GenericDocumentViewTestCase
|
||||
|
||||
@@ -40,35 +40,35 @@ class DocumentUploadTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.document.delete()
|
||||
|
||||
def test_upload_wizard_without_permission(self):
|
||||
self.login_user()
|
||||
|
||||
with open(TEST_DOCUMENT_PATH) as file_object:
|
||||
response = self.post(
|
||||
def _request_upload_wizard(self):
|
||||
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
|
||||
return self.post(
|
||||
'sources:upload_interactive', args=(self.source.pk,), data={
|
||||
'source-file': file_object,
|
||||
'document_type_id': self.document_type.pk,
|
||||
}
|
||||
}, follow=True
|
||||
)
|
||||
|
||||
def test_upload_wizard_without_permission(self):
|
||||
self.login_user()
|
||||
|
||||
response = self._request_upload_wizard()
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
self.assertEqual(Document.objects.count(), 0)
|
||||
|
||||
def test_upload_wizard_with_permission(self):
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_document_create)
|
||||
self.grant_permission(permission=permission_document_create)
|
||||
|
||||
with open(TEST_DOCUMENT_PATH) as file_object:
|
||||
response = self.post(
|
||||
'sources:upload_interactive', args=(self.source.pk,), data={
|
||||
'source-file': file_object,
|
||||
'document_type_id': self.document_type.pk,
|
||||
}, follow=True
|
||||
)
|
||||
response = self._request_upload_wizard()
|
||||
|
||||
self.assertTrue(b'queued' in response.content)
|
||||
self.assertEqual(Document.objects.count(), 1)
|
||||
self.assertEqual(
|
||||
Document.objects.first().checksum, TEST_SMALL_DOCUMENT_CHECKSUM
|
||||
)
|
||||
|
||||
def test_upload_wizard_with_document_type_access(self):
|
||||
"""
|
||||
@@ -85,7 +85,7 @@ class DocumentUploadTestCase(GenericDocumentViewTestCase):
|
||||
)
|
||||
acl.permissions.add(permission_document_create.stored_permission)
|
||||
|
||||
with open(TEST_DOCUMENT_PATH) as file_object:
|
||||
with open(TEST_SMALL_DOCUMENT_PATH) as file_object:
|
||||
response = self.post(
|
||||
'sources:upload_interactive', args=(self.source.pk,), data={
|
||||
'source-file': file_object,
|
||||
@@ -96,13 +96,38 @@ class DocumentUploadTestCase(GenericDocumentViewTestCase):
|
||||
self.assertTrue(b'queued' in response.content)
|
||||
self.assertEqual(Document.objects.count(), 1)
|
||||
|
||||
def _request_upload_interactive_view(self):
|
||||
return self.get(
|
||||
'sources:upload_interactive', data={
|
||||
'document_type_id': self.document_type.pk,
|
||||
}
|
||||
)
|
||||
|
||||
def test_upload_interactive_view_no_permission(self):
|
||||
self.login_user()
|
||||
|
||||
response = self._request_upload_interactive_view()
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
def test_upload_interactive_view_with_access(self):
|
||||
self.login_user()
|
||||
self.grant_access(
|
||||
permission=permission_document_create, obj=self.document_type
|
||||
)
|
||||
response = self._request_upload_interactive_view()
|
||||
|
||||
self.assertContains(
|
||||
response, text=self.source.label, status_code=200
|
||||
)
|
||||
|
||||
|
||||
@override_settings(OCR_AUTO_OCR=False)
|
||||
class DocumentUploadIssueTestCase(GenericViewTestCase):
|
||||
def setUp(self):
|
||||
super(DocumentUploadIssueTestCase, self).setUp()
|
||||
self.document_type = DocumentType.objects.create(
|
||||
label=TEST_DOCUMENT_TYPE
|
||||
label=TEST_DOCUMENT_TYPE_LABEL
|
||||
)
|
||||
|
||||
def tearDown(self):
|
||||
@@ -227,7 +252,7 @@ class StagingFolderTestCase(GenericViewTestCase):
|
||||
def test_staging_folder_delete_with_permission(self):
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_staging_file_delete)
|
||||
self.grant_permission(permission=permission_staging_file_delete)
|
||||
|
||||
staging_folder = StagingFolderSource.objects.create(
|
||||
label=TEST_SOURCE_LABEL,
|
||||
@@ -262,7 +287,7 @@ class SourcesTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_sources_setup_view)
|
||||
self.grant_permission(permission=permission_sources_setup_view)
|
||||
|
||||
response = self.get(viewname='sources:setup_source_list')
|
||||
|
||||
@@ -280,8 +305,8 @@ class SourcesTestCase(GenericDocumentViewTestCase):
|
||||
def test_source_create_view_with_permission(self):
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_sources_setup_create)
|
||||
self.grant(permission_sources_setup_view)
|
||||
self.grant_permission(permission=permission_sources_setup_create)
|
||||
self.grant_permission(permission=permission_sources_setup_view)
|
||||
|
||||
response = self.post(
|
||||
args=(SOURCE_CHOICE_WEB_FORM,), follow=True,
|
||||
@@ -301,7 +326,7 @@ class SourcesTestCase(GenericDocumentViewTestCase):
|
||||
def test_source_create_view_no_permission(self):
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_sources_setup_view)
|
||||
self.grant_permission(permission=permission_sources_setup_view)
|
||||
|
||||
response = self.post(
|
||||
args=(SOURCE_CHOICE_WEB_FORM,), follow=True,
|
||||
@@ -319,8 +344,8 @@ class SourcesTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_sources_setup_delete)
|
||||
self.grant(permission_sources_setup_view)
|
||||
self.grant_permission(permission=permission_sources_setup_delete)
|
||||
self.grant_permission(permission=permission_sources_setup_view)
|
||||
|
||||
response = self.post(
|
||||
args=(self.source.pk,), follow=True,
|
||||
@@ -335,7 +360,7 @@ class SourcesTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.login_user()
|
||||
|
||||
self.grant(permission_sources_setup_view)
|
||||
self.grant_permission(permission=permission_sources_setup_view)
|
||||
|
||||
response = self.post(
|
||||
args=(self.source.pk,), follow=True,
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse, reverse_lazy
|
||||
from django.http import HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
@@ -232,7 +232,7 @@ class UploadInteractiveView(UploadBaseView):
|
||||
if forms['document_form'].cleaned_data['document_type_available_filenames']:
|
||||
label = forms['document_form'].cleaned_data['document_type_available_filenames'].filename
|
||||
|
||||
if not self.request.user.is_anonymous():
|
||||
if not self.request.user.is_anonymous:
|
||||
user_id = self.request.user.pk
|
||||
else:
|
||||
user_id = None
|
||||
@@ -374,7 +374,7 @@ class UploadInteractiveVersionView(UploadBaseView):
|
||||
except Exception as exception:
|
||||
messages.error(self.request, exception)
|
||||
|
||||
if not self.request.user.is_anonymous():
|
||||
if not self.request.user.is_anonymous:
|
||||
user_id = self.request.user.pk
|
||||
else:
|
||||
user_id = None
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.urls import reverse
|
||||
from django.utils.encoding import force_text
|
||||
from django.utils.http import urlencode
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
Reference in New Issue
Block a user