Skip to content

Added the python APi #185

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 129 additions & 0 deletions OTP-Verification-rest-api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/
3 changes: 3 additions & 0 deletions OTP-Verification-rest-api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# OTP-Verification-rest-api

this is a simple rest api for sending otp to a user and verifying it
Empty file.
5 changes: 5 additions & 0 deletions OTP-Verification-rest-api/accounts/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.contrib import admin
from .models import User
# Register your models here.

admin.site.register(User)
6 changes: 6 additions & 0 deletions OTP-Verification-rest-api/accounts/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AccountsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'accounts'
16 changes: 16 additions & 0 deletions OTP-Verification-rest-api/accounts/emails.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from django.core.mail import send_mail
from django.conf import settings
from .models import User
import random

def send_otp(email):
otp = random.randint(1000,9999)
subject = 'OTP for registration'
message = f'Your OTP is {otp}'
email_from = settings.EMAIL_HOST
recipient_list = [email,]
send_mail(subject,message,email_from,recipient_list)
user_obj = User.objects.get(email=email)
user_obj.otp = otp
user_obj.save()

37 changes: 37 additions & 0 deletions OTP-Verification-rest-api/accounts/managers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from django.contrib.auth.base_user import BaseUserManager

class UserManager(BaseUserManager):

use_in_migrations = True

def _create_user(self, email, password=None,**extra_fields):
if not email:
raise ValueError('Users must have an email address')

email=self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_user(self, email, password=None,**extra_fields):
if not email:
raise ValueError('Users must have an email address')

email=self.normalize_email(email)
user = self.model(email=email,**extra_fields)
user.set_password(password)
user.save()
return user


def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)

if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
44 changes: 44 additions & 0 deletions OTP-Verification-rest-api/accounts/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Generated by Django 4.1.1 on 2022-09-13 20:06

import accounts.managers
from django.db import migrations, models
import django.utils.timezone


class Migration(migrations.Migration):

initial = True

dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]

operations = [
migrations.CreateModel(
name='User',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('email', models.EmailField(max_length=254, unique=True)),
('is_verified', models.BooleanField(default=False)),
('otp', models.CharField(blank=True, max_length=4, null=True)),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
managers=[
('objects', accounts.managers.UserManager()),
],
),
]
Empty file.
28 changes: 28 additions & 0 deletions OTP-Verification-rest-api/accounts/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from django.db import models
from django.contrib.auth.models import User,AbstractUser
from .managers import UserManager
from django.contrib.auth.signals import user_logged_in,user_logged_out
from django.db.models.signals import post_save
from django.dispatch import receiver

# Create your models here.

class User(AbstractUser):
username = None
email = models.EmailField(unique=True)
is_verified = models.BooleanField(default=False)
otp = models.CharField(max_length=4,blank=True,null=True)
# forgot_password_token = models.CharField(max_length=100,blank=True,null=True)
# last_login = models.DateTimeField(blank=True,null=True)
# last_logout = models.DateTimeField(blank=True,null=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

def __str__(self):
return self.email

def name(self):
return self.first_name + " " + self.last_name

objects = UserManager()
13 changes: 13 additions & 0 deletions OTP-Verification-rest-api/accounts/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from rest_framework import serializers
from .models import User

class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'password', 'is_verified')


class VerifySerializer(serializers.Serializer):
email = serializers.EmailField()
otp = serializers.CharField(max_length=4)

3 changes: 3 additions & 0 deletions OTP-Verification-rest-api/accounts/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
74 changes: 74 additions & 0 deletions OTP-Verification-rest-api/accounts/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import UserSerializer,VerifySerializer
from .emails import send_otp
from .models import User
# Create your views here.

class RegisterApi(APIView):

def post(self,request):
try:
data=request.data
serializer=UserSerializer(data=data)
if serializer.is_valid():
serializer.save()
send_otp(serializer.data['email'])
return Response({
'status':200,
'message':'User Registered Successfully,check email',
'data':serializer.data
})
return Response({
'status':400,
'message':'User Registration Failed',
'data':serializer.errors
})
except Exception as e:
return Response({
'status':400,
'message':'User Registration Failed',
'data':str(e)
})


class VerifyApi(APIView):

def post(self,request):
try:
data=request.data
serializer = VerifySerializer(data=request.data)

if serializer.is_valid():
email = serializer.data['email']
otp = serializer.data['otp']
user = User.objects.filter(email=email)
if not user.exists():
return Response({
'status':400,
'message':'User Verification unsuccessfully',
'data':'invalid email'
})
if not user[0].otp == otp:
user.update(is_verified=True)
return Response({
'status':400,
'message':'User Verification unsuccessfully',
'data':'invalid otp'
})
user = user.first()
user.is_verified = True
user.save()
return Response({
'status':200,
'message':'User Verification successfully account created',
'data':{}
})

except Exception as e:
return Response({
'status':400,
'message':'User Verification Failed',
'data':str(e)
})
Empty file.
16 changes: 16 additions & 0 deletions OTP-Verification-rest-api/auth/asgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"""
ASGI config for auth project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
"""

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'auth.settings')

application = get_asgi_application()
Loading