import logging from rest_framework.response import Response from rest_framework.permissions import AllowAny from django.utils.translation import gettext as _ from pingcap_sso.models import User from pingcap_sso.api.base import Endpoint from pingcap_sso.exceptions import RateLimitError, UnprocessableError from pingcap_sso.forms import ( ForgetSendCodeForm, ForgetVerifyForm, ForgetResetPasswordForm ) logger = logging.getLogger(__name__) class ForgetSendCodeEndpoin(Endpoint): permission_classes = (AllowAny, ) def post(self, request, *args, **kwargs): form = ForgetSendCodeForm(request, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) try: msg = form.save() except RateLimitError: return Response({ 'detail': _('rate limit') }, status=429) except UnprocessableError: return Response({ 'detail': _('forget password is not enable for this user') }, status=422) else: return Response({'detail': msg}) class ForgetVerifyEndpoin(Endpoint): permission_classes = (AllowAny, ) def post(self, request, *args, **kwargs): form = ForgetVerifyForm(request, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) else: form.save() return Response({'detail': _('success')}) class ForgetResetPasswordEndpoint(Endpoint): permission_classes = (AllowAny, ) def head(self, request, *args, **kwargs): self.user = User.get_reset_password_user(request) if self.user: return Response(status=200) else: return Response(status=428) def post(self, request, *args, **kwargs): self.user = User.get_reset_password_user(request) if not self.user: return Response({ 'detail': _('precondition required,please verify your identity first"') }, status=428) form = ForgetResetPasswordForm(self.user, data=request.data) if not form.is_valid(): return Response({ 'detail': _('params error'), 'errors': form.errors }, status=400) else: form.save() User.clean_reset_password_token(self.request) return Response({'detail': _('success')})