def email_verification(request, email): """向用户提供的邮箱发送验证码""" try: verification = Verification.objects.get(email=email) except Verification.DoesNotExist: verification = Verification(email=email) code = gen_random_code(6) serializer = VerificationSerializer(verification, data={'code': code}, partial=True) if not serializer.is_valid(): return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) if User.objects.filter(email=email).exists(): return Response(detail('该用户已注册'), status.HTTP_403_FORBIDDEN) try: # 测试用例认为邮件内容的最后6个字符是验证码 send_mail( '邮箱验证', f'{settings.PROJECT_VERBOSE_NAME}感谢您的注册,您的验证码是 {code}', settings.EMAIL_FROM, recipient_list=[ email, ], fail_silently=False, ) except smtplib.SMTPException: return Response(detail('验证邮件发送失败'), status.HTTP_412_PRECONDITION_FAILED) serializer.save() return Response(status=status.HTTP_204_NO_CONTENT)
def leave_team(request, email): """请离当前队伍中某队员""" team: Team = request.user.member.team if team is None: return Response(detail('未加入任何队伍'), status.HTTP_403_FORBIDDEN) if email == 'self': member: Member = request.user.member else: member = get_object_or_404(Member, user__email=email) if member not in team.members.all(): return Response(detail('队伍中无此人'), status.HTTP_403_FORBIDDEN) member.team = None member.save(update_fields=['team']) return Response(status=status.HTTP_204_NO_CONTENT)
def join_team(request, id): """加入队伍""" member: Member = request.user.member if member.team is not None: return Response(detail('已经在一个队伍里面了'), status.HTTP_403_FORBIDDEN) member.team = get_object_or_404(Team, id=id) member.save(update_fields=['team']) return Response(status=status.HTTP_204_NO_CONTENT)
def create(self, request, *args, **kwargs): """创建并加入""" member: Member = request.user.member if member.team is not None: return Response(detail('已经在一个队伍里面了'), status.HTTP_403_FORBIDDEN) serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) team = Team.objects.get(id=serializer.data['id']) member.team = team member.save(update_fields=['team']) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def email_register(request): """邮箱验证""" serializer = EmailRegisterSerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) try: user_email = serializer.validated_data.get('email') verification = Verification.objects.get( email=user_email, code=serializer.validated_data.get('code')) except Verification.DoesNotExist: return Response(detail('验证码无效'), status.HTTP_403_FORBIDDEN) verification.delete() serializer.save() response = Response(serializer.validated_data, status.HTTP_201_CREATED) response.data['token'] = 'Token ' + Token.objects.get( user__email=user_email).key response.set_cookie('token', response.data['token']) return response