feat: implement seller central backend api views and serializers
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 37s

This commit is contained in:
vickytechkey 2026-10-25 18:37:40 +05:30
parent 18f6c42c83
commit c63936a2e5
2 changed files with 52 additions and 14 deletions

View file

@ -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

View file

@ -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}"