Both the application form (/odoo-community-developers/) and the self-service
edit form (/freelancer-edit/) now use one shared module, static/photo-upload.js
(window.O4PPhoto), so the limits live in one place:
- validate() decides on the File object BEFORE any read: type allowlist
(image/jpeg, image/png, image/webp) and an 8 MiB cap. A refused file is read
zero bytes and is never submitted.
- downscale() reads, centre-crops square, caps the longest side at 384 px,
encodes JPEG at 0.82 and steps the quality down until the result is <= 80 KiB.
Re-encoding also strips EXIF (a phone photo's GPS does not reach the page) and
refuses a spoofed type that fails to decode.
- The edit form's photo field becomes a real labelled input that keeps the
current photo when untouched; the whole-record save carries it back
byte-identical.
Existing stored photos are untouched, so the directory page is not lighter until
profiles re-upload. accept= is a hint, not validation.