forked from erp-dev/erp
feat: sse && multi_merchant completed
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
from rest_framework import serializers
|
||||
from basic_info import models as basic_models
|
||||
import logging
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class BaseSerializer(serializers.ModelSerializer):
|
||||
@@ -9,14 +13,20 @@ class BaseSerializer(serializers.ModelSerializer):
|
||||
)
|
||||
|
||||
def to_representation(self, instance):
|
||||
try:
|
||||
merchant = self.context['request'].user.employee.merchant
|
||||
if instance.merchant != merchant:
|
||||
# 数据保护手段
|
||||
# 检查是否有 request context,以及是否需要进行权限验证
|
||||
request = self.context.get('request')
|
||||
|
||||
if request and hasattr(request, 'user') and hasattr(request.user, 'employee'):
|
||||
try:
|
||||
merchant = request.user.employee.merchant
|
||||
if instance.merchant != merchant:
|
||||
# 数据保护手段
|
||||
logger.warning(f"用户 {request.user.username} 无权限访问对象 {type(instance).__name__} {instance.id}")
|
||||
raise PermissionError("无权限访问该对象")
|
||||
except AttributeError as e:
|
||||
# 用户没有 employee 属性
|
||||
logger.warning(f"用户权限验证失败: {str(e)}")
|
||||
raise PermissionError("无权限访问该对象")
|
||||
except (KeyError, AttributeError):
|
||||
# TODO: log something?
|
||||
raise PermissionError("无权限访问该对象")
|
||||
|
||||
result = super().to_representation(instance)
|
||||
if self.context.get('expand_merchant', False):
|
||||
@@ -40,9 +50,32 @@ class ProductCategorySerializer(BaseSerializer):
|
||||
|
||||
|
||||
class ProductSerializer(BaseSerializer):
|
||||
# 图片字段:读取时返回完整 URL,写入时接受文件上传或 URL
|
||||
image = serializers.ImageField(required=False, allow_null=True)
|
||||
image_url = serializers.SerializerMethodField(read_only=True)
|
||||
|
||||
class Meta:
|
||||
model = basic_models.Product
|
||||
fields = '__all__'
|
||||
|
||||
def get_image_url(self, obj):
|
||||
"""
|
||||
获取图片的完整 URL
|
||||
|
||||
返回:
|
||||
- 如果有图片:返回完整 URL(七牛云 CDN 地址)
|
||||
- 如果没有图片:返回 None
|
||||
"""
|
||||
if obj.image:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
# 使用 request.build_absolute_uri 构建完整 URL
|
||||
return request.build_absolute_uri(obj.image.url)
|
||||
else:
|
||||
# 没有 request context 时,返回相对 URL
|
||||
# 七牛云存储会自动返回完整 URL
|
||||
return obj.image.url
|
||||
return None
|
||||
|
||||
def to_representation(self, instance):
|
||||
result = super().to_representation(instance)
|
||||
@@ -50,6 +83,9 @@ class ProductSerializer(BaseSerializer):
|
||||
'id': instance.category.id,
|
||||
'name': instance.category.name
|
||||
}
|
||||
|
||||
# 如果使用七牛云,image 字段已经是完整 URL,添加额外的 image_url 方便前端使用
|
||||
# 前端可以使用 image 或 image_url,两者内容相同
|
||||
return result
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user