upload: Make closest_thumbnail_format take an HttpRequest.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2025-06-06 14:09:18 -07:00
committed by Tim Abbott
parent f3e12b2403
commit 6006ba4c44
2 changed files with 22 additions and 20 deletions

View File

@@ -6,7 +6,7 @@ from unittest.mock import patch
import orjson
import pyvips
from django.conf import settings
from django.http.request import MediaType
from django.http import HttpRequest
from django.test import override_settings
from zerver.lib.test_classes import ZulipTestCase
@@ -920,13 +920,14 @@ class TestThumbnailRetrieval(ZulipTestCase):
rendered_formats = [
StoredThumbnailFormat(**data) for data in image_attachment.thumbnail_metadata
]
accepts = [MediaType("image/webp"), MediaType("image/*"), MediaType("*/*;q=0.8")]
request = HttpRequest()
request.META["HTTP_ACCEPT"] = "image/webp, image/*, */*;q=0.8"
# Prefer to match -animated, even though we have a .gif
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("gif", 100, 75, animated=True), accepts, rendered_formats
ThumbnailFormat("gif", 100, 75, animated=True), request, rendered_formats
)
),
"100x75-anim.webp",
@@ -936,7 +937,7 @@ class TestThumbnailRetrieval(ZulipTestCase):
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("gif", 10, 10, animated=False), accepts, rendered_formats
ThumbnailFormat("gif", 10, 10, animated=False), request, rendered_formats
)
),
"100x75.gif",
@@ -946,37 +947,39 @@ class TestThumbnailRetrieval(ZulipTestCase):
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("tif", 10, 10, animated=False), accepts, rendered_formats
ThumbnailFormat("tif", 10, 10, animated=False), request, rendered_formats
)
),
"10x10.webp",
)
request = HttpRequest()
request.META["HTTP_ACCEPT"] = "image/webp;q=0.9, image/gif"
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("tif", 10, 10, animated=False),
[MediaType("image/webp;q=0.9"), MediaType("image/gif")],
rendered_formats,
ThumbnailFormat("tif", 10, 10, animated=False), request, rendered_formats
)
),
"100x75.gif",
)
request = HttpRequest()
request.META["HTTP_ACCEPT"] = "image/gif"
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("tif", 10, 10, animated=False),
[MediaType("image/gif")],
rendered_formats,
ThumbnailFormat("tif", 10, 10, animated=False), request, rendered_formats
)
),
"100x75.gif",
)
# Closest width
request = HttpRequest()
request.META["HTTP_ACCEPT"] = "image/webp, image/*, */*;q=0.8"
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("webp", 20, 100, animated=False), accepts, rendered_formats
ThumbnailFormat("webp", 20, 100, animated=False), request, rendered_formats
)
),
"10x10.webp",
@@ -984,19 +987,19 @@ class TestThumbnailRetrieval(ZulipTestCase):
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("webp", 80, 10, animated=False), accepts, rendered_formats
ThumbnailFormat("webp", 80, 10, animated=False), request, rendered_formats
)
),
"100x75.webp",
)
# Smallest filesize if they have no media preference
request = HttpRequest()
request.META["HTTP_ACCEPT"] = "image/gif, image/webp"
self.assertEqual(
str(
closest_thumbnail_format(
ThumbnailFormat("tif", 100, 75, animated=False),
[MediaType("image/gif"), MediaType("image/webp")],
rendered_formats,
ThumbnailFormat("tif", 100, 75, animated=False), request, rendered_formats
)
),
"100x75.webp",

View File

@@ -17,7 +17,6 @@ from django.http import (
HttpResponseForbidden,
HttpResponseNotFound,
)
from django.http.request import MediaType
from django.shortcuts import redirect
from django.urls import reverse
from django.utils.cache import patch_cache_control, patch_vary_headers
@@ -213,11 +212,11 @@ def preferred_accept(request: HttpRequest, served_types: list[str]) -> str | Non
def closest_thumbnail_format(
requested_format: BaseThumbnailFormat,
accepts: list[MediaType],
request: HttpRequest,
rendered_formats: list[StoredThumbnailFormat],
) -> StoredThumbnailFormat:
accepted_types = sorted(
accepts,
request.accepted_types,
key=lambda e: float(e.params.get("q", "1.0")),
reverse=True,
)
@@ -331,7 +330,7 @@ def serve_file(
# set, or the client is just guessing a format and
# hoping.
requested_format = closest_thumbnail_format(
requested_format, request.accepted_types, rendered_formats
requested_format, request, rendered_formats
)
elif requested_format not in rendered_formats:
# They requested a valid format, but one we've not