jira-34 referral code validation API

This commit is contained in:
jain
2023-07-19 17:45:20 +05:30
parent 2e3870dc53
commit 9f9926da14
11 changed files with 106 additions and 16 deletions

View File

@ -42,7 +42,7 @@ ERROR_CODE = {
"2016": "Invalid search.", "2016": "Invalid search.",
"2017": "{model} object with {pk} does not exist", "2017": "{model} object with {pk} does not exist",
"2018": "Attached File not found", "2018": "Attached File not found",
"2019": "Either File extension or File size doesn't meet the requirements", "2019": "Invalid Referral code",
"2020": "Enter valid mobile number", "2020": "Enter valid mobile number",
"2021": "Already register", "2021": "Already register",
"2022": "Invalid Guardian code", "2022": "Invalid Guardian code",
@ -120,7 +120,8 @@ SUCCESS_CODE = {
"3029": "Article has been deleted successfully.", "3029": "Article has been deleted successfully.",
"3030": "Article Card has been removed successfully.", "3030": "Article Card has been removed successfully.",
"3031": "Article Survey has been removed successfully.", "3031": "Article Survey has been removed successfully.",
"3032": "Task request sent successfully" "3032": "Task request sent successfully",
"3033": "Valid Referral code",
} }
"""status code error""" """status code error"""
STATUS_CODE_ERROR = { STATUS_CODE_ERROR = {

View File

@ -24,7 +24,7 @@ from junior.serializers import JuniorDetailSerializer
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from base.constants import NUMBER, JUN, ZOD, GRD from base.constants import NUMBER, JUN, ZOD, GRD
from junior.models import Junior, JuniorPoints from junior.models import Junior, JuniorPoints
from .utils import real_time, convert_timedelta_into_datetime from .utils import real_time, convert_timedelta_into_datetime, update_referral_points
@ -141,7 +141,6 @@ class CreateGuardianSerializer(serializers.ModelSerializer):
guardian.country_code = validated_data.get('country_code', guardian.country_code) guardian.country_code = validated_data.get('country_code', guardian.country_code)
guardian.passcode = validated_data.get('passcode', guardian.passcode) guardian.passcode = validated_data.get('passcode', guardian.passcode)
guardian.country_name = validated_data.get('country_name', guardian.country_name) guardian.country_name = validated_data.get('country_name', guardian.country_name)
guardian.referral_code_used = validated_data.get('referral_code_used', guardian.referral_code_used)
guardian.image = validated_data.get('image', guardian.image) guardian.image = validated_data.get('image', guardian.image)
"""Complete profile of the junior if below all data are filled""" """Complete profile of the junior if below all data are filled"""
complete_profile_field = all([guardian.gender, guardian.country_name, complete_profile_field = all([guardian.gender, guardian.country_name,
@ -150,6 +149,9 @@ class CreateGuardianSerializer(serializers.ModelSerializer):
guardian.is_complete_profile = False guardian.is_complete_profile = False
if complete_profile_field: if complete_profile_field:
guardian.is_complete_profile = True guardian.is_complete_profile = True
referral_code_used = validated_data.get('referral_code_used')
update_referral_points(guardian.referral_code, referral_code_used)
guardian.referral_code_used = validated_data.get('referral_code_used', guardian.referral_code_used)
guardian.save() guardian.save()
return guardian return guardian
@ -235,7 +237,7 @@ class TopJuniorSerializer(serializers.ModelSerializer):
class Meta(object): class Meta(object):
"""Meta info""" """Meta info"""
model = JuniorPoints model = JuniorPoints
fields = ['id', 'junior', 'total_task_points', 'position', 'created_at', 'updated_at'] fields = ['id', 'junior', 'total_points', 'position', 'created_at', 'updated_at']
def to_representation(self, instance): def to_representation(self, instance):
"""Convert instance to representation""" """Convert instance to representation"""
@ -322,7 +324,7 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
instance.task_status = str(NUMBER['five']) instance.task_status = str(NUMBER['five'])
instance.is_approved = True instance.is_approved = True
# update total task point # update total task point
junior_data.total_task_points = junior_data.total_task_points + instance.points junior_data.total_points = junior_data.total_points + instance.points
# update complete time of task # update complete time of task
instance.completed_on = real_time() instance.completed_on = real_time()
else: else:
@ -330,7 +332,7 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
instance.task_status = str(NUMBER['three']) instance.task_status = str(NUMBER['three'])
instance.is_approved = False instance.is_approved = False
# update total task point # update total task point
junior_data.total_task_points = junior_data.total_task_points - instance.points junior_data.total_points = junior_data.total_points - instance.points
# update reject time of task # update reject time of task
instance.rejected_on = real_time() instance.rejected_on = real_time()
instance.save() instance.save()

View File

@ -11,6 +11,8 @@ from datetime import datetime, time
import ntplib import ntplib
# import Number constant # import Number constant
from base.constants import NUMBER from base.constants import NUMBER
# Import Junior's model
from junior.models import Junior, JuniorPoints
# Define upload image on # Define upload image on
# ali baba cloud # ali baba cloud
@ -21,6 +23,10 @@ from base.constants import NUMBER
# bucket and reform the image url""" # bucket and reform the image url"""
# fetch real time data without depend on system time # fetch real time data without depend on system time
# convert time delta into date time object # convert time delta into date time object
# update junior total points
# update referral points
# if any one use referral code of the junior
# junior earn 5 points
def upload_image_to_alibaba(image, filename): def upload_image_to_alibaba(image, filename):
"""upload image on oss alibaba bucket""" """upload image on oss alibaba bucket"""
@ -59,3 +65,15 @@ def convert_timedelta_into_datetime(time_difference):
# Create a new time object with the extracted time components # Create a new time object with the extracted time components
time_only = time(hours, minutes, seconds, microseconds) time_only = time(hours, minutes, seconds, microseconds)
return time_only return time_only
def update_referral_points(referral_code, referral_code_used):
"""Update benefit of referral points"""
junior_queryset = Junior.objects.filter(referral_code=referral_code_used).last()
if junior_queryset and junior_queryset.referral_code != referral_code:
# create data if junior points is not exist
junior_query, created = JuniorPoints.objects.get_or_create(junior=junior_queryset)
if junior_query:
# update junior total points and referral points
junior_query.total_points = junior_query.total_points + NUMBER['five']
junior_query.referral_points = junior_query.referral_points + NUMBER['five']
junior_query.save()

View File

@ -94,7 +94,7 @@ class UpdateGuardianProfile(viewsets.ViewSet):
if serializer.is_valid(): if serializer.is_valid():
"""save serializer""" """save serializer"""
serializer.save() serializer.save()
return custom_response(None, serializer.data,response_status=status.HTTP_200_OK) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
@ -206,7 +206,7 @@ class TopJuniorListAPIView(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
"""Fetch junior list of those who complete their tasks""" """Fetch junior list of those who complete their tasks"""
junior_total_points = self.get_queryset().order_by('-total_task_points') junior_total_points = self.get_queryset().order_by('-total_points')
# Update the position field for each JuniorPoints object # Update the position field for each JuniorPoints object
for index, junior in enumerate(junior_total_points): for index, junior in enumerate(junior_total_points):

View File

@ -16,7 +16,7 @@ class JuniorAdmin(admin.ModelAdmin):
@admin.register(JuniorPoints) @admin.register(JuniorPoints)
class JuniorPointsAdmin(admin.ModelAdmin): class JuniorPointsAdmin(admin.ModelAdmin):
"""Junior Points Admin""" """Junior Points Admin"""
list_display = ['junior', 'total_task_points', 'position'] list_display = ['junior', 'total_points', 'position']
def __str__(self): def __str__(self):
"""Return email id""" """Return email id"""

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2023-07-19 09:40
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('junior', '0014_junior_is_password_set'),
]
operations = [
migrations.RenameField(
model_name='juniorpoints',
old_name='total_task_points',
new_name='total_points',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.2 on 2023-07-19 11:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('junior', '0015_rename_total_task_points_juniorpoints_total_points'),
]
operations = [
migrations.AddField(
model_name='juniorpoints',
name='referral_points',
field=models.IntegerField(blank=True, default=0, null=True),
),
]

View File

@ -89,8 +89,10 @@ class Junior(models.Model):
class JuniorPoints(models.Model): class JuniorPoints(models.Model):
"""Junior model""" """Junior model"""
junior = models.OneToOneField(Junior, on_delete=models.CASCADE, related_name='junior_points') junior = models.OneToOneField(Junior, on_delete=models.CASCADE, related_name='junior_points')
# Contact details""" # Total earned points"""
total_task_points = models.IntegerField(blank=True, null=True, default=0) total_points = models.IntegerField(blank=True, null=True, default=0)
# referral points"""
referral_points = models.IntegerField(blank=True, null=True, default=0)
# position of the junior""" # position of the junior"""
position = models.IntegerField(blank=True, null=True, default=99999) position = models.IntegerField(blank=True, null=True, default=99999)
# Profile created and updated time""" # Profile created and updated time"""

View File

@ -16,7 +16,7 @@ from base.constants import PENDING, IN_PROGRESS, REJECTED, REQUESTED, COMPLETED,
from guardian.models import Guardian, JuniorTask from guardian.models import Guardian, JuniorTask
from account.models import UserEmailOtp from account.models import UserEmailOtp
from junior.utils import junior_notification_email, junior_approval_mail from junior.utils import junior_notification_email, junior_approval_mail
from guardian.utils import real_time from guardian.utils import real_time, update_referral_points
class ListCharField(serializers.ListField): class ListCharField(serializers.ListField):
@ -92,7 +92,6 @@ class CreateJuniorSerializer(serializers.ModelSerializer):
"""Update country code and phone number""" """Update country code and phone number"""
junior.phone = validated_data.get('phone', junior.phone) junior.phone = validated_data.get('phone', junior.phone)
junior.country_code = validated_data.get('country_code', junior.country_code) junior.country_code = validated_data.get('country_code', junior.country_code)
junior.referral_code_used = validated_data.get('referral_code_used', junior.referral_code_used)
junior.image = validated_data.get('image', junior.image) junior.image = validated_data.get('image', junior.image)
"""Complete profile of the junior if below all data are filled""" """Complete profile of the junior if below all data are filled"""
complete_profile_field = all([junior.gender, junior.country_name, junior.image, complete_profile_field = all([junior.gender, junior.country_name, junior.image,
@ -100,6 +99,9 @@ class CreateJuniorSerializer(serializers.ModelSerializer):
junior.is_complete_profile = False junior.is_complete_profile = False
if complete_profile_field: if complete_profile_field:
junior.is_complete_profile = True junior.is_complete_profile = True
referral_code_used = validated_data.get('referral_code_used')
update_referral_points(junior.referral_code, referral_code_used)
junior.referral_code_used = validated_data.get('referral_code_used', junior.referral_code_used)
junior.save() junior.save()
return junior return junior
@ -346,7 +348,7 @@ class JuniorPointsSerializer(serializers.ModelSerializer):
"""total points""" """total points"""
points = JuniorPoints.objects.filter(junior=obj.junior).last() points = JuniorPoints.objects.filter(junior=obj.junior).last()
if points: if points:
return points.total_task_points return points.total_points
def get_in_progress_task(self, obj): def get_in_progress_task(self, obj):
return JuniorTask.objects.filter(junior=obj.junior, task_status=IN_PROGRESS).count() return JuniorTask.objects.filter(junior=obj.junior, task_status=IN_PROGRESS).count()

View File

@ -3,7 +3,7 @@
from django.urls import path, include from django.urls import path, include
from .views import (UpdateJuniorProfile, ValidateGuardianCode, JuniorListAPIView, AddJuniorAPIView, from .views import (UpdateJuniorProfile, ValidateGuardianCode, JuniorListAPIView, AddJuniorAPIView,
InvitedJuniorAPIView, FilterJuniorAPIView, RemoveJuniorAPIView, JuniorTaskListAPIView, InvitedJuniorAPIView, FilterJuniorAPIView, RemoveJuniorAPIView, JuniorTaskListAPIView,
CompleteJuniorTaskAPIView, JuniorPointsListAPIView) CompleteJuniorTaskAPIView, JuniorPointsListAPIView, ValidateReferralCode)
"""Third party import""" """Third party import"""
from rest_framework import routers from rest_framework import routers
@ -36,6 +36,8 @@ router.register('filter-junior', FilterJuniorAPIView, basename='filter-junior')
router.register('junior-task-list', JuniorTaskListAPIView, basename='junior-task-list') router.register('junior-task-list', JuniorTaskListAPIView, basename='junior-task-list')
# junior's task list API""" # junior's task list API"""
router.register('junior-points', JuniorPointsListAPIView, basename='junior-points') router.register('junior-points', JuniorPointsListAPIView, basename='junior-points')
# validate referral code API"""
router.register('validate-referral-code', ValidateReferralCode, basename='validate-referral-code')
# Define url pattern""" # Define url pattern"""
urlpatterns = [ urlpatterns = [
path('api/v1/', include(router.urls)), path('api/v1/', include(router.urls)),

View File

@ -37,6 +37,8 @@ from guardian.utils import upload_image_to_alibaba
# search junior API # search junior API
# remove junior API, # remove junior API,
# approve junior API # approve junior API
# create referral code
# validation API
# Create your views here. # Create your views here.
class UpdateJuniorProfile(viewsets.ViewSet): class UpdateJuniorProfile(viewsets.ViewSet):
@ -272,3 +274,28 @@ class JuniorPointsListAPIView(viewsets.ModelViewSet):
requests.get(os.getenv('BASE_URL') + '/api/v1/top-junior/', headers=headers) requests.get(os.getenv('BASE_URL') + '/api/v1/top-junior/', headers=headers)
serializer = JuniorPointsSerializer(queryset) serializer = JuniorPointsSerializer(queryset)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
class ValidateReferralCode(viewsets.ViewSet):
"""Check guardian code exist or not"""
permission_classes = [IsAuthenticated]
def get_queryset(self):
"""Get queryset based on referral_code."""
referral_code = self.request.GET.get('referral_code')
if referral_code:
# search referral code in guardian model
guardian_queryset = Guardian.objects.filter(referral_code=referral_code).last()
if guardian_queryset:
return guardian_queryset
else:
# search referral code in junior model
junior_queryset = Junior.objects.filter(referral_code=referral_code).last()
if junior_queryset:
return junior_queryset
return None
def list(self, request, *args, **kwargs):
"""check guardian code"""
if self.get_queryset():
return custom_response(SUCCESS_CODE['3033'], response_status=status.HTTP_200_OK)
return custom_error_response(ERROR_CODE["2019"], response_status=status.HTTP_400_BAD_REQUEST)