The prior commit wired MinIO as Django's default storage backend but kept plain ImageField multipart uploads through the Django backend and public-bucket direct URLs — not how campaign/advertising/promotions do it. Rework to match: image fields (ProductCategory.icon, Product.image, StoreCategory.icon, Store.logo, Store.cover_image) now store an opaque MinIO object_key (CharField) instead of a Django-managed file. - utils/clients/minio_client.py — raw Minio SDK client, same shape as the other services. - apps/core/views/media.py — POST /api/media/presign/ mints a 30-minute presigned PUT URL + object_key; the client uploads bytes directly to MinIO, then submits the object_key on the owning resource. - apps/core/media.py — presigned_media_url() helper; every serializer with an image field now also exposes a `<field>_url` computed from a fresh 1-hour presigned GET, rather than trusting a stored/direct URL. - FRONTEND_GUIDE.md updated to document the new upload flow and field shapes (object_key vs `_url`), replacing the stale "no upload endpoint yet" note. Verified against a live local MinIO container: presign → direct PUT upload → object_key stored on the model → serializer mints a working presigned GET URL → URL fetches the uploaded bytes. Also exercised the actual DRF view (POST /api/media/presign/) end-to-end, including the 401 on an unauthenticated request.
21 lines
663 B
Python
21 lines
663 B
Python
import logging
|
|
from datetime import timedelta
|
|
|
|
from django.conf import settings
|
|
|
|
from utils.clients.minio_client import minio_client
|
|
|
|
logger = logging.getLogger('winofy.media')
|
|
|
|
|
|
def presigned_media_url(object_key, expires=timedelta(hours=1)):
|
|
"""Mints a fresh presigned GET URL for a stored MinIO object_key, or None if unset/unreachable."""
|
|
if not object_key:
|
|
return None
|
|
try:
|
|
return minio_client.presigned_get_object(
|
|
settings.MINIO_MEDIA_FILES_BUCKET, object_key, expires=expires,
|
|
)
|
|
except Exception:
|
|
logger.exception('Failed to presign media url for object_key=%s', object_key)
|
|
return None
|