fix: collision names must survive the sanitiser the content view applies

unique_filename produced 'manual (2).pdf'; HouseplanContentView sanitises the
name in the REQUEST too, turning ' (2)' into '_2_', so the file was written and
then 404'd. The same pattern was already in files/migrate, so a rebind that hit
a name collision has been producing dead links. Both use the shared helper now,
with '-2', which round-trips sanitize_filename — asserted.
This commit is contained in:
Matysh
2026-07-28 16:16:07 +03:00
parent 4418312b0b
commit a49b5e6d2e
7 changed files with 35 additions and 20 deletions
+5 -1
View File
@@ -35,7 +35,11 @@ def unique_filename(directory: Path, name: str) -> str:
stem, suffix = safe, ""
i = 2
while True:
candidate = f"{stem} ({i}){'.' + suffix if suffix else ''}"
# "-2", not " (2)": the content view sanitizes the name in the REQUEST
# too, and a space or a bracket there turns into "_", so a file called
# "manual (2).pdf" was written and then never served. Only characters
# that survive sanitize_filename may be used to build a name.
candidate = f"{stem}-{i}{'.' + suffix if suffix else ''}"
if not (directory / candidate).exists():
return candidate
i += 1