diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index f9cadcc5a..c37cbcfb0 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -1452,12 +1452,9 @@ def run_zone_ocr_on_type_change(sender, instance, *, created=False, **kwargs): if old_type == instance.document_type_id: return - from documents.models import OcrTemplate + from documents.zone_ocr import get_templates_for_document - if not OcrTemplate.objects.filter( - document_type_id=instance.document_type_id, - enabled=True, - ).exists(): + if not get_templates_for_document(instance).exists(): return try: diff --git a/src/documents/views.py b/src/documents/views.py index fb03aa8bc..37ca9fa0a 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2312,10 +2312,9 @@ class DocumentViewSet( {"status": "skipped", "reason": "no_document_type", "results": []}, ) - templates = OcrTemplate.objects.filter( - document_type_id=document.document_type_id, - enabled=True, - ) + from documents.zone_ocr import get_templates_for_document + + templates = get_templates_for_document(document) if not templates.exists(): return Response( {"status": "skipped", "reason": "no_template", "results": []}, diff --git a/src/documents/zone_ocr.py b/src/documents/zone_ocr.py index 1bc1757b6..5fa1b403e 100644 --- a/src/documents/zone_ocr.py +++ b/src/documents/zone_ocr.py @@ -26,11 +26,30 @@ from documents.models import CustomFieldInstance from documents.models import Document from documents.models import OcrTemplate from documents.models import OcrTemplateZone +from documents.permissions import permitted_object_ids from documents.regex import safe_regex_fullmatch +from documents.versioning import get_root_document logger = logging.getLogger("paperless.zone_ocr") +def get_templates_for_document(document: Document): + """ + The enabled templates for the document's type that its owner can view, the + same rule as matching. A version is owned through its root document. + """ + templates = OcrTemplate.objects.filter( + document_type_id=document.document_type_id, + enabled=True, + ) + owner = get_root_document(document).owner + if owner is not None: + templates = templates.filter( + id__in=permitted_object_ids(owner, OcrTemplate, "view_ocrtemplate"), + ) + return templates + + def run_zone_extraction( document: Document, original_file: Path | None, @@ -42,10 +61,10 @@ def run_zone_extraction( if not document.document_type_id: return - templates = OcrTemplate.objects.filter( - document_type_id=document.document_type_id, - enabled=True, - ).prefetch_related("zones", "zones__custom_field") + templates = get_templates_for_document(document).prefetch_related( + "zones", + "zones__custom_field", + ) if not templates.exists(): return