From 5202dc074857ed2bfdcabbdcf5f0ac896f636b8c Mon Sep 17 00:00:00 2001 From: Trenton H <797416+stumpylog@users.noreply.github.com> Date: Fri, 8 May 2026 13:48:47 -0700 Subject: [PATCH] Fix: Clear ContentType/guardian caches at import and test cases (#12758) --- .../management/commands/document_importer.py | 7 +++++++ src/documents/tests/conftest.py | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index 6cb495777..90986858b 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -30,6 +30,7 @@ from django.db.models import Model from django.db.models.signals import m2m_changed from django.db.models.signals import post_save from filelock import FileLock +from guardian.shortcuts import clear_ct_cache from documents.file_handling import create_source_path_directory from documents.management.commands.base import PaperlessCommand @@ -429,6 +430,12 @@ class Command(CryptMixin, PaperlessCommand): self.stdout.write(self.style.ERROR(self._import_error_context_message())) raise + # ContentType/Permission rows were deleted and reinserted above; stale + # in-process caches must be invalidated so permission checks use the + # new IDs rather than pre-import PKs. + ContentType.objects.clear_cache() + clear_ct_cache() + def handle(self, *args, **options) -> None: logging.getLogger().handlers[0].level = logging.ERROR diff --git a/src/documents/tests/conftest.py b/src/documents/tests/conftest.py index 88f0e9d76..07c20c944 100644 --- a/src/documents/tests/conftest.py +++ b/src/documents/tests/conftest.py @@ -8,6 +8,8 @@ from typing import TYPE_CHECKING import filelock import pytest from django.contrib.auth import get_user_model +from django.contrib.contenttypes.models import ContentType +from guardian.shortcuts import clear_ct_cache from pytest_django.fixtures import SettingsWrapper from rest_framework.test import APIClient @@ -158,6 +160,19 @@ def user_client(rest_api_client: APIClient, regular_user: UserModelT) -> APIClie return rest_api_client +@pytest.fixture(autouse=True) +def _clear_content_type_caches() -> None: + """Clear Django's ContentType cache and guardian's lru_cache before each test. + + Tests that delete and reinsert ContentType/Permission rows (e.g. the + importer) corrupt both caches. Without this fixture a subsequent test on + the same xdist worker sees stale ContentType objects and guardian raises + MixedContentTypeError. + """ + ContentType.objects.clear_cache() + clear_ct_cache() + + @pytest.fixture(scope="session", autouse=True) def faker_session_locale(): """Set Faker locale for reproducibility."""