Coverage for paperless/celery.py: 87%
15 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 09:07 +0000
1import os
3from celery import Celery
4from celery.signals import worker_process_init
5from kombu.serialization import register
7from paperless.signed_pickle import signed_pickle_dumps
8from paperless.signed_pickle import signed_pickle_loads
10# Set the default Django settings module for the 'celery' program.
11os.environ.setdefault("DJANGO_SETTINGS_MODULE", "paperless.settings")
13# ---------------------------------------------------------------------------
14# Signed-pickle serializer: pickle with HMAC-SHA256 integrity verification.
15#
16# Protects against malicious pickle injection via an exposed Redis broker.
17# Messages are signed on the producer side and verified before deserialization
18# on the worker side using Django's SECRET_KEY.
19# ---------------------------------------------------------------------------
21register(
22 "signed-pickle",
23 signed_pickle_dumps,
24 signed_pickle_loads,
25 content_type="application/x-signed-pickle",
26 content_encoding="binary",
27)
29app = Celery("paperless")
31# Using a string here means the worker doesn't have to serialize
32# the configuration object to child processes.
33# - namespace='CELERY' means all celery-related configuration keys
34# should have a `CELERY_` prefix.
35app.config_from_object("django.conf:settings", namespace="CELERY")
37# Load task modules from all registered Django apps.
38app.autodiscover_tasks()
41@worker_process_init.connect
42def on_worker_process_init(**kwargs) -> None: # pragma: no cover
43 """
44 Register built-in parsers eagerly in each Celery worker process.
46 This registers only the built-in parsers (no entrypoint discovery) so
47 that workers can begin consuming documents immediately. Entrypoint
48 discovery for third-party parsers is deferred to the first call of
49 get_parser_registry() inside a task, keeping worker_process_init
50 well within its 4-second timeout budget.
51 """
52 from paperless.parsers.registry import init_builtin_parsers
54 init_builtin_parsers()