diff --git a/src/documents/file_handling.py b/src/documents/file_handling.py index a5274a5f4..dd798e8ab 100644 --- a/src/documents/file_handling.py +++ b/src/documents/file_handling.py @@ -91,7 +91,7 @@ def generate_unique_filename(doc, root): return new_filename -def generate_filename(doc, counter=0): +def generate_filename(doc, counter=0, append_gpg=True): path = "" try: @@ -151,7 +151,7 @@ def generate_filename(doc, counter=0): filename = f"{doc.pk:07}{counter_str}{doc.file_type}" # Append .gpg for encrypted files - if doc.storage_type == doc.STORAGE_TYPE_GPG: + if append_gpg and doc.storage_type == doc.STORAGE_TYPE_GPG: filename += ".gpg" return filename diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index e2313e86a..250ae1adf 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -108,7 +108,8 @@ class Command(Renderable, BaseCommand): while True: if self.use_filename_format: base_name = generate_filename( - document, counter=filename_counter) + document, counter=filename_counter, + append_gpg=False) else: base_name = document.get_public_filename( counter=filename_counter) @@ -139,15 +140,18 @@ class Command(Renderable, BaseCommand): t = int(time.mktime(document.created.timetuple())) if document.storage_type == Document.STORAGE_TYPE_GPG: + os.makedirs(os.path.dirname(original_target), exist_ok=True) with open(original_target, "wb") as f: f.write(GnuPG.decrypted(document.source_file)) os.utime(original_target, times=(t, t)) + os.makedirs(os.path.dirname(thumbnail_target), exist_ok=True) with open(thumbnail_target, "wb") as f: f.write(GnuPG.decrypted(document.thumbnail_file)) os.utime(thumbnail_target, times=(t, t)) if archive_target: + os.makedirs(os.path.dirname(archive_target), exist_ok=True) with open(archive_target, "wb") as f: f.write(GnuPG.decrypted(document.archive_path)) os.utime(archive_target, times=(t, t)) diff --git a/src/documents/tests/samples/documents/originals/0000002.pdf.gpg b/src/documents/tests/samples/documents/originals/0000002.pdf.gpg deleted file mode 100644 index 0322a8039..000000000 Binary files a/src/documents/tests/samples/documents/originals/0000002.pdf.gpg and /dev/null differ diff --git a/src/documents/tests/samples/documents/originals/0000004.pdf.gpg b/src/documents/tests/samples/documents/originals/0000004.pdf.gpg new file mode 100644 index 000000000..754efcbf6 Binary files /dev/null and b/src/documents/tests/samples/documents/originals/0000004.pdf.gpg differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000002.png.gpg b/src/documents/tests/samples/documents/thumbnails/0000004.png.gpg similarity index 100% rename from src/documents/tests/samples/documents/thumbnails/0000002.png.gpg rename to src/documents/tests/samples/documents/thumbnails/0000004.png.gpg diff --git a/src/documents/tests/test_management_exporter.py b/src/documents/tests/test_management_exporter.py index d6e7ad6e0..e3fef6b78 100644 --- a/src/documents/tests/test_management_exporter.py +++ b/src/documents/tests/test_management_exporter.py @@ -24,6 +24,8 @@ class TestExportImport(DirectoriesMixin, TestCase): self.d1 = Document.objects.create(content="Content", checksum="42995833e01aea9b3edee44bbfdd7ce1", archive_checksum="62acb0bcbfbcaa62ca6ad3668e4e404b", title="wow1", filename="0000001.pdf", mime_type="application/pdf") self.d2 = Document.objects.create(content="Content", checksum="9c9691e51741c1f4f41a20896af31770", title="wow2", filename="0000002.pdf", mime_type="application/pdf") self.d3 = Document.objects.create(content="Content", checksum="d38d7ed02e988e072caf924e0f3fcb76", title="wow2", filename="0000003.pdf", mime_type="application/pdf") + self.d4 = Document.objects.create(content="Content", checksum="82186aaa94f0b98697d704b90fd1c072", title="wow_dec", filename="0000004.pdf.gpg", mime_type="application/pdf", storage_type=Document.STORAGE_TYPE_GPG) + self.t1 = Tag.objects.create(name="t") self.dt1 = DocumentType.objects.create(name="dt") self.c1 = Correspondent.objects.create(name="c") @@ -34,6 +36,9 @@ class TestExportImport(DirectoriesMixin, TestCase): self.d1.save() super(TestExportImport, self).setUp() + @override_settings( + PASSPHRASE="test" + ) def _do_export(self, use_filename_format=False, compare_checksums=False): args = ['document_exporter', self.target] if use_filename_format: @@ -54,8 +59,8 @@ class TestExportImport(DirectoriesMixin, TestCase): manifest = self._do_export(use_filename_format=use_filename_format) - self.assertEqual(len(manifest), 6) - self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 3) + self.assertEqual(len(manifest), 7) + self.assertEqual(len(list(filter(lambda e: e['model'] == 'documents.document', manifest))), 4) self.assertTrue(os.path.exists(os.path.join(self.target, "manifest.json"))) @@ -69,6 +74,8 @@ class TestExportImport(DirectoriesMixin, TestCase): checksum = hashlib.md5(f.read()).hexdigest() self.assertEqual(checksum, element['fields']['checksum']) + self.assertEqual(element['fields']['storage_type'], Document.STORAGE_TYPE_UNENCRYPTED) + if document_exporter.EXPORTER_ARCHIVE_NAME in element: fname = os.path.join(self.target, element[document_exporter.EXPORTER_ARCHIVE_NAME]) self.assertTrue(os.path.exists(fname)) @@ -78,7 +85,7 @@ class TestExportImport(DirectoriesMixin, TestCase): self.assertEqual(checksum, element['fields']['archive_checksum']) with paperless_environment() as dirs: - self.assertEqual(Document.objects.count(), 3) + self.assertEqual(Document.objects.count(), 4) Document.objects.all().delete() Correspondent.objects.all().delete() DocumentType.objects.all().delete() @@ -86,13 +93,14 @@ class TestExportImport(DirectoriesMixin, TestCase): self.assertEqual(Document.objects.count(), 0) call_command('document_importer', self.target) - self.assertEqual(Document.objects.count(), 3) + self.assertEqual(Document.objects.count(), 4) self.assertEqual(Tag.objects.count(), 1) self.assertEqual(Correspondent.objects.count(), 1) self.assertEqual(DocumentType.objects.count(), 1) self.assertEqual(Document.objects.get(id=self.d1.id).title, "wow1") self.assertEqual(Document.objects.get(id=self.d2.id).title, "wow2") self.assertEqual(Document.objects.get(id=self.d3.id).title, "wow2") + self.assertEqual(Document.objects.get(id=self.d4.id).title, "wow_dec") messages = check_sanity() # everything is alright after the test self.assertEqual(len(messages), 0, str([str(m) for m in messages]))