mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Enhancement: log when pre-check fails for documents in trash (#7355)
This commit is contained in:
		| @@ -231,7 +231,9 @@ class ConsumerError(Exception): | ||||
|  | ||||
| class ConsumerStatusShortMessage(str, Enum): | ||||
|     DOCUMENT_ALREADY_EXISTS = "document_already_exists" | ||||
|     DOCUMENT_ALREADY_EXISTS_IN_TRASH = "document_already_exists_in_trash" | ||||
|     ASN_ALREADY_EXISTS = "asn_already_exists" | ||||
|     ASN_ALREADY_EXISTS_IN_TRASH = "asn_already_exists_in_trash" | ||||
|     ASN_RANGE = "asn_value_out_of_range" | ||||
|     FILE_NOT_FOUND = "file_not_found" | ||||
|     PRE_CONSUME_SCRIPT_NOT_FOUND = "pre_consume_script_not_found" | ||||
| @@ -321,12 +323,18 @@ class ConsumerPlugin( | ||||
|             Q(checksum=checksum) | Q(archive_checksum=checksum), | ||||
|         ) | ||||
|         if existing_doc.exists(): | ||||
|             msg = ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS | ||||
|             log_msg = f"Not consuming {self.filename}: It is a duplicate of {existing_doc.get().title} (#{existing_doc.get().pk})." | ||||
|  | ||||
|             if existing_doc.first().deleted_at is not None: | ||||
|                 msg = ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS_IN_TRASH | ||||
|                 log_msg += " Note: existing document is in the trash." | ||||
|  | ||||
|             if settings.CONSUMER_DELETE_DUPLICATES: | ||||
|                 os.unlink(self.input_doc.original_file) | ||||
|             self._fail( | ||||
|                 ConsumerStatusShortMessage.DOCUMENT_ALREADY_EXISTS, | ||||
|                 f"Not consuming {self.filename}: It is a duplicate of" | ||||
|                 f" {existing_doc.get().title} (#{existing_doc.get().pk})", | ||||
|                 msg, | ||||
|                 log_msg, | ||||
|             ) | ||||
|  | ||||
|     def pre_check_directories(self): | ||||
| @@ -358,12 +366,20 @@ class ConsumerPlugin( | ||||
|                 f"[{Document.ARCHIVE_SERIAL_NUMBER_MIN:,}, " | ||||
|                 f"{Document.ARCHIVE_SERIAL_NUMBER_MAX:,}]", | ||||
|             ) | ||||
|         if Document.global_objects.filter( | ||||
|         existing_asn_doc = Document.global_objects.filter( | ||||
|             archive_serial_number=self.metadata.asn, | ||||
|         ).exists(): | ||||
|         ) | ||||
|         if existing_asn_doc.exists(): | ||||
|             msg = ConsumerStatusShortMessage.ASN_ALREADY_EXISTS | ||||
|             log_msg = f"Not consuming {self.filename}: Given ASN {self.metadata.asn} already exists!" | ||||
|  | ||||
|             if existing_asn_doc.first().deleted_at is not None: | ||||
|                 msg = ConsumerStatusShortMessage.ASN_ALREADY_EXISTS_IN_TRASH | ||||
|                 log_msg += " Note: existing document is in the trash." | ||||
|  | ||||
|             self._fail( | ||||
|                 ConsumerStatusShortMessage.ASN_ALREADY_EXISTS, | ||||
|                 f"Not consuming {self.filename}: Given ASN {self.metadata.asn} already exists!", | ||||
|                 msg, | ||||
|                 log_msg, | ||||
|             ) | ||||
|  | ||||
|     def run_pre_consume_script(self): | ||||
|   | ||||
| @@ -322,6 +322,18 @@ class TestConsumer( | ||||
|         shutil.copy(src, dst) | ||||
|         return dst | ||||
|  | ||||
|     def get_test_file2(self): | ||||
|         src = ( | ||||
|             Path(__file__).parent | ||||
|             / "samples" | ||||
|             / "documents" | ||||
|             / "originals" | ||||
|             / "0000002.pdf" | ||||
|         ) | ||||
|         dst = self.dirs.scratch_dir / "sample2.pdf" | ||||
|         shutil.copy(src, dst) | ||||
|         return dst | ||||
|  | ||||
|     def get_test_archive_file(self): | ||||
|         src = ( | ||||
|             Path(__file__).parent / "samples" / "documents" / "archive" / "0000001.pdf" | ||||
| @@ -642,6 +654,47 @@ class TestConsumer( | ||||
|         with self.get_consumer(self.get_test_file()) as consumer: | ||||
|             consumer.run() | ||||
|  | ||||
|     def testDuplicateInTrash(self): | ||||
|         with self.get_consumer(self.get_test_file()) as consumer: | ||||
|             consumer.run() | ||||
|  | ||||
|         Document.objects.all().delete() | ||||
|  | ||||
|         with self.get_consumer(self.get_test_file()) as consumer: | ||||
|             with self.assertRaisesMessage(ConsumerError, "document is in the trash"): | ||||
|                 consumer.run() | ||||
|  | ||||
|     def testAsnExists(self): | ||||
|         with self.get_consumer( | ||||
|             self.get_test_file(), | ||||
|             DocumentMetadataOverrides(asn=123), | ||||
|         ) as consumer: | ||||
|             consumer.run() | ||||
|  | ||||
|         with self.get_consumer( | ||||
|             self.get_test_file2(), | ||||
|             DocumentMetadataOverrides(asn=123), | ||||
|         ) as consumer: | ||||
|             with self.assertRaisesMessage(ConsumerError, "ASN 123 already exists"): | ||||
|                 consumer.run() | ||||
|  | ||||
|     def testAsnExistsInTrash(self): | ||||
|         with self.get_consumer( | ||||
|             self.get_test_file(), | ||||
|             DocumentMetadataOverrides(asn=123), | ||||
|         ) as consumer: | ||||
|             consumer.run() | ||||
|  | ||||
|             document = Document.objects.first() | ||||
|             document.delete() | ||||
|  | ||||
|         with self.get_consumer( | ||||
|             self.get_test_file2(), | ||||
|             DocumentMetadataOverrides(asn=123), | ||||
|         ) as consumer: | ||||
|             with self.assertRaisesMessage(ConsumerError, "document is in the trash"): | ||||
|                 consumer.run() | ||||
|  | ||||
|     @mock.patch("documents.parsers.document_consumer_declaration.send") | ||||
|     def testNoParsers(self, m): | ||||
|         m.return_value = [] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon