Coverage for paperless/celery.py: 87%

15 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 09:07 +0000

1import os 

2 

3from celery import Celery 

4from celery.signals import worker_process_init 

5from kombu.serialization import register 

6 

7from paperless.signed_pickle import signed_pickle_dumps 

8from paperless.signed_pickle import signed_pickle_loads 

9 

10# Set the default Django settings module for the 'celery' program. 

11os.environ.setdefault("DJANGO_SETTINGS_MODULE", "paperless.settings") 

12 

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# --------------------------------------------------------------------------- 

20 

21register( 

22 "signed-pickle", 

23 signed_pickle_dumps, 

24 signed_pickle_loads, 

25 content_type="application/x-signed-pickle", 

26 content_encoding="binary", 

27) 

28 

29app = Celery("paperless") 

30 

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") 

36 

37# Load task modules from all registered Django apps. 

38app.autodiscover_tasks() 

39 

40 

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. 

45 

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 

53 

54 init_builtin_parsers()