diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md index 957d5287e..e279e48af 100644 --- a/docs/advanced_usage.md +++ b/docs/advanced_usage.md @@ -126,6 +126,7 @@ script can access the following relevant environment variables set: | ----------------------- | ------------------------------------------------------------ | | `DOCUMENT_SOURCE_PATH` | Original path of the consumed document | | `DOCUMENT_WORKING_PATH` | Path to a copy of the original that consumption will work on | +| `TASK_ID` | UUID of the task used to process the new document (if any) | !!! note @@ -168,21 +169,22 @@ Executed after the consumer has successfully processed a document and has moved it into paperless. It receives the following environment variables: -| Environment Variable | Description | -| ---------------------------- | --------------------------------------------- | -| `DOCUMENT_ID` | Database primary key of the document | -| `DOCUMENT_FILE_NAME` | Formatted filename, not including paths | -| `DOCUMENT_CREATED` | Date & time when document created | -| `DOCUMENT_MODIFIED` | Date & time when document was last modified | -| `DOCUMENT_ADDED` | Date & time when document was added | -| `DOCUMENT_SOURCE_PATH` | Path to the original document file | -| `DOCUMENT_ARCHIVE_PATH` | Path to the generate archive file (if any) | -| `DOCUMENT_THUMBNAIL_PATH` | Path to the generated thumbnail | -| `DOCUMENT_DOWNLOAD_URL` | URL for document download | -| `DOCUMENT_THUMBNAIL_URL` | URL for the document thumbnail | -| `DOCUMENT_CORRESPONDENT` | Assigned correspondent (if any) | -| `DOCUMENT_TAGS` | Comma separated list of tags applied (if any) | -| `DOCUMENT_ORIGINAL_FILENAME` | Filename of original document | +| Environment Variable | Description | +| ---------------------------- | ---------------------------------------------- | +| `DOCUMENT_ID` | Database primary key of the document | +| `DOCUMENT_FILE_NAME` | Formatted filename, not including paths | +| `DOCUMENT_CREATED` | Date & time when document created | +| `DOCUMENT_MODIFIED` | Date & time when document was last modified | +| `DOCUMENT_ADDED` | Date & time when document was added | +| `DOCUMENT_SOURCE_PATH` | Path to the original document file | +| `DOCUMENT_ARCHIVE_PATH` | Path to the generate archive file (if any) | +| `DOCUMENT_THUMBNAIL_PATH` | Path to the generated thumbnail | +| `DOCUMENT_DOWNLOAD_URL` | URL for document download | +| `DOCUMENT_THUMBNAIL_URL` | URL for the document thumbnail | +| `DOCUMENT_CORRESPONDENT` | Assigned correspondent (if any) | +| `DOCUMENT_TAGS` | Comma separated list of tags applied (if any) | +| `DOCUMENT_ORIGINAL_FILENAME` | Filename of original document | +| `TASK_ID` | Task UUID used to import the document (if any) | The script can be in any language, A simple shell script example: diff --git a/src/documents/consumer.py b/src/documents/consumer.py index fa756a3ce..c3e8bd056 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -186,7 +186,7 @@ class Consumer(LoggingMixin): f"Not consuming {self.filename}: Given ASN already exists!", ) - def run_pre_consume_script(self, task_id): + def run_pre_consume_script(self): """ If one is configured and exists, run the pre-consume script and handle its output and/or errors @@ -209,7 +209,7 @@ class Consumer(LoggingMixin): script_env = os.environ.copy() script_env["DOCUMENT_SOURCE_PATH"] = original_file_path script_env["DOCUMENT_WORKING_PATH"] = working_file_path - script_env["TASK_ID"] = task_id + script_env["TASK_ID"] = self.task_id or "" try: completed_proc = run( @@ -234,7 +234,7 @@ class Consumer(LoggingMixin): exception=e, ) - def run_post_consume_script(self, document: Document, task_id): + def run_post_consume_script(self, document: Document): """ If one is configured and exists, run the pre-consume script and handle its output and/or errors @@ -280,7 +280,7 @@ class Consumer(LoggingMixin): ",".join(document.tags.all().values_list("name", flat=True)), ) script_env["DOCUMENT_ORIGINAL_FILENAME"] = str(document.original_filename) - script_env["TASK_ID"] = task_id + script_env["TASK_ID"] = self.task_id or "" try: completed_proc = run( @@ -390,7 +390,7 @@ class Consumer(LoggingMixin): logging_group=self.logging_group, ) - self.run_pre_consume_script(task_id=self.task_id) + self.run_pre_consume_script() def progress_callback(current_progress, max_progress): # pragma: no cover # recalculate progress to be within 20 and 80 @@ -555,7 +555,7 @@ class Consumer(LoggingMixin): document_parser.cleanup() tempdir.cleanup() - self.run_post_consume_script(document, task_id=self.task_id) + self.run_post_consume_script(document) self.log.info(f"Document {document} consumption finished") diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index 3285104b3..bb4577484 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -803,7 +803,7 @@ class PreConsumeTestCase(TestCase): def test_no_pre_consume_script(self, m): c = Consumer() c.path = "path-to-file" - c.run_pre_consume_script(str(uuid.uuid4())) + c.run_pre_consume_script() m.assert_not_called() @mock.patch("documents.consumer.run") @@ -813,7 +813,7 @@ class PreConsumeTestCase(TestCase): c = Consumer() c.filename = "somefile.pdf" c.path = "path-to-file" - self.assertRaises(ConsumerError, c.run_pre_consume_script, str(uuid.uuid4())) + self.assertRaises(ConsumerError, c.run_pre_consume_script) @mock.patch("documents.consumer.run") def test_pre_consume_script(self, m): @@ -822,8 +822,8 @@ class PreConsumeTestCase(TestCase): c = Consumer() c.original_path = "path-to-file" c.path = "/tmp/somewhere/path-to-file" - task_id = str(uuid.uuid4()) - c.run_pre_consume_script(task_id) + c.task_id = str(uuid.uuid4()) + c.run_pre_consume_script() m.assert_called_once() @@ -838,7 +838,7 @@ class PreConsumeTestCase(TestCase): subset = { "DOCUMENT_SOURCE_PATH": c.original_path, "DOCUMENT_WORKING_PATH": c.path, - "TASK_ID": task_id, + "TASK_ID": c.task_id, } self.assertDictEqual(environment, {**environment, **subset}) @@ -867,7 +867,7 @@ class PreConsumeTestCase(TestCase): c = Consumer() c.path = "path-to-file" - c.run_pre_consume_script(str(uuid.uuid4())) + c.run_pre_consume_script() self.assertIn( "INFO:paperless.consumer:This message goes to stdout", cm.output, @@ -902,7 +902,6 @@ class PreConsumeTestCase(TestCase): self.assertRaises( ConsumerError, c.run_pre_consume_script, - str(uuid.uuid4()), ) @@ -924,7 +923,7 @@ class PostConsumeTestCase(TestCase): doc.tags.add(tag1) doc.tags.add(tag2) - Consumer().run_post_consume_script(doc, str(uuid.uuid4())) + Consumer().run_post_consume_script(doc) m.assert_not_called() @@ -938,7 +937,6 @@ class PostConsumeTestCase(TestCase): ConsumerError, c.run_post_consume_script, doc, - str(uuid.uuid4()), ) @mock.patch("documents.consumer.run") @@ -947,7 +945,7 @@ class PostConsumeTestCase(TestCase): with override_settings(POST_CONSUME_SCRIPT=script.name): doc = Document.objects.create(title="Test", mime_type="application/pdf") - Consumer().run_post_consume_script(doc, str(uuid.uuid4())) + Consumer().run_post_consume_script(doc) m.assert_called_once() @@ -965,9 +963,10 @@ class PostConsumeTestCase(TestCase): tag2 = Tag.objects.create(name="b") doc.tags.add(tag1) doc.tags.add(tag2) - task_id = str(uuid.uuid4()) - Consumer().run_post_consume_script(doc, task_id) + consumer = Consumer() + consumer.task_id = str(uuid.uuid4()) + consumer.run_post_consume_script(doc) m.assert_called_once() @@ -989,7 +988,7 @@ class PostConsumeTestCase(TestCase): "DOCUMENT_THUMBNAIL_URL": f"/api/documents/{doc.pk}/thumb/", "DOCUMENT_CORRESPONDENT": "my_bank", "DOCUMENT_TAGS": "a,b", - "TASK_ID": task_id, + "TASK_ID": consumer.task_id, } self.assertDictEqual(environment, {**environment, **subset}) @@ -1018,4 +1017,4 @@ class PostConsumeTestCase(TestCase): doc = Document.objects.create(title="Test", mime_type="application/pdf") c.path = "path-to-file" with self.assertRaises(ConsumerError): - c.run_post_consume_script(doc, str(uuid.uuid4())) + c.run_post_consume_script(doc)