def post(self, request): data = request.data context = {'user_type': request._request.path_info.split('/')[3]} serializer = self.serializer_class(data=data, context=context) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) token = jwt.encode( { 'uid': serializer.validated_data['user'].id, 'iat': settings.JWT_SETTINGS['ISS_AT'](), 'exp': settings.JWT_SETTINGS['EXP_AT']() }, settings.SECRET_KEY) auth_data = { 'user_id': serializer.validated_data['user'].id, 'user_table': serializer.validated_data['user']._meta.object_name, 'token': token.decode("utf-8"), 'is_blacklisted': False } serializer.validated_data['user'].last_login = timezone.now() serializer.validated_data['user'].save() Token(**auth_data).save() return format_response(token=token, message='Successfully logged in')
def partial_update(self, request, pk): Tip.objects.filter(id=pk).update(views=F('views') + 1) tip = Tip.objects.filter(id=pk).first() if not tip: return format_response(success=False, message='First aid tip not found', status=HTTP_404_NOT_FOUND) serializer = self.serializer_class(tip) return format_response(data=serializer.data, status=HTTP_200_OK)
def retrieve(self, request, pk): tip = Tip.objects.filter(id=pk).first() if not tip: return format_response(success=False, message='First aid tip not found', status=HTTP_404_NOT_FOUND) serializer = self.serializer_class(tip) return format_response(data=serializer.data, message='Successfully retrieved First aid tip')
def retrieve(self, request, pk): student = request.user ping = Ping.objects.filter(id=pk, student__id=student.id).first() if not ping: return format_response(error='Ping not found', status=HTTP_404_NOT_FOUND) serializer = self.serializer_class(ping) return format_response(data=serializer.data, message='Successfully retrieved ping')
def create(self, request): data = request.data student = request.user serializer = self.serializer_class(data=data, context={'id': student.id}) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) serializer.save() ping_signal.send(sender=self.__class__, ping_data=serializer.data) return format_response(data=serializer.data, message='Successfully sent a ping', status=HTTP_201_CREATED)
def post(self, request): user = request.user token = request.headers["authorization"].split()[1] auth_data = { 'user_id': user.id, 'user_table': user._meta.object_name, 'token': token, 'is_blacklisted': False } listed_token = Token.objects.filter(**auth_data).first() if not listed_token: return format_response(error='User is already logged out', status=HTTP_400_BAD_REQUEST) listed_token.is_blacklisted = True listed_token.save() return format_response(message='Successfully logged out')
def list(self, request): if request.query_params: query = request.query_params.get('query', '') tips = run_search(query) else: tips = Tip.objects.all() serializer = self.serializer_class(tips, many=True) return format_response(data=serializer.data, message='Successfully retrieved First aid tips')
def get_paginated_response(self, data, message=None): next_link = 1 meta_data = { 'links': { 'next': self.get_next_link(), #.replace('http://', 'https://'), 'previous': self.get_previous_link() #.replace('http://', 'https://') }, 'count': self.page.paginator.count, } if message: return format_response(meta_data=meta_data, data=data, message=message) else: return format_response(meta_data=meta_data, data=data)
def patch(self, request): data = request.data student = request.user serializer = self.serializer_class(student, data=data, partial=True, context={'id': student.id}) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) serializer.save() if data.get('new_password', None): Token.objects.filter(user_id=student.id).update( is_blacklisted=True) return format_response(message='Successfully updated student')
def create(self, request): data = request.data serializer = self.serializer_class(data=data) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) otp = generate_otp() save_in_redis(f'CONFIRM: {data["email"]}', otp, 60 * 4.9) send_mail('Confirm HealthApp Account', 'The OTP code is {}.\n Valid for 5 minutes.'.format(otp), os.getenv('CUSTOM_EMAIL_SENDER'), [data['email']], fail_silently=False) student = serializer.save() response_data = {'id': student.id} return format_response( data=response_data, message='Successfully created an account. ' 'Check email to get OTP and proceed to confirm account.', status=HTTP_201_CREATED)
def patch(self, request): data = request.data serializer = self.serializer_class(data=data) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) student = Student.objects.get_all().filter( email=data.get('email')).first() if not student: return format_response(error='Account does not exist', status=HTTP_400_BAD_REQUEST) if not student.is_confirmed: return format_response(error='Account is not yet confirmed', status=HTTP_400_BAD_REQUEST) if not data.get('otp', None): otp = get_from_redis(f'RESET: {student.email}', None) if otp: return format_response( error='OTP already generated. ' 'Check email and specify otp key with its value', status=HTTP_400_BAD_REQUEST) otp = generate_otp() send_mail('Reset HealthApp Password', 'The OTP code is {}.\n Valid for 5 minutes.'.format(otp), os.getenv('CUSTOM_EMAIL_SENDER'), [student.email], fail_silently=False) save_in_redis(f'RESET: {student.email}', otp, 60 * 4.9) return format_response( message='Successfully generated Password Reset OTP') serializer.update(student, serializer.data) Token.objects.filter(user_id=student.id).update(is_blacklisted=True) delete_from_redis(f'RESET: {student.email}') return format_response(message='Successfully reset password')
def partial_update(self, request, pk): data = request.data student = Student.objects.get_all().filter(id=pk).first() if not student: return format_response(error='Account does not exist', status=HTTP_400_BAD_REQUEST) if student.is_confirmed: return format_response(error='Account is already confirmed', status=HTTP_400_BAD_REQUEST) context = {'email': student.email} serializer = self.serializer_class(student, data=data, context=context) if not serializer.is_valid(): return format_response(error=serializer.errors.get( 'errors', serializer.errors), status=HTTP_400_BAD_REQUEST) if not data.get('otp', None): otp = get_from_redis(f'CONFIRM: {student.email}', None) if otp: return format_response( error='OTP already generated. Check your email.', status=HTTP_400_BAD_REQUEST) otp = generate_otp() save_in_redis(f'CONFIRM: {student.email}', otp, 60 * 4.9) send_mail('Confirm HealthApp Account', 'The OTP code is {}.\n Valid for 5 minutes.'.format(otp), os.getenv('CUSTOM_EMAIL_SENDER'), [student.email], fail_silently=False) return format_response( message='Successfully generated Account Confirmation OTP') serializer.save() delete_from_redis(f'CONFIRM: {student.email}') return format_response(message='Successfully confirmed student')
def get(self, request): student = request.user serializer = self.serializer_class(student) data = serializer.data return format_response(data=data, message='Retrieved student details')