Merge remote-tracking branch 'origin/master' into development

Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
Roberto Rosario
2017-07-29 01:55:42 -04:00
1677 changed files with 40824 additions and 21204 deletions
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
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
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
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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+34 -17
View File
@@ -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')
+3 -3
View File
@@ -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):
+51 -26
View File
@@ -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,
+3 -3
View File
@@ -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 -1
View File
@@ -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 _