forked from erp-dev/erp
125 lines
4.6 KiB
Python
125 lines
4.6 KiB
Python
from django.contrib.auth.models import User
|
|
from rest_framework.decorators import permission_classes
|
|
from rest_framework.permissions import IsAuthenticated, DjangoModelPermissions
|
|
from rest_framework.response import Response
|
|
from rest_framework import status, serializers
|
|
from rest_framework.generics import GenericAPIView
|
|
|
|
from flower.viewsets import LimitedLimitOffsetPagination
|
|
from basic_info.models import UserProfile
|
|
|
|
|
|
class UserCreationSerializer(serializers.Serializer):
|
|
"""用户创建序列化器"""
|
|
username = serializers.CharField(max_length=150)
|
|
email = serializers.EmailField(required=False)
|
|
password = serializers.CharField(min_length=6, write_only=True)
|
|
is_staff = serializers.BooleanField(default=False)
|
|
description = serializers.CharField(required=False, allow_blank=True)
|
|
merchant_id = serializers.IntegerField()
|
|
|
|
def validate_username(self, value):
|
|
"""验证用户名是否已存在"""
|
|
if User.objects.filter(username=value).exists():
|
|
raise serializers.ValidationError("用户名已存在")
|
|
return value
|
|
|
|
def validate_merchant_id(self, value):
|
|
"""验证merchant_id是否存在"""
|
|
from basic_info.models import Merchant
|
|
if not Merchant.objects.filter(id=value).exists():
|
|
raise serializers.ValidationError("商户不存在")
|
|
return value
|
|
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
"""用户信息序列化器"""
|
|
class Meta:
|
|
model = User
|
|
fields = ['id', 'username', 'email', 'is_staff', 'is_active', 'date_joined']
|
|
|
|
|
|
class UserProfileDetailSerializer(serializers.ModelSerializer):
|
|
"""用户资料详细信息序列化器"""
|
|
user = UserSerializer(read_only=True)
|
|
|
|
class Meta:
|
|
model = UserProfile
|
|
fields = ['id', 'user', 'merchant', 'description', 'created_at', 'updated_at']
|
|
|
|
|
|
class CreateUserWithProfileView(GenericAPIView):
|
|
"""创建用户和关联的用户资料信息视图"""
|
|
queryset = User.objects.all()
|
|
permission_classes = [IsAuthenticated, DjangoModelPermissions]
|
|
pagination_class = LimitedLimitOffsetPagination
|
|
|
|
def post(self, request):
|
|
"""
|
|
创建用户和用户资料
|
|
|
|
POST /api/v1/users/create/
|
|
|
|
请求参数:
|
|
- username: 用户名 (必需)
|
|
- email: 邮箱 (可选)
|
|
- password: 密码 (必需, 最少6位)
|
|
- is_staff: 是否为员工 (可选, 默认为False)
|
|
- description: 用户资料描述 (可选)
|
|
- merchant_id: 商户ID (必需)
|
|
|
|
返回:
|
|
- user: 创建的用户信息
|
|
- profile: 创建的用户资料信息
|
|
"""
|
|
# 检查当前用户是否有权限(超级用户或有员工身份)
|
|
if not request.user.is_authenticated:
|
|
return Response({'error': '未授权'}, status=status.HTTP_401_UNAUTHORIZED)
|
|
|
|
# 序列化和验证请求数据
|
|
serializer = UserCreationSerializer(data=request.data)
|
|
if not serializer.is_valid():
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
username = serializer.validated_data['username']
|
|
email = serializer.validated_data.get('email', '')
|
|
password = serializer.validated_data['password']
|
|
is_staff = serializer.validated_data.get('is_staff', False)
|
|
description = serializer.validated_data.get('description', '')
|
|
merchant_id = serializer.validated_data['merchant_id']
|
|
|
|
try:
|
|
# 创建用户
|
|
user = User.objects.create_user(
|
|
username=username,
|
|
email=email,
|
|
password=password,
|
|
is_staff=is_staff
|
|
)
|
|
|
|
# 创建用户资料
|
|
from basic_info.models import Merchant
|
|
merchant = Merchant.objects.get(id=merchant_id)
|
|
profile = UserProfile.objects.create(
|
|
user=user,
|
|
merchant=merchant,
|
|
description=description
|
|
)
|
|
|
|
# 返回创建的用户和用户资料信息
|
|
user_data = UserSerializer(user).data
|
|
profile_data = UserProfileDetailSerializer(profile).data
|
|
|
|
return Response({
|
|
'user': user_data,
|
|
'profile': profile_data
|
|
}, status=status.HTTP_201_CREATED)
|
|
|
|
except Exception as e:
|
|
# 如果创建过程中出现错误,删除已创建的用户
|
|
if 'user' in locals():
|
|
user.delete()
|
|
return Response({
|
|
'error': f'创建用户失败: {str(e)}'
|
|
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|