jira-15 top leadership API

This commit is contained in:
jain
2023-07-09 19:13:05 +05:30
parent 3723e46be1
commit 1b60d4344e
5 changed files with 65 additions and 42 deletions

View File

@ -13,7 +13,7 @@ from account.serializers import JuniorSerializer
from junior.serializers import JuniorDetailSerializer from junior.serializers import JuniorDetailSerializer
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from .utils import upload_image_to_alibaba from .utils import upload_image_to_alibaba
from junior.models import Junior from junior.models import Junior, JuniorPoints
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
"""User serializer""" """User serializer"""
auth_token = serializers.SerializerMethodField('get_auth_token') auth_token = serializers.SerializerMethodField('get_auth_token')
@ -181,37 +181,13 @@ class TaskDetailsSerializer(serializers.ModelSerializer):
'junior', 'task_status', 'is_active', 'created_at','updated_at'] 'junior', 'task_status', 'is_active', 'created_at','updated_at']
class TopJuniorSerializer(serializers.ModelSerializer): class TopJuniorSerializer(serializers.ModelSerializer):
total_points = serializers.SerializerMethodField() junior = JuniorDetailSerializer()
email = serializers.SerializerMethodField('get_auth')
first_name = serializers.SerializerMethodField('get_first_name')
last_name = serializers.SerializerMethodField('get_last_name')
def get_auth(self, obj):
return obj.auth.username
def get_first_name(self, obj):
return obj.auth.first_name
def get_last_name(self, obj):
return obj.auth.last_name
class Meta: class Meta:
model = Junior model = JuniorPoints
fields = ['id', 'email', 'first_name', 'last_name', 'phone', 'country_code', 'country_name', 'gender', 'dob', 'image', 'junior_code', 'guardian_code', 'referral_code', 'referral_code_used', 'is_active', 'is_complete_profile', 'passcode', 'is_verified', 'created_at', 'updated_at', 'total_points'] fields = ['id', 'junior', 'total_task_points', 'created_at', 'updated_at']
def get_total_points(self, obj):
junior_ids_with_total_points = self.context.get('junior_ids_with_total_points')
if junior_ids_with_total_points:
junior_id = obj.id
for item in junior_ids_with_total_points:
if item['junior'] == junior_id:
return item['total_points']
return 0
class GuardianProfileSerializer(serializers.ModelSerializer): class GuardianProfileSerializer(serializers.ModelSerializer):
"""junior serializer""" """junior serializer"""

View File

@ -10,7 +10,7 @@ from datetime import datetime, timedelta
from .serializers import (UserSerializer, CreateGuardianSerializer, TaskSerializer, TaskDetailsSerializer, from .serializers import (UserSerializer, CreateGuardianSerializer, TaskSerializer, TaskDetailsSerializer,
TopJuniorSerializer) TopJuniorSerializer)
from .models import Guardian, JuniorTask from .models import Guardian, JuniorTask
from junior.models import Junior from junior.models import Junior, JuniorPoints
from junior.serializers import JuniorDetailSerializer from junior.serializers import JuniorDetailSerializer
from account.models import UserEmailOtp from account.models import UserEmailOtp
from .tasks import generate_otp from .tasks import generate_otp
@ -139,23 +139,15 @@ class SearchTaskListAPIView(viewsets.ModelViewSet):
serializer = TaskDetailsSerializer(paginated_queryset, many=True) serializer = TaskDetailsSerializer(paginated_queryset, many=True)
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 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() queryset = JuniorPoints.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_total_points = self.get_queryset().order_by('-total_task_points')
.values('junior') \ serializer = self.get_serializer(junior_total_points, many=True)
.annotate(total_points=Sum('points')) \
.order_by('-total_points')
junior_ids = [item['junior'] for item in junior_ids_with_total_points]
juniors = Junior.objects.filter(id__in=junior_ids)
serializer = self.get_serializer(juniors, many=True, context={'junior_ids_with_total_points':
junior_ids_with_total_points})
return custom_response(serializer.data, response_status=status.HTTP_200_OK) return custom_response(serializer.data, response_status=status.HTTP_200_OK)

View File

@ -2,7 +2,7 @@
"""Third party Django app""" """Third party Django app"""
from django.contrib import admin from django.contrib import admin
"""Import Django app""" """Import Django app"""
from .models import Junior from .models import Junior, JuniorPoints
# Register your models here. # Register your models here.
@admin.register(Junior) @admin.register(Junior)
class JuniorAdmin(admin.ModelAdmin): class JuniorAdmin(admin.ModelAdmin):
@ -12,3 +12,12 @@ class JuniorAdmin(admin.ModelAdmin):
def __str__(self): def __str__(self):
"""Return email id""" """Return email id"""
return self.auth__email return self.auth__email
@admin.register(JuniorPoints)
class JuniorPointsAdmin(admin.ModelAdmin):
"""Junior Points Admin"""
list_display = ['junior', 'total_task_points']
def __str__(self):
"""Return email id"""
return self.junior.auth.email

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2.2 on 2023-07-09 12:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('junior', '0007_alter_junior_image'),
]
operations = [
migrations.CreateModel(
name='JuniorPoints',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('total_task_points', models.IntegerField(blank=True, default=0, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('junior', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='junior_points', to='junior.junior')),
],
options={
'verbose_name': 'Junior Task Points',
'db_table': 'junior_task_points',
},
),
]

View File

@ -41,3 +41,21 @@ class Junior(models.Model):
def __str__(self): def __str__(self):
"""Return email id""" """Return email id"""
return f'{self.auth}' return f'{self.auth}'
class JuniorPoints(models.Model):
"""Junior model"""
junior = models.OneToOneField(Junior, on_delete=models.CASCADE, related_name='junior_points')
"""Contact details"""
total_task_points = models.IntegerField(blank=True, null=True, default=0)
"""Profile created and updated time"""
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta(object):
""" Meta class """
db_table = 'junior_task_points'
verbose_name = 'Junior Task Points'
def __str__(self):
"""Return email id"""
return f'{self.junior.auth}'