def generate_new_link(self, request): """ Generate new link after expiry """ email = request.data.get('email') req_type = request.data.get('req_type') serializer = SecurityLinkSerializer(data=request.data) if serializer.is_valid(): try: get_object(User, email, "User") if req_type == 'activate': path = '/api/v1/accounts/activate/' subject = 'Grind - Activate your account' template = 'confirm_account.html' else: path = '/api/v1/accounts/send-reset/' subject = 'Grind - Password Reset' template = 'password_reset.html' send_account_email(request, subject, path, template) return custom_reponse( 'succes', 200, message="A new link has been sent to your email") except (SMTPException, IndexError, TypeError): return custom_reponse('error', 400, message='An error occured, please retry') return custom_reponse('error', 400, serializer=serializer, error_type='bad_request')
def retrieve(self, request, username): """ Return user profile """ profile = get_object(User, username, "User") serializer = self.serializer_class(profile, context={'request': request}) return custom_reponse('success', 200, serializer=serializer)
def send_reset_email(self, request): """ Send password reset email """ serializer = ResetEmailSerializer(data=request.data) email = request.data.get('email') if serializer.is_valid(): try: get_object(User, email, "User") send_account_email(request, 'Grind - Password Reset', '/api/v1/accounts/send-reset/', 'password_reset.html') # TODO: to update link to web-app reset password page return custom_reponse( 'succes', 200, message="A reset link has been sent to your email") except (SMTPException, IndexError, TypeError): return custom_reponse('error', 400, message='An error occured, please retry') return custom_reponse('error', 400, serializer=serializer, error_type='bad_request')
def activate(self, request, uid, token): """ Get request for activating user account """ try: uid = force_text(urlsafe_base64_decode(uid)) user = get_object(User, uid, "User") decoded_token = jwt_auth.decode_token(token) now = int(datetime.now().strftime('%s')) if now > decoded_token['exp']: return custom_reponse('error', 400, message='Link has expired') else: if user is not None and decoded_token['email'] == user.email: user.active = True user.save() # TODO: update redirect url to web-app login return HttpResponseRedirect( redirect_to='http://127.0.0.1:8000/?status=success') else: return custom_reponse( 'error', 400, message='Activation link is invalid!') except (TypeError, ValueError, OverflowError): return custom_reponse('error', 400, message='An error occured')
def password_reset_update(self, request, uid, token): """ Update the new password to db """ decoded_token = jwt_auth.decode_token(token) now = int(datetime.now().strftime('%s')) if now > decoded_token['exp']: # TODO: add generate new link endpoint return custom_reponse('error', 400, message='Link has expired') serializer = PasswordResetSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): uid = force_text(urlsafe_base64_decode(uid)) user = get_object(User, uid, "User") password = request.data.get('password') user.set_password(password) user.save() return custom_reponse('success', 200, message='Password successfully updated') return custom_reponse('error', 400, serializer=serializer, error_type='bad_request')