]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: better handle favicon with static dir (#10107)
authorshamoon <4887959+shamoon@users.noreply.github.com>
Tue, 3 Jun 2025 15:05:59 +0000 (08:05 -0700)
committerGitHub <noreply@github.com>
Tue, 3 Jun 2025 15:05:59 +0000 (08:05 -0700)
pyproject.toml
src/paperless/tests/test_views.py [new file with mode: 0644]
src/paperless/views.py

index c9bd7b7d1a1c8ada9de05607eb6cf3fa461473c4..7e8ad1f610bf229f1a74789abf3f76741353db50 100644 (file)
@@ -239,9 +239,6 @@ lint.per-file-ignores."src/paperless/checks.py" = [
 lint.per-file-ignores."src/paperless/settings.py" = [
   "PTH",
 ] # TODO Enable & remove
-lint.per-file-ignores."src/paperless/views.py" = [
-  "PTH",
-] # TODO Enable & remove
 lint.per-file-ignores."src/paperless_mail/mail.py" = [
   "PTH",
 ] # TODO Enable & remove
diff --git a/src/paperless/tests/test_views.py b/src/paperless/tests/test_views.py
new file mode 100644 (file)
index 0000000..76bf694
--- /dev/null
@@ -0,0 +1,25 @@
+import tempfile
+from pathlib import Path
+
+from django.conf import settings
+
+
+def test_favicon_view(client):
+    with tempfile.TemporaryDirectory() as tmpdir:
+        static_dir = Path(tmpdir)
+        favicon_path = static_dir / "paperless" / "img" / "favicon.ico"
+        favicon_path.parent.mkdir(parents=True, exist_ok=True)
+        favicon_path.write_bytes(b"FAKE ICON DATA")
+
+        settings.STATIC_ROOT = static_dir
+
+        response = client.get("/favicon.ico")
+        assert response.status_code == 200
+        assert response["Content-Type"] == "image/x-icon"
+        assert b"".join(response.streaming_content) == b"FAKE ICON DATA"
+
+
+def test_favicon_view_missing_file(client):
+    settings.STATIC_ROOT = Path(tempfile.mkdtemp())
+    response = client.get("/favicon.ico")
+    assert response.status_code == 404
index 050bb3f612955b2dbdd8b1283172eab45c7a2783..4d102029f92aadac70c69f552cf5080f246070d3 100644 (file)
@@ -1,5 +1,5 @@
-import os
 from collections import OrderedDict
+from pathlib import Path
 
 from allauth.mfa import signals
 from allauth.mfa.adapter import get_adapter as get_mfa_adapter
@@ -11,8 +11,9 @@ from allauth.socialaccount.adapter import get_adapter
 from allauth.socialaccount.models import SocialAccount
 from django.contrib.auth.models import Group
 from django.contrib.auth.models import User
+from django.contrib.staticfiles.storage import staticfiles_storage
 from django.db.models.functions import Lower
-from django.http import HttpResponse
+from django.http import FileResponse
 from django.http import HttpResponseBadRequest
 from django.http import HttpResponseForbidden
 from django.http import HttpResponseNotFound
@@ -92,16 +93,12 @@ class StandardPagination(PageNumberPagination):
 
 
 class FaviconView(View):
-    def get(self, request, *args, **kwargs):  # pragma: no cover
-        favicon = os.path.join(
-            os.path.dirname(__file__),
-            "static",
-            "paperless",
-            "img",
-            "favicon.ico",
-        )
-        with open(favicon, "rb") as f:
-            return HttpResponse(f, content_type="image/x-icon")
+    def get(self, request, *args, **kwargs):
+        try:
+            path = Path(staticfiles_storage.path("paperless/img/favicon.ico"))
+            return FileResponse(path.open("rb"), content_type="image/x-icon")
+        except FileNotFoundError:
+            return HttpResponseNotFound("favicon.ico not found")
 
 
 class UserViewSet(ModelViewSet):