]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: Clear ContentType/guardian caches at import and test cases (#12758)
authorTrenton H <797416+stumpylog@users.noreply.github.com>
Fri, 8 May 2026 20:48:47 +0000 (13:48 -0700)
committerGitHub <noreply@github.com>
Fri, 8 May 2026 20:48:47 +0000 (20:48 +0000)
src/documents/management/commands/document_importer.py
src/documents/tests/conftest.py

index 6cb4957776c668310e3b9dcd49ab793c109278c9..90986858b120e59699d9769a90871949689365ee 100644 (file)
@@ -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
 
index 88f0e9d76c5c20817186433912053cc610380e43..07c20c94463f5d55e5956e822ac3b1b59400a639 100644 (file)
@@ -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."""