feat: implement seller central backend api views and serializers
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 37s
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 37s
This commit is contained in:
parent
18f6c42c83
commit
c63936a2e5
2 changed files with 52 additions and 14 deletions
|
|
@ -60,16 +60,14 @@ class SupplierOnboardingDraftSerializer(serializers.ModelSerializer):
|
|||
def get_logo_url(self, obj):
|
||||
from .views import get_document_url
|
||||
request = self.context.get('request')
|
||||
if obj.logo_s3_key:
|
||||
return get_document_url(obj.logo_s3_key, request)
|
||||
return obj.store_logo
|
||||
key_or_url = obj.logo_s3_key or getattr(obj, 'logo_url', None) or getattr(obj, 'store_logo', None)
|
||||
return get_document_url(key_or_url, request) if key_or_url else None
|
||||
|
||||
def get_banner_url(self, obj):
|
||||
from .views import get_document_url
|
||||
request = self.context.get('request')
|
||||
if obj.banner_s3_key:
|
||||
return get_document_url(obj.banner_s3_key, request)
|
||||
return obj.banner_url
|
||||
key_or_url = obj.banner_s3_key or getattr(obj, 'banner_url', None)
|
||||
return get_document_url(key_or_url, request) if key_or_url else None
|
||||
|
||||
class SupplierProfileSerializer(serializers.ModelSerializer):
|
||||
onboarding_step = serializers.SerializerMethodField()
|
||||
|
|
@ -102,16 +100,14 @@ class SupplierProfileSerializer(serializers.ModelSerializer):
|
|||
def get_logo_url(self, obj):
|
||||
from .views import get_document_url
|
||||
request = self.context.get('request')
|
||||
if obj.logo_s3_key:
|
||||
return get_document_url(obj.logo_s3_key, request)
|
||||
return obj.store_logo
|
||||
key_or_url = obj.logo_s3_key or getattr(obj, 'store_logo', None) or getattr(obj, 'logo_url', None) or getattr(obj, 'artisan_avatar', None)
|
||||
return get_document_url(key_or_url, request) if key_or_url else None
|
||||
|
||||
def get_banner_url(self, obj):
|
||||
from .views import get_document_url
|
||||
request = self.context.get('request')
|
||||
if obj.banner_s3_key:
|
||||
return get_document_url(obj.banner_s3_key, request)
|
||||
return obj.banner_url
|
||||
key_or_url = obj.banner_s3_key or getattr(obj, 'banner_url', None)
|
||||
return get_document_url(key_or_url, request) if key_or_url else None
|
||||
|
||||
def get_onboarding_step(self, obj):
|
||||
if obj.is_profile_complete:
|
||||
|
|
@ -300,6 +296,18 @@ class ProductSerializer(serializers.ModelSerializer):
|
|||
fields = '__all__'
|
||||
read_only_fields = ('supplier',)
|
||||
|
||||
def to_representation(self, instance):
|
||||
data = super().to_representation(instance)
|
||||
from .views import get_document_url
|
||||
request = self.context.get('request')
|
||||
img = data.get('image')
|
||||
if img:
|
||||
data['image'] = get_document_url(img, request)
|
||||
add_imgs = data.get('additional_images')
|
||||
if isinstance(add_imgs, list):
|
||||
data['additional_images'] = [get_document_url(ai, request) for ai in add_imgs]
|
||||
return data
|
||||
|
||||
def get_is_low_stock(self, obj):
|
||||
return obj.stock <= 5
|
||||
|
||||
|
|
|
|||
34
api/views.py
34
api/views.py
|
|
@ -884,20 +884,50 @@ def get_document_url(s3_key, request=None):
|
|||
if not s3_key:
|
||||
return None
|
||||
|
||||
# Extract S3 key if a full S3 or mock URL was passed
|
||||
s3_key_str = str(s3_key).strip()
|
||||
if s3_key_str.startswith(('http://', 'https://')):
|
||||
if 'amazonaws.com/' in s3_key_str:
|
||||
s3_key = s3_key_str.split('.amazonaws.com/')[-1].split('?')[0]
|
||||
elif 'mock-download/?key=' in s3_key_str:
|
||||
s3_key = s3_key_str.split('mock-download/?key=')[-1].split('&')[0]
|
||||
else:
|
||||
return s3_key_str
|
||||
|
||||
# 1. CloudFront distribution
|
||||
cloudfront_domain = getattr(settings, 'AWS_CLOUDFRONT_DOMAIN', None)
|
||||
if cloudfront_domain:
|
||||
domain = cloudfront_domain.replace('https://', '').replace('http://', '').strip('/')
|
||||
return f"https://{domain}/{s3_key}"
|
||||
|
||||
# 2. AWS S3 fallback
|
||||
# 2. AWS S3 presigned GET URL fallback
|
||||
aws_access = os.environ.get('AWS_ACCESS_KEY_ID') or os.environ.get('AWS_ACCESS_KEY')
|
||||
aws_secret = os.environ.get('AWS_SECRET_ACCESS_KEY') or os.environ.get('AWS_SECRET_KEY')
|
||||
bucket_name = os.environ.get('AWS_STORAGE_BUCKET_NAME') or os.environ.get('AWS_BUCKET_NAME') or 'betasupplierdocumentstorage'
|
||||
region_name = os.environ.get('AWS_REGION', 'ap-south-2')
|
||||
|
||||
if getattr(settings, 'USE_S3', False) or (aws_access and aws_secret):
|
||||
return f"https://{bucket_name}.s3.{region_name}.amazonaws.com/{s3_key}"
|
||||
try:
|
||||
import boto3
|
||||
from botocore.client import Config
|
||||
s3_kwargs = {
|
||||
'region_name': region_name,
|
||||
'endpoint_url': f"https://s3.{region_name}.amazonaws.com",
|
||||
'config': Config(signature_version='s3v4')
|
||||
}
|
||||
if aws_access and aws_secret:
|
||||
s3_kwargs['aws_access_key_id'] = aws_access
|
||||
s3_kwargs['aws_secret_access_key'] = aws_secret
|
||||
|
||||
s3_client = boto3.client('s3', **s3_kwargs)
|
||||
return s3_client.generate_presigned_url(
|
||||
'get_object',
|
||||
Params={'Bucket': bucket_name, 'Key': s3_key},
|
||||
ExpiresIn=604800 # 7 days
|
||||
)
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to generate presigned GET url for {s3_key}: {e}")
|
||||
return f"https://{bucket_name}.s3.{region_name}.amazonaws.com/{s3_key}"
|
||||
|
||||
# 3. Local Mock fallback
|
||||
path = f"/api/profile/mock-download/?key={s3_key}"
|
||||
|
|
|
|||
Loading…
Reference in a new issue