From 82168e1a518e8cbb820fb97234b5f3ffb520326a Mon Sep 17 00:00:00 2001
From: Jonas Winkler <jonas.winkler@jpwinkler.de>
Date: Fri, 13 Nov 2020 20:31:51 +0100
Subject: [PATCH] add exception handler for invalid filename formats.

---
 src/documents/file_handling.py            | 40 +++++++++++++----------
 src/documents/signals/__init__.py         |  6 ++--
 src/documents/tests/test_file_handling.py | 18 ++++++++++
 3 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/src/documents/file_handling.py b/src/documents/file_handling.py
index 68180448c..ce51afe81 100644
--- a/src/documents/file_handling.py
+++ b/src/documents/file_handling.py
@@ -1,3 +1,4 @@
+import logging
 import os
 from collections import defaultdict
 
@@ -66,24 +67,27 @@ def many_to_dictionary(field):
 
 def generate_filename(document):
     # Create filename based on configured format
-    if settings.PAPERLESS_FILENAME_FORMAT is not None:
-        tags = defaultdict(lambda: slugify(None),
-                           many_to_dictionary(document.tags))
-        path = settings.PAPERLESS_FILENAME_FORMAT.format(
-            correspondent=slugify(document.correspondent),
-            title=slugify(document.title),
-            created=slugify(document.created),
-            created_year=document.created.year if document.created else "none",
-            created_month=document.created.month if document.created else "none",
-            created_day=document.created.day if document.created else "none",
-            added=slugify(document.added),
-            added_year=document.added.year if document.added else "none",
-            added_month=document.added.month if document.added else "none",
-            added_day=document.added.day if document.added else "none",
-            tags=tags,
-        )
-    else:
-        path = ""
+    path = ""
+
+    try:
+        if settings.PAPERLESS_FILENAME_FORMAT is not None:
+            tags = defaultdict(lambda: slugify(None),
+                               many_to_dictionary(document.tags))
+            path = settings.PAPERLESS_FILENAME_FORMAT.format(
+                correspondent=slugify(document.correspondent),
+                title=slugify(document.title),
+                created=slugify(document.created),
+                created_year=document.created.year if document.created else "none",
+                created_month=document.created.month if document.created else "none",
+                created_day=document.created.day if document.created else "none",
+                added=slugify(document.added),
+                added_year=document.added.year if document.added else "none",
+                added_month=document.added.month if document.added else "none",
+                added_day=document.added.day if document.added else "none",
+                tags=tags,
+            )
+    except (ValueError, KeyError, IndexError) as e:
+        logging.getLogger(__name__).warning("Invalid PAPERLESS_FILENAME_FORMAT: {}, falling back to default,".format(settings.PAPERLESS_FILENAME_FORMAT))
 
     # Always append the primary key to guarantee uniqueness of filename
     if len(path) > 0:
diff --git a/src/documents/signals/__init__.py b/src/documents/signals/__init__.py
index 810f14f49..393630008 100644
--- a/src/documents/signals/__init__.py
+++ b/src/documents/signals/__init__.py
@@ -1,5 +1,5 @@
 from django.dispatch import Signal
 
-document_consumption_started = Signal(providing_args=["filename"])
-document_consumption_finished = Signal(providing_args=["document"])
-document_consumer_declaration = Signal(providing_args=[])
+document_consumption_started = Signal()
+document_consumption_finished = Signal()
+document_consumer_declaration = Signal()
diff --git a/src/documents/tests/test_file_handling.py b/src/documents/tests/test_file_handling.py
index 4aced80cb..d44e5056a 100644
--- a/src/documents/tests/test_file_handling.py
+++ b/src/documents/tests/test_file_handling.py
@@ -330,3 +330,21 @@ class TestDate(TestCase):
             os.path.join(tmp, "notempty", "file")), True)
         self.assertEqual(os.path.isdir(
             os.path.join(tmp, "notempty", "empty")), False)
+
+    @override_settings(PAPERLESS_FILENAME_FORMAT="{created/[title]")
+    def test_invalid_format(self):
+        document = Document()
+        document.pk = 1
+        document.file_type = "pdf"
+        document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED
+
+        self.assertEqual(generate_filename(document), "0000001.pdf")
+
+    @override_settings(PAPERLESS_FILENAME_FORMAT="{created__year}")
+    def test_invalid_format_key(self):
+        document = Document()
+        document.pk = 1
+        document.file_type = "pdf"
+        document.storage_type = Document.STORAGE_TYPE_UNENCRYPTED
+
+        self.assertEqual(generate_filename(document), "0000001.pdf")