下载权限(files/permissions.py)
允许下载当且仅当:
- 全局 admin,或
uploaded_by 是自己,或
- 该文件是自己的申请档案简历,或
- chair 对候选人可见(本部门申请,或已进全局人才池),或
- 是某申请附件且用户是申请人,或 chair 在该 cycle 的 scope 内
不要直接把存储 URL 暴露给浏览器(R2 对象默认无公开 ACL)。
File.preview_kind 区分 pdf / image。前端 static/js/file-preview-modal.js。