Skip to content

Commit

Permalink
configured OTP message
Browse files Browse the repository at this point in the history
  • Loading branch information
Jain-Ayush-11 committed Nov 3, 2021
1 parent c18037f commit 3dd65f2
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 72 deletions.
12 changes: 1 addition & 11 deletions base/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
from django.db import models
from django.db.models import fields
from django.db.models.expressions import Col
from base.models import NewUser, OTP
from base.models import NewUser
from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from django.contrib.auth import authenticate

class AccountSerializer(ModelSerializer):
class Meta:
model = NewUser
fields = ['email', 'id', 'password', 'name']
# extra_kwargs = {'password' : {'write_only' : True}}

def create(self, validated_data):
password = validated_data.pop('password', None)
Expand All @@ -20,11 +15,6 @@ def create(self, validated_data):
instance.save()
return instance

class OtpSerializer(ModelSerializer):
class Meta:
model = OTP
fields = '__all__'

class CheckVerify(ModelSerializer):
class Meta:
model = NewUser
Expand Down
13 changes: 6 additions & 7 deletions base/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@

from . import views

app_name = 'base-api'
urlpatterns = [
path('Account/', views.AccountList.as_view(), name="getNote"),
path('Account/<int:pk>', views.AccountDetails.as_view(), name="getNotes"),
path('Account/create-account/', views.AccountList.as_view(), name="create-note"),
path('Account/update-account/<int:pk>', views.AccountDetails.as_view(), name="update-note"),
path('Account/delete-account/<int:pk>', views.AccountDetails.as_view(), name="delete-note"),
path('Account/otp/verify/', views.OTPView.as_view(), name="getNotes"),
path('Account/login/', views.LoginAPIView.as_view())
path('Account/', views.AccountList.as_view(), name="AccountList"),
path('Account/<int:pk>', views.AccountDetails.as_view(), name="AccountDetail"),
path('Account/create-account/', views.AccountList.as_view(), name="create-account"),
path('Account/otp/verify/', views.OTPView.as_view(), name="verify-otp"),
path('Account/login/', views.LoginAPIView.as_view(), name="login")
]
126 changes: 72 additions & 54 deletions base/api/views.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,39 @@
import random
from django.core.mail import send_mail
from datetime import datetime
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from base.models import NewUser as Entry, OTP
from .serializers import AccountSerializer, CheckVerify, LoginUserSerializer
from django.core.mail import EmailMultiAlternatives, message
from django.shortcuts import redirect
from datetime import datetime
from django.utils import timezone
import datetime
from base.models import NewUser
from django.contrib.auth.hashers import check_password
from base.models import NewUser, OTP
from .serializers import AccountSerializer, CheckVerify, LoginUserSerializer
from VShop.settings import EMAIL_HOST_USER
import random
import datetime


# generating 4-digit OTP
otp = random.randint(1000, 9999)

# email = settings.EMAIL_HOST_USER
# send otp to required email
def send_otp(email):
OTP.objects.filter(otpEmail__iexact = email).delete()
print(email)
send_mail(
"OTP for V-Shop Sign-Up.", f'Your One Time Password for signing up on V-Shop is {otp}.\nValid for only 5 minutes.\nDO NOT SHARE IT WITH ANYBODY.', '[email protected]', [email], fail_silently=False
)

from_email, to = EMAIL_HOST_USER, email
subject = "OTP for V-Shop Sign-Up"
text_content = f'Your One Time Password for signing up on V-Shop is {otp}.\nValid for only 3 minutes.\nDO NOT SHARE IT WITH ANYBODY.'
html_content = f'<span style="font-family: Arial, Helvetica, sans-serif; font-size: 16px;"><p style="font-size: 18px;">DO NOT SHARE IT WITH ANYBODY.</p><p>Valid for only 5 minutes.</p><p>Your One Time Password for signing up on V-Shop is <strong style="font-size: 18px;">{otp}</strong>.</p></span>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

OTP.objects.create(otp = otp, otpEmail = email, time_created = timezone.now())


from base.models import NewUser
from django.contrib.auth.hashers import check_password
class AccountList(APIView):
# get all account details
def get(self, request, format = None):
notes = Entry.objects.all()
serializer = AccountSerializer(notes, many = True)
serializer2 = CheckVerify(notes, many = True)
users = NewUser.objects.all()
serializer = AccountSerializer(users, many = True)
serializer2 = CheckVerify(users, many = True)
Serializer_list = [serializer.data, serializer2.data]

content = {
Expand All @@ -41,50 +43,59 @@ def get(self, request, format = None):
}
return Response(content)

