Public Access
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.