From 28f54bb592985db4390400c6d29e693dd9764dee Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 30 Oct 2026 08:17:07 -0700 Subject: [PATCH] Chore: Import dateparser lazily so processes that never parse dates skip it --- src/documents/filters.py | 3 ++- src/documents/plugins/date_parsing/base.py | 4 ++-- src/documents/tests/date_parsing/test_date_parsing.py | 8 ++++---- src/paperless/settings/custom.py | 3 ++- src/paperless/tests/test_utils.py | 5 ++++- src/paperless/utils.py | 4 ++-- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/documents/filters.py b/src/documents/filters.py index 00a47552d..2c6cfb269 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -11,7 +11,6 @@ from decimal import InvalidOperation from typing import TYPE_CHECKING from typing import Any -import dateparser from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.db.models import Case @@ -350,6 +349,8 @@ class DateQueryField(serializers.DateField): if not isinstance(value, str): raise + import dateparser + try: parsed = dateparser.parse( value, diff --git a/src/documents/plugins/date_parsing/base.py b/src/documents/plugins/date_parsing/base.py index fd45ceec8..af393b577 100644 --- a/src/documents/plugins/date_parsing/base.py +++ b/src/documents/plugins/date_parsing/base.py @@ -7,8 +7,6 @@ from dataclasses import dataclass from types import TracebackType from typing import Self -import dateparser - logger = logging.getLogger(__name__) @@ -80,6 +78,8 @@ class DateParserPluginBase(ABC): Uses configuration from `self.config`. """ + import dateparser + try: return dateparser.parse( date_string, diff --git a/src/documents/tests/date_parsing/test_date_parsing.py b/src/documents/tests/date_parsing/test_date_parsing.py index f43303d22..c7de0c370 100644 --- a/src/documents/tests/date_parsing/test_date_parsing.py +++ b/src/documents/tests/date_parsing/test_date_parsing.py @@ -71,7 +71,7 @@ class TestParseString: ): # We still need to mock dateparser.parse to force the exception mocker.patch( - "documents.plugins.date_parsing.base.dateparser.parse", + "dateparser.parse", side_effect=ValueError( "Parsing error: 01/01/2024", ), @@ -260,7 +260,7 @@ class TestRegexDateParser: parser = RegexDateParserPlugin(base_config) # Patch the dateparser.parse - target = "documents.plugins.date_parsing.base.dateparser.parse" + target = "dateparser.parse" def fake_parse( date_string: str, @@ -335,7 +335,7 @@ class TestRegexDateParser: ) parser = RegexDateParserPlugin(cfg) - target = "documents.plugins.date_parsing.base.dateparser.parse" + target = "dateparser.parse" def fake_parse( date_string: str, @@ -400,7 +400,7 @@ class TestRegexDateParser: parser = RegexDateParserPlugin(cfg) # Patch the module's dateparser.parse so we can inspect calls - target = "documents.plugins.date_parsing.base.dateparser.parse" + target = "dateparser.parse" def fake_parse( date_string: str, diff --git a/src/paperless/settings/custom.py b/src/paperless/settings/custom.py index 2bf53a8cc..7b5b5a749 100644 --- a/src/paperless/settings/custom.py +++ b/src/paperless/settings/custom.py @@ -6,7 +6,6 @@ from pathlib import Path from typing import Any from celery.schedules import crontab -from dateparser.languages.loader import LocaleDataLoader from paperless.settings.parsers import get_choice_from_env from paperless.settings.parsers import get_int_from_env @@ -352,6 +351,8 @@ def parse_dateparser_languages(languages: str | None) -> list[str]: ) language_list.append("zh") + from dateparser.languages.loader import LocaleDataLoader + return list(LocaleDataLoader().get_locale_map(locales=language_list)) diff --git a/src/paperless/tests/test_utils.py b/src/paperless/tests/test_utils.py index 152913867..8dedc8854 100644 --- a/src/paperless/tests/test_utils.py +++ b/src/paperless/tests/test_utils.py @@ -59,7 +59,10 @@ def test_ocr_to_dateparser_languages_exception( raise RuntimeError("Simulated error") with caplog.at_level(logging.WARNING): - monkeypatch.setattr(utils, "LocaleDataLoader", lambda: DummyLoader()) + monkeypatch.setattr( + "dateparser.languages.loader.LocaleDataLoader", + lambda: DummyLoader(), + ) result = utils.ocr_to_dateparser_languages("eng+fra") assert result == [] assert ( diff --git a/src/paperless/utils.py b/src/paperless/utils.py index 46269588c..9380901bf 100644 --- a/src/paperless/utils.py +++ b/src/paperless/utils.py @@ -1,7 +1,5 @@ import logging -from dateparser.languages.loader import LocaleDataLoader - logger = logging.getLogger("paperless.utils") OCR_TO_DATEPARSER_LANGUAGES = { @@ -125,6 +123,8 @@ def ocr_to_dateparser_languages(ocr_languages: str) -> list[str]: - If a language cannot be mapped or validated, it is skipped with a warning. - Returns a list of valid locales, or an empty list if none could be converted. """ + from dateparser.languages.loader import LocaleDataLoader + loader = LocaleDataLoader() result = [] try: