jira-15 dashboard api profile, default image, top leaderboard API

This commit is contained in:
jain
2023-07-07 16:33:51 +05:30
parent c6ffb1f039
commit ab435ef384
10 changed files with 200 additions and 18 deletions

View File

@ -2,8 +2,17 @@
from django.contrib import admin from django.contrib import admin
"""Import django app""" """Import django app"""
from .models import UserProfile, UserEmailOtp, UserPhoneOtp from .models import UserProfile, UserEmailOtp, UserPhoneOtp, DefaultTaskImages
# Register your models here. # Register your models here.
@admin.register(DefaultTaskImages)
class DefaultTaskImagesAdmin(admin.ModelAdmin):
"""User profile admin"""
list_display = ['task_name', 'image_url']
def __str__(self):
return self.image_url
@admin.register(UserProfile) @admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin): class UserProfileAdmin(admin.ModelAdmin):
"""User profile admin""" """User profile admin"""

View File

@ -0,0 +1,26 @@
# Generated by Django 4.2.2 on 2023-07-07 10:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('account', '0002_useremailotp_user_type'),
]
operations = [
migrations.CreateModel(
name='DefaultTaskImages',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('task_name', models.CharField(max_length=15)),
('image_url', models.URLField(blank=True, default=None, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'db_table': 'default_task_image',
},
),
]

View File

@ -74,3 +74,19 @@ class UserEmailOtp(models.Model):
def __str__(self): def __str__(self):
"""return phone as an object""" """return phone as an object"""
return self.email return self.email
class DefaultTaskImages(models.Model):
"""Default images upload in oss bucket"""
task_name = models.CharField(max_length=15)
image_url = models.URLField(null=True, blank=True, default=None)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta(object):
""" Meta information """
db_table = 'default_task_image'
def __str__(self):
"""return phone as an object"""
return self.task_name

View File

@ -2,7 +2,7 @@ from rest_framework import serializers
from django.contrib.auth.models import User from django.contrib.auth.models import User
from guardian.models import Guardian from guardian.models import Guardian
from junior.models import Junior from junior.models import Junior
from account.models import UserProfile, UserEmailOtp, UserPhoneOtp from account.models import UserProfile, UserEmailOtp, UserPhoneOtp, DefaultTaskImages
from base.constants import GUARDIAN, JUNIOR, SUPERUSER from base.constants import GUARDIAN, JUNIOR, SUPERUSER
from django.db import transaction from django.db import transaction
from base.messages import ERROR_CODE_REQUIRED, ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR from base.messages import ERROR_CODE_REQUIRED, ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR
@ -204,3 +204,21 @@ class EmailVerificationSerializer(serializers.ModelSerializer):
model = UserEmailOtp model = UserEmailOtp
fields = '__all__' fields = '__all__'
class DefaultTaskImagesSerializer(serializers.ModelSerializer):
"""Update Password after verification"""
class Meta(object):
"""Meta info"""
model = DefaultTaskImages
fields = ['task_name', 'image_url']
def create(self, validated_data):
data = DefaultTaskImages.objects.create(**validated_data)
return data
class DefaultTaskImagesDetailsSerializer(serializers.ModelSerializer):
"""Update Password after verification"""
class Meta(object):
"""Meta info"""
model = DefaultTaskImages
fields = '__all__'

View File

@ -6,7 +6,8 @@ from rest_framework.decorators import api_view
from rest_framework import routers from rest_framework import routers
from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVerification, ReSendEmailOtp, from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVerification, ReSendEmailOtp,
ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage, ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage,
GoogleLoginViewSet, SigninWithApple) GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet,
DefaultImageAPIViewSet)
"""Router""" """Router"""
router = routers.SimpleRouter() router = routers.SimpleRouter()
@ -18,6 +19,9 @@ router.register('google-login', GoogleLoginViewSet, basename='admin')
# router.register('user-phone-verification', UserPhoneVerification, basename='user-phone-verification') # router.register('user-phone-verification', UserPhoneVerification, basename='user-phone-verification')
router.register('user-email-verification', UserEmailVerification, basename='user-email-verification') router.register('user-email-verification', UserEmailVerification, basename='user-email-verification')
router.register('resend-email-otp', ReSendEmailOtp, basename='resend-email-otp') router.register('resend-email-otp', ReSendEmailOtp, basename='resend-email-otp')
router.register('profile', ProfileAPIViewSet, basename='profile')
router.register('upload-default-task-image', UploadImageAPIViewSet, basename='upload-default-task-image')
router.register('default-task-image', DefaultImageAPIViewSet, basename='default-task-image')
urlpatterns = [ urlpatterns = [
path('api/v1/', include(router.urls)), path('api/v1/', include(router.urls)),
path('api/v1/forgot-password/', ForgotPasswordAPIView.as_view()), path('api/v1/forgot-password/', ForgotPasswordAPIView.as_view()),

View File

@ -10,11 +10,12 @@ from guardian.utils import upload_image_to_alibaba
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from guardian.models import Guardian from guardian.models import Guardian
from junior.models import Junior from junior.models import Junior
from account.models import UserProfile, UserPhoneOtp, UserEmailOtp from account.models import UserProfile, UserPhoneOtp, UserEmailOtp, DefaultTaskImages
from django.contrib.auth.models import User from django.contrib.auth.models import User
from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer, from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer,
ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer, ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer,
GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer) GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer,
DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer)
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from guardian.tasks import generate_otp from guardian.tasks import generate_otp
@ -29,7 +30,8 @@ from rest_framework.response import Response
import requests import requests
from django.conf import settings from django.conf import settings
from .utils import get_token from .utils import get_token
from junior.serializers import JuniorProfileSerializer
from guardian.serializers import GuardianProfileSerializer
class GoogleLoginMixin: class GoogleLoginMixin:
def google_login(self, request): def google_login(self, request):
@ -159,6 +161,7 @@ class UpdateProfileImage(views.APIView):
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)
class ChangePasswordAPIView(views.APIView): class ChangePasswordAPIView(views.APIView):
serializer_class = ChangePasswordSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def post(self, request): def post(self, request):
serializer = ChangePasswordSerializer(context=request.user, data=request.data) serializer = ChangePasswordSerializer(context=request.user, data=request.data)
@ -212,6 +215,7 @@ class ForgotPasswordAPIView(views.APIView):
class SendPhoneOtp(viewsets.ModelViewSet): class SendPhoneOtp(viewsets.ModelViewSet):
"""Send otp on phone""" """Send otp on phone"""
queryset = UserPhoneOtp.objects.all()
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
otp = generate_otp() otp = generate_otp()
phone_number = self.request.data['phone'] phone_number = self.request.data['phone']
@ -227,6 +231,7 @@ class SendPhoneOtp(viewsets.ModelViewSet):
class UserPhoneVerification(viewsets.ModelViewSet): class UserPhoneVerification(viewsets.ModelViewSet):
"""Send otp on phone""" """Send otp on phone"""
queryset = UserPhoneOtp.objects.all()
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
try: try:
phone_data = UserPhoneOtp.objects.filter(phone=self.request.GET.get('phone'), phone_data = UserPhoneOtp.objects.filter(phone=self.request.GET.get('phone'),
@ -305,6 +310,7 @@ class UserLogin(viewsets.ViewSet):
class UserEmailVerification(viewsets.ModelViewSet): class UserEmailVerification(viewsets.ModelViewSet):
"""User Email verification""" """User Email verification"""
serializer_class = EmailVerificationSerializer serializer_class = EmailVerificationSerializer
queryset = UserEmailOtp.objects.all()
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
try: try:
@ -344,6 +350,7 @@ class UserEmailVerification(viewsets.ModelViewSet):
class ReSendEmailOtp(viewsets.ModelViewSet): class ReSendEmailOtp(viewsets.ModelViewSet):
"""Send otp on phone""" """Send otp on phone"""
queryset = UserEmailOtp.objects.all()
serializer_class = EmailVerificationSerializer serializer_class = EmailVerificationSerializer
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
otp = generate_otp() otp = generate_otp()
@ -361,3 +368,47 @@ class ReSendEmailOtp(viewsets.ModelViewSet):
return custom_response(SUCCESS_CODE['3016'], response_status=status.HTTP_200_OK) return custom_response(SUCCESS_CODE['3016'], response_status=status.HTTP_200_OK)
else: else:
return custom_error_response(ERROR_CODE["2023"], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE["2023"], response_status=status.HTTP_400_BAD_REQUEST)
class ProfileAPIViewSet(viewsets.ModelViewSet):
"""Profile viewset"""
queryset = User.objects.all()
serializer_class = [JuniorProfileSerializer, GuardianProfileSerializer]
def list(self, request, *args, **kwargs):
"""profile view"""
if str(self.request.GET.get('user_type')) == '1':
junior_data = Junior.objects.filter(auth=self.request.user).last()
if junior_data:
serializer = JuniorProfileSerializer(junior_data)
if str(self.request.GET.get('user_type')) == '2':
guardian_data = Guardian.objects.filter(user=self.request.user).last()
if guardian_data:
serializer = GuardianProfileSerializer(guardian_data)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
class UploadImageAPIViewSet(viewsets.ModelViewSet):
"""Profile viewset"""
queryset = DefaultTaskImages.objects.all()
serializer_class = DefaultTaskImagesSerializer
def create(self, request, *args, **kwargs):
"""profile view"""
image_data = request.data['image_url']
filename = f"default_task_images/{image_data.name}"
image = upload_image_to_alibaba(image_data, filename)
image_data = image
request.data['image_url'] = image_data
serializer = DefaultTaskImagesSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
return custom_error_response(serializer.error, response_status=status.HTTP_400_BAD_REQUEST)
class DefaultImageAPIViewSet(viewsets.ModelViewSet):
"""Profile viewset"""
queryset = DefaultTaskImages.objects.all()
serializer_class = DefaultTaskImagesDetailsSerializer
def list(self, request, *args, **kwargs):
"""profile view"""
queryset = DefaultTaskImages.objects.all()
serializer = DefaultTaskImagesSerializer(queryset, many=True)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)

View File

@ -38,9 +38,11 @@ class UserSerializer(serializers.ModelSerializer):
user = User.objects.create_user(username=email, email=email, password=password) user = User.objects.create_user(username=email, email=email, password=password)
UserProfile.objects.create(user=user, user_type=user_type) UserProfile.objects.create(user=user, user_type=user_type)
if user_type == '1': if user_type == '1':
Junior.objects.create(auth=user) Junior.objects.create(auth=user, junior_code=''.join([str(random.randrange(9)) for _ in range(6)]),
referral_code=''.join([str(random.randrange(9)) for _ in range(6)]))
if user_type == '2': if user_type == '2':
Guardian.objects.create(user=user) Guardian.objects.create(user=user, guardian_code=''.join([str(random.randrange(9)) for _ in range(6)]),
referral_code=''.join([str(random.randrange(9)) for _ in range(6)]))
return user return user
except Exception as e: except Exception as e:
"""Error handling""" """Error handling"""
@ -88,11 +90,6 @@ class CreateGuardianSerializer(serializers.ModelSerializer):
def create(self, validated_data): def create(self, validated_data):
"""Create guardian profile""" """Create guardian profile"""
# phone_number = validated_data.get('phone', None)
# guardian_data = Guardian.objects.filter(phone=phone_number)
# junior_data = Junior.objects.filter(phone=phone_number)
# if phone_number and (guardian_data or junior_data):
# raise serializers.ValidationError({"details": ERROR_CODE['2012']})
user = User.objects.filter(username=self.context['user']).last() user = User.objects.filter(username=self.context['user']).last()
if user: if user:
"""Save first and last name of guardian""" """Save first and last name of guardian"""
@ -176,7 +173,7 @@ class GuardianDetailSerializer(serializers.ModelSerializer):
'updated_at'] 'updated_at']
class TaskDetailsSerializer(serializers.ModelSerializer): class TaskDetailsSerializer(serializers.ModelSerializer):
guardian = GuardianDetailSerializer() # guardian = GuardianDetailSerializer()
junior = JuniorDetailSerializer() junior = JuniorDetailSerializer()
class Meta(object): class Meta(object):
model = JuniorTask model = JuniorTask
@ -216,3 +213,27 @@ class TopJuniorSerializer(serializers.ModelSerializer):
return item['total_points'] return item['total_points']
return 0 return 0
class GuardianProfileSerializer(serializers.ModelSerializer):
"""junior serializer"""
email = serializers.SerializerMethodField('get_auth')
first_name = serializers.SerializerMethodField('get_first_name')
last_name = serializers.SerializerMethodField('get_last_name')
def get_auth(self, obj):
"""user email address"""
return obj.user.username
def get_first_name(self, obj):
"""user first name"""
return obj.user.first_name
def get_last_name(self, obj):
"""user last name"""
return obj.user.last_name
class Meta(object):
"""Meta info"""
model = Guardian
fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob',
'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image',
'updated_at']

