Example #1
0
    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')
Example #2
0
 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)
Example #3
0
    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')
Example #4
0
    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')
Example #5
0
 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)
Example #6
0
    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')
Example #7
0
 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')
Example #8
0
    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)
Example #9
0
    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')
Example #10
0
    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)
Example #11
0
    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')
Example #12
0
    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')
Example #13
0
 def get(self, request):
     student = request.user
     serializer = self.serializer_class(student)
     data = serializer.data
     return format_response(data=data, message='Retrieved student details')