Как реализовать в DRF реферальную подписку
Есть задача реализовать реферальную систему на DRF: отправляется на адрес opt/ POST запрос с номером телефона, возвращается OPT код(имитация) Далее получение токена на адрес token/ отправляется POST запрос с номером телефона и полученный opt-код, в ответ возвращается токен. Далее при создании пользователя (это происходит когда выполняется первый POST запрос с номером телефона) у него есть реферальный код, по которому другой пользователь может подписаться на него. Вот тут и есть сам вопрос, как ее реализовать? На текущий момент реализована модель юзера models.py:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
phone_number = models.IntegerField(
verbose_name="Номер телефона",
blank=False,
unique=True,
null=True,
)
refer_number = models.CharField(
unique=True,
max_length=6
)
otp = models.IntegerField(
default=None,
blank=False,
null=True
)
views.py
import time
import string
import random
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated
from .serializers import *
def random_number(size=6, chars=string.ascii_uppercase + string.digits):
"""Generation referal code"""
return ''.join(random.choice(chars) for _ in range(size))
@api_view(['POST'])
def generate_otp(request):
"""Generation sms-code"""
phone_number = request.data.get('phone_number', None)
refer_number = random_number()
if phone_number:
if User.objects.filter(phone_number=phone_number).exists():
otp = 5555 # here there should be a random generation of the sms code and sending it
User.objects.filter(phone_number=phone_number, otp=otp)
time.sleep(2)
return Response({'success': True})
else:
otp = 5555 # here there should be a random generation of the sms code and sending it
User.objects.get_or_create(phone_number=phone_number, otp=otp, refer_number=refer_number,
username=phone_number)
time.sleep(2)
return Response({'success': True})
return Response({"trouble": 'ошибка'})
@api_view(['POST'])
def verify_otp(request):
"""SMS confirmation and token receipt"""
otp = request.data.get('otp', None)
phone_number = request.data.get('phone_number', None)
user = User.objects.get(phone_number=phone_number, otp=otp)
if otp and phone_number:
try:
user
except User.DoesNotExist:
return Response({'message': 'Invalid OTP'})
token = Token.objects.create(user=user)
return Response({'token': token.key})
@api_view(['GET', 'POST'])
@permission_classes([IsAuthenticated])
def profile(request):
if request.method == 'GET':
phone_number = request.data.get('phone_number', None)
user = User.objects.filter(phone_number=phone_number)
serializer = UserSerializer(user, many=True)
return Response(serializer.data)
serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
fields = ('phone_number', 'refer_number')
model = User
read_only = True
urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('otp/', generate_otp),
path('token/', verify_otp),
path('profile/', profile)
Только начинаю в программировании на Python, заранее благодарю за все ответы)