View File

@ -22,6 +22,7 @@ from django.db.models import Sum
# Create your views here. # Create your views here.
class SignupViewset(viewsets.ModelViewSet): class SignupViewset(viewsets.ModelViewSet):
"""Signup view set""" """Signup view set"""
queryset = User.objects.all()
serializer_class = UserSerializer serializer_class = UserSerializer
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
"""Create user profile""" """Create user profile"""
@ -44,6 +45,7 @@ class SignupViewset(viewsets.ModelViewSet):
class UpdateGuardianProfile(viewsets.ViewSet): class UpdateGuardianProfile(viewsets.ViewSet):
"""Update guardian profile""" """Update guardian profile"""
queryset = Guardian.objects.all()
serializer_class = CreateGuardianSerializer serializer_class = CreateGuardianSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@ -63,6 +65,7 @@ class UpdateGuardianProfile(viewsets.ViewSet):
class AllTaskListAPIView(viewsets.ModelViewSet): class AllTaskListAPIView(viewsets.ModelViewSet):
"""Update guardian profile""" """Update guardian profile"""
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
queryset = JuniorTask.objects.all()
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
@ -76,6 +79,7 @@ class TaskListAPIView(viewsets.ModelViewSet):
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
pagination_class = PageNumberPagination pagination_class = PageNumberPagination
queryset = JuniorTask.objects.all()
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
"""Create guardian profile""" """Create guardian profile"""
@ -93,6 +97,7 @@ class TaskListAPIView(viewsets.ModelViewSet):
class CreateTaskAPIView(viewsets.ModelViewSet): class CreateTaskAPIView(viewsets.ModelViewSet):
"""create task for junior""" """create task for junior"""
serializer_class = TaskSerializer serializer_class = TaskSerializer
queryset = JuniorTask.objects.all()
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
image = request.data['default_image'] image = request.data['default_image']
@ -103,7 +108,6 @@ class CreateTaskAPIView(viewsets.ModelViewSet):
filename = f"images/{image}" filename = f"images/{image}"
image_url = upload_image_to_alibaba(image, filename) image_url = upload_image_to_alibaba(image, filename)
image_data = image_url image_data = image_url
data.pop('default_image')
serializer = TaskSerializer(context={"user":request.user, "image":image_data}, data=data) serializer = TaskSerializer(context={"user":request.user, "image":image_data}, data=data)
if serializer.is_valid(): if serializer.is_valid():
serializer.save() serializer.save()
@ -115,6 +119,7 @@ class SearchTaskListAPIView(viewsets.ModelViewSet):
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
pagination_class = PageNumberPagination pagination_class = PageNumberPagination
queryset = JuniorTask.objects.all()
def get_queryset(self): def get_queryset(self):
"""Get the queryset for the view""" """Get the queryset for the view"""
@ -136,8 +141,8 @@ class SearchTaskListAPIView(viewsets.ModelViewSet):
class TopJuniorListAPIView(viewsets.ModelViewSet): class TopJuniorListAPIView(viewsets.ModelViewSet):
"""Top juniors list""" """Top juniors list"""
serializer_class = TopJuniorSerializer serializer_class = TopJuniorSerializer
# permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
queryset = JuniorTask.objects.all()
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
"""fetch junior list those complete their task""" """fetch junior list those complete their task"""
junior_ids_with_total_points = JuniorTask.objects.filter(task_status=1) \ junior_ids_with_total_points = JuniorTask.objects.filter(task_status=1) \

