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)