# create a new account
def post(self, request, format = None):
serializer = AccountSerializer(data=request.data)
email = request.data.get("email",)
if serializer.is_valid():
send_otp(email)
serializer.save()
return Response(serializer.data)
user_email = request.data.get("email",)
# checking if user already exists
if NewUser.objects.filter(email = user_email).exists():
message = {'message':'User already exists. Please Log-In'}
return Response(message, status=status.HTTP_401_UNAUTHORIZED)

else:
if serializer.is_valid():
send_otp(user_email)
serializer.save()
return Response(serializer.data)

class AccountDetails(APIView):
# get a specific account details
def get(self, request, pk, format = None):
pk = int(pk)
notes = Entry.objects.get(id=pk)
serializer = AccountSerializer(notes, many = False)
user = NewUser.objects.get(id=pk)
serializer = AccountSerializer(user, many = False)
return Response(serializer.data)

# update a specific account details
def put(self, request, pk, format = None):
pk = int(pk)
note = Entry.objects.get(id = pk)
serializer = AccountSerializer(instance=note, data = request.data)
email = request.data.get("email",)
user = NewUser.objects.get(email = email)
serializer = AccountSerializer(instance=user, data = request.data)

if serializer.is_valid():
serializer.save()
return Response(serializer.data)

def delete(self, request, pk, format = None):
pk = int(pk)
note = Entry.objects.get(id = pk)
note.delete()
# delete an account
def delete(self, request, format = None):
email = request.data.get("email",)
user = NewUser.objects.get(email = email)
user.update(is_active = False)
return Response(status=status.HTTP_204_NO_CONTENT)

class OTPView(APIView):


def post(self, request, format = None):
data_otp = request.data.get("otp",)
# user = Entry.objects.get(email__iexact = data_email)
current_time = timezone.now()
print(otp)
# print(otp)
if str(data_otp) == str(otp):
otp_obj = OTP.objects.get(otp=otp)
user = Entry.objects.filter(email = otp_obj.otpEmail)
if otp_obj.time_created + datetime.timedelta(minutes=5) > current_time:
user = NewUser.objects.filter(email = otp_obj.otpEmail)
if otp_obj.time_created + datetime.timedelta(minutes=3) > current_time:
# OTP verified
user.update(is_verified = True)
user.update(is_active = True)
message = {'message':'OTP verified'}
return Response(message,status=status.HTTP_202_ACCEPTED)
# OTP expired
Expand All @@ -101,25 +112,32 @@ def post(self, request):
email = request.data.get("email",)
password = request.data.get("password",)
try:
# entered_usr = NewUser.objects.get(email=email)
entered_usr = NewUser.objects.get(email__iexact=email)
if not entered_usr.is_verified:
message = {'message':'Email address not verified by otp'}
if check_password(password,entered_usr.password ):
if not entered_usr.is_verified:
message = {'message':'Email address not verified by otp. Please Verify.'}
send_otp(email)
return Response(message, status=status.HTTP_401_UNAUTHORIZED)
else:
message = {'message':'Login verified'}
return Response(message, status=status.HTTP_202_ACCEPTED)
else:
message = {'message':'Incorrect password'}
return Response(message, status=status.HTTP_401_UNAUTHORIZED)
except:
message = {'message':'No matching user found'}
return Response(message, status=status.HTTP_406_NOT_ACCEPTABLE)
# entered_usr.password
# print(email,password)

# check_pswd returns True for match
if check_password(password,entered_usr.password ):
# print("akdfgkj")
message = {'message':'Login verified'}
return Response(message, status=status.HTTP_202_ACCEPTED)
message = {'message':'Incorrect password'}
return Response(message, status=status.HTTP_401_UNAUTHORIZED)
# serializer = self.serializer_class(data=user)
# serializer.is_valid(raise_exception=True)

# return Response(serializer.data, status=status.HTTP_200_OK)
class ForgetResetPasswordView(APIView):

def post(self, request):
email = request.data.get("email",)
try:
entered_usr = NewUser.objects.get(email__iexact=email)
send_otp(entered_usr)
message = {'message':'OTP sent to registered Email'}
return Response(message, status=status.HTTP_202_ACCEPTED)
except:
message = {'message':'No matching user found'}
return Response(message, status=status.HTTP_406_NOT_ACCEPTABLE)
1 change: 1 addition & 0 deletions base/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ def create_superuser(self, email, name, password, **other_fields):
other_fields.setdefault('is_staff', True)
other_fields.setdefault('is_superuser', True)
other_fields.setdefault('is_active', True)
other_fields.setdefault('is_verified', True)

if other_fields.get('is_staff') is not True:
raise ValueError(
Expand Down

0 comments on commit 3dd65f2

Please sign in to comment.