View File

@ -192,3 +192,33 @@ class JuniorDetailListSerializer(serializers.ModelSerializer):
'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image',
'updated_at', 'assigned_task','points', 'pending_task', 'in_progress_task', 'completed_task', 'updated_at', 'assigned_task','points', 'pending_task', 'in_progress_task', 'completed_task',
'requested_task', 'rejected_task'] 'requested_task', 'rejected_task']
class JuniorProfileSerializer(serializers.ModelSerializer):
"""junior serializer"""
email = serializers.SerializerMethodField('get_auth')
first_name = serializers.SerializerMethodField('get_first_name')
last_name = serializers.SerializerMethodField('get_last_name')
notification_count = serializers.SerializerMethodField('get_notification_count')
def get_auth(self, obj):
"""user email address"""
return obj.auth.username
def get_first_name(self, obj):
"""user first name"""
return obj.auth.first_name
def get_last_name(self, obj):
"""user last name"""
return obj.auth.last_name
def get_notification_count(self, obj):
"""user email address"""
return 0
class Meta(object):
"""Meta info"""
model = Junior
fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob',
'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image',
'updated_at', 'notification_count']

View File

@ -10,6 +10,7 @@ from account.utils import custom_response, custom_error_response
# Create your views here. # Create your views here.
class UpdateJuniorProfile(viewsets.ViewSet): class UpdateJuniorProfile(viewsets.ViewSet):
"""Update junior profile""" """Update junior profile"""
queryset = Junior.objects.all()
serializer_class = CreateJuniorSerializer serializer_class = CreateJuniorSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
@ -27,6 +28,7 @@ class UpdateJuniorProfile(viewsets.ViewSet):
class ValidateGuardianCode(viewsets.ViewSet): class ValidateGuardianCode(viewsets.ViewSet):
"""Check guardian code exist or not""" """Check guardian code exist or not"""
queryset = Guardian.objects.all()
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
@ -43,7 +45,7 @@ class JuniorListAPIView(viewsets.ModelViewSet):
"""Junior list of assosicated guardian""" """Junior list of assosicated guardian"""
serializer_class = JuniorDetailListSerializer serializer_class = JuniorDetailListSerializer
queryset = Junior.objects.all()
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
""" junior list""" """ junior list"""
guardian_data = Guardian.objects.filter(user__email=request.user).last() guardian_data = Guardian.objects.filter(user__email=request.user).last()