3 Commits
Author SHA1 Message Date
OpenClaw Sub-agent e5fea82fd2 fix: drop drag&drop upload zone (button only) + direct-first R2 backfill download
- Collection detail: remove the 'Drag & drop images here' zone per 大哥;
  Upload button opens the hidden file picker, progress shown via toast
- migrate_image_storage: download via direct boto3 get_object first,
  presigned URL only as fallback (custom domain 403s for this account even
  with valid creds)
2026-08-03 16:34:14 +10:00
OpenClaw Sub-agent 030e0dc5af fix: backfill via presigned URL instead of direct boto3 API
Direct boto3 calls against the R2 S3 endpoint fail with
SignatureDoesNotMatch for this account, while presigned URLs served
through the R2 custom domain are the path the app already uses. Switch
migrate_image_storage download step to urlopen on the presigned URL.
2026-08-03 16:22:14 +10:00
OpenClaw Sub-agent 366cc35ff5 feat: unify image storage onto files backend + Apple-style collections UI
- Image model: new file OneToOneField → FileUpload; get_url/get_thumbnail_url
  serve via /ui/files/ (Pillow thumbs) with legacy R2 fallback until backfill
- upload_images API now persists through _save_uploaded_file (files backend);
  deletes clean up FileUpload disk+record; collection destroy cascades files
- R2Storage.delete_file implemented (was silently missing → legacy R2 delete no-op)
- manage.py migrate_image_storage: idempotent R2→files backfill (dry-run default,
  --commit, optional --delete-r2); nothing removed from R2 without explicit flag
- Collections list: Apple design system, cover cards, hover actions, mobile-first
- Collection detail: native drag&drop upload (CDN Dropzone removed), lightbox with
  keyboard/swipe nav + description edit + delete, valid JSON image data via json_script
- Slideshow untouched (automatically uses new backend)
- tests: 10 new (upload/delete/URLs/backfill), 148 total green
2026-08-03 16:08:34 +10:00