mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Adds the storage paths to the re-tagger command
This commit is contained in:
		@@ -310,6 +310,7 @@ there are tools for it.
 | 
			
		||||
    -c, --correspondent
 | 
			
		||||
    -T, --tags
 | 
			
		||||
    -t, --document_type
 | 
			
		||||
    -s, --storage_path
 | 
			
		||||
    -i, --inbox-only
 | 
			
		||||
    --use-first
 | 
			
		||||
    -f, --overwrite
 | 
			
		||||
@@ -318,7 +319,7 @@ Run this after changing or adding matching rules. It'll loop over all
 | 
			
		||||
of the documents in your database and attempt to match documents
 | 
			
		||||
according to the new rules.
 | 
			
		||||
 | 
			
		||||
Specify any combination of ``-c``, ``-T`` and ``-t`` to have the
 | 
			
		||||
Specify any combination of ``-c``, ``-T``, ``-t`` and ``-s`` to have the
 | 
			
		||||
retagger perform matching of the specified metadata type. If you don't
 | 
			
		||||
specify any of these options, the document retagger won't do anything.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ from documents.models import Document
 | 
			
		||||
 | 
			
		||||
from ...signals.handlers import set_correspondent
 | 
			
		||||
from ...signals.handlers import set_document_type
 | 
			
		||||
from ...signals.handlers import set_storage_path
 | 
			
		||||
from ...signals.handlers import set_tags
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -29,6 +30,7 @@ class Command(BaseCommand):
 | 
			
		||||
        parser.add_argument("-c", "--correspondent", default=False, action="store_true")
 | 
			
		||||
        parser.add_argument("-T", "--tags", default=False, action="store_true")
 | 
			
		||||
        parser.add_argument("-t", "--document_type", default=False, action="store_true")
 | 
			
		||||
        parser.add_argument("-s", "--storage_path", default=False, action="store_true")
 | 
			
		||||
        parser.add_argument("-i", "--inbox-only", default=False, action="store_true")
 | 
			
		||||
        parser.add_argument(
 | 
			
		||||
            "--use-first",
 | 
			
		||||
@@ -112,3 +114,14 @@ class Command(BaseCommand):
 | 
			
		||||
                    base_url=options["base_url"],
 | 
			
		||||
                    color=color,
 | 
			
		||||
                )
 | 
			
		||||
            if options["storage_path"]:
 | 
			
		||||
                set_storage_path(
 | 
			
		||||
                    sender=None,
 | 
			
		||||
                    document=document,
 | 
			
		||||
                    classifier=classifier,
 | 
			
		||||
                    replace=options["overwrite"],
 | 
			
		||||
                    use_first=options["use_first"],
 | 
			
		||||
                    suggest=options["suggest"],
 | 
			
		||||
                    base_url=options["base_url"],
 | 
			
		||||
                    color=color,
 | 
			
		||||
                )
 | 
			
		||||
 
 | 
			
		||||
@@ -291,7 +291,7 @@ def set_storage_path(
 | 
			
		||||
                    )
 | 
			
		||||
                    + f" [{document.pk}]",
 | 
			
		||||
                )
 | 
			
		||||
            print(f"Sugest storage directory {selected}")
 | 
			
		||||
            print(f"Suggest storage directory {selected}")
 | 
			
		||||
        else:
 | 
			
		||||
            logger.info(
 | 
			
		||||
                f"Assigning storage path {selected} to {document}",
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,34 @@ from django.test import TestCase
 | 
			
		||||
from documents.models import Correspondent
 | 
			
		||||
from documents.models import Document
 | 
			
		||||
from documents.models import DocumentType
 | 
			
		||||
from documents.models import StoragePath
 | 
			
		||||
from documents.models import Tag
 | 
			
		||||
from documents.tests.utils import DirectoriesMixin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class TestRetagger(DirectoriesMixin, TestCase):
 | 
			
		||||
    def make_models(self):
 | 
			
		||||
 | 
			
		||||
        self.sp1 = StoragePath.objects.create(
 | 
			
		||||
            name="dummy a",
 | 
			
		||||
            path="{created_data}/{title}",
 | 
			
		||||
            match="auto document",
 | 
			
		||||
            matching_algorithm=StoragePath.MATCH_LITERAL,
 | 
			
		||||
        )
 | 
			
		||||
        self.sp2 = StoragePath.objects.create(
 | 
			
		||||
            name="dummy b",
 | 
			
		||||
            path="{title}",
 | 
			
		||||
            match="^first|^unrelated",
 | 
			
		||||
            matching_algorithm=StoragePath.MATCH_REGEX,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.sp3 = StoragePath.objects.create(
 | 
			
		||||
            name="dummy c",
 | 
			
		||||
            path="{title}",
 | 
			
		||||
            match="^blah",
 | 
			
		||||
            matching_algorithm=StoragePath.MATCH_REGEX,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        self.d1 = Document.objects.create(
 | 
			
		||||
            checksum="A",
 | 
			
		||||
            title="A",
 | 
			
		||||
@@ -23,6 +45,7 @@ class TestRetagger(DirectoriesMixin, TestCase):
 | 
			
		||||
            checksum="C",
 | 
			
		||||
            title="C",
 | 
			
		||||
            content="unrelated document",
 | 
			
		||||
            storage_path=self.sp3,
 | 
			
		||||
        )
 | 
			
		||||
        self.d4 = Document.objects.create(
 | 
			
		||||
            checksum="D",
 | 
			
		||||
@@ -146,15 +169,15 @@ class TestRetagger(DirectoriesMixin, TestCase):
 | 
			
		||||
        call_command("document_retagger", "--document_type", "--suggest")
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.document_type, None)
 | 
			
		||||
        self.assertEqual(d_second.document_type, None)
 | 
			
		||||
        self.assertIsNone(d_first.document_type)
 | 
			
		||||
        self.assertIsNone(d_second.document_type)
 | 
			
		||||
 | 
			
		||||
    def test_add_correspondent_suggest(self):
 | 
			
		||||
        call_command("document_retagger", "--correspondent", "--suggest")
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.correspondent, None)
 | 
			
		||||
        self.assertEqual(d_second.correspondent, None)
 | 
			
		||||
        self.assertIsNone(d_first.correspondent)
 | 
			
		||||
        self.assertIsNone(d_second.correspondent)
 | 
			
		||||
 | 
			
		||||
    def test_add_tags_suggest_url(self):
 | 
			
		||||
        call_command(
 | 
			
		||||
@@ -178,8 +201,8 @@ class TestRetagger(DirectoriesMixin, TestCase):
 | 
			
		||||
        )
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.document_type, None)
 | 
			
		||||
        self.assertEqual(d_second.document_type, None)
 | 
			
		||||
        self.assertIsNone(d_first.document_type)
 | 
			
		||||
        self.assertIsNone(d_second.document_type)
 | 
			
		||||
 | 
			
		||||
    def test_add_correspondent_suggest_url(self):
 | 
			
		||||
        call_command(
 | 
			
		||||
@@ -190,5 +213,48 @@ class TestRetagger(DirectoriesMixin, TestCase):
 | 
			
		||||
        )
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.correspondent, None)
 | 
			
		||||
        self.assertEqual(d_second.correspondent, None)
 | 
			
		||||
        self.assertIsNone(d_first.correspondent)
 | 
			
		||||
        self.assertIsNone(d_second.correspondent)
 | 
			
		||||
 | 
			
		||||
    def test_add_storage_path(self):
 | 
			
		||||
        """
 | 
			
		||||
        GIVEN:
 | 
			
		||||
            - 2 storage paths with documents which match them
 | 
			
		||||
            - 1 document which matches but has a storage path
 | 
			
		||||
        WHEN:
 | 
			
		||||
            - document retagger is called
 | 
			
		||||
        THEN:
 | 
			
		||||
            - Matching document's storage paths updated
 | 
			
		||||
            - Non-matching documents have no storage path
 | 
			
		||||
            - Existing storage patch left unchanged
 | 
			
		||||
        """
 | 
			
		||||
        call_command(
 | 
			
		||||
            "document_retagger",
 | 
			
		||||
            "--storage_path",
 | 
			
		||||
        )
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.storage_path, self.sp2)
 | 
			
		||||
        self.assertEqual(d_auto.storage_path, self.sp1)
 | 
			
		||||
        self.assertIsNone(d_second.storage_path)
 | 
			
		||||
        self.assertEqual(d_unrelated.storage_path, self.sp3)
 | 
			
		||||
 | 
			
		||||
    def test_overwrite_storage_path(self):
 | 
			
		||||
        """
 | 
			
		||||
        GIVEN:
 | 
			
		||||
            - 2 storage paths with documents which match them
 | 
			
		||||
            - 1 document which matches but has a storage path
 | 
			
		||||
        WHEN:
 | 
			
		||||
            - document retagger is called with overwrite
 | 
			
		||||
        THEN:
 | 
			
		||||
            - Matching document's storage paths updated
 | 
			
		||||
            - Non-matching documents have no storage path
 | 
			
		||||
            - Existing storage patch overwritten
 | 
			
		||||
        """
 | 
			
		||||
        call_command("document_retagger", "--storage_path", "--overwrite")
 | 
			
		||||
        d_first, d_second, d_unrelated, d_auto = self.get_updated_docs()
 | 
			
		||||
 | 
			
		||||
        self.assertEqual(d_first.storage_path, self.sp2)
 | 
			
		||||
        self.assertEqual(d_auto.storage_path, self.sp1)
 | 
			
		||||
        self.assertIsNone(d_second.storage_path)
 | 
			
		||||
        self.assertEqual(d_unrelated.storage_path, self.sp2)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user