e61d05fc41
ALLOWED_IMAGE_TYPES, MAX_IMAGE_BYTES, and unique_image_name() were duplicated identically in both the edit and serve servers. Centralising them means a single change point for any future extension (e.g. adding image/avif support). Tests added in tests/test_shared_images.py cover no-collision, single and chained collisions, no-suffix filenames, and constant values.
24 lines
696 B
Python
24 lines
696 B
Python
"""Shared image upload utilities used by both the edit and serve servers."""
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
ALLOWED_IMAGE_TYPES: frozenset[str] = frozenset({
|
|
"image/jpeg",
|
|
"image/png",
|
|
"image/webp",
|
|
"image/gif",
|
|
})
|
|
MAX_IMAGE_BYTES: int = 10 * 1024 * 1024 # 10 MB
|
|
|
|
|
|
def unique_image_name(directory: Path, filename: str) -> str:
|
|
"""Return a filename that does not collide with existing files in directory."""
|
|
stem, suffix = Path(filename).stem, Path(filename).suffix
|
|
candidate = filename
|
|
counter = 1
|
|
while (directory / candidate).exists():
|
|
candidate = f"{stem}_{counter}{suffix}"
|
|
counter += 1
|
|
return candidate
|