carbo_server/apps/auth1/register_view.py

98 lines
3.1 KiB
Python

from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.exceptions import ParseError
from apps.auth1.serializers import RegisterSerializer
from apps.system.models import User
from django.db import transaction
class RegisterView(CreateAPIView):
"""用户注册
用户注册,创建用户和企业信息
"""
authentication_classes = []
permission_classes = []
serializer_class = RegisterSerializer
@transaction.atomic
def create(self, request, *args, **kwargs):
from apps.carbon.models import Enterprise
import re
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
vdata = serializer.validated_data
email = vdata.get('email')
code = vdata.get('code')
nickname = vdata.get('nickname')
password = vdata.get('password')
enterprise_name = vdata.get('enterprise_name')
credit_code = vdata.get('credit_code')
# 验证邮箱验证码
from django.core.cache import cache
cache_key = f'email_code_{email}'
cached_code = cache.get(cache_key)
if not cached_code or cached_code != code:
raise ParseError('验证码错误或已过期')
# 验证统一社会信用代码格式
credit_code_pattern = r'^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$'
if not re.match(credit_code_pattern, credit_code):
raise ParseError('统一社会信用代码格式不正确')
# 检查邮箱是否已存在
if User.objects.filter(username=email).exists():
raise ParseError('该邮箱已注册')
# 检查统一社会信用代码是否已存在
if Enterprise.objects.filter(credit_code=credit_code).exists():
raise ParseError('该统一社会信用代码已注册')
# 创建企业部门
from apps.system.models import Dept
# 获取根组织部门
parent_dept = Dept.objects.get(name='根组织')
dept = Dept.objects.create(
name=enterprise_name,
type='enterprise',
parent=parent_dept
)
# 创建企业信息
enterprise = Enterprise.objects.create(
name=enterprise_name,
credit_code=credit_code,
belong_dept=dept
)
# 创建用户
user = User.objects.create_user(
username=email,
password=password,
type='enterprise',
name=nickname
)
# 授予权限
from apps.system.models import UserPost, Post
post = Post.objects.get(name='核算员')
UserPost.objects.create(
user = user,
post = post,
dept = dept,
sort = 1
)
user.belong_dept = dept
user.post = post
user.save(update_fields=['belong_dept', 'post'])
return Response({
'message': '注册成功',
'user_id': user.id,
'enterprise_id': enterprise.id
}, status=status.HTTP_201_CREATED)