diff --git a/guardian/serializers.py b/guardian/serializers.py index 6df46c6..a0a85a6 100644 --- a/guardian/serializers.py +++ b/guardian/serializers.py @@ -13,7 +13,7 @@ from account.serializers import JuniorSerializer from junior.serializers import JuniorDetailSerializer from base.messages import ERROR_CODE, SUCCESS_CODE from .utils import upload_image_to_alibaba -from junior.models import Junior +from junior.models import Junior, JuniorPoints class UserSerializer(serializers.ModelSerializer): """User serializer""" auth_token = serializers.SerializerMethodField('get_auth_token') @@ -181,37 +181,13 @@ class TaskDetailsSerializer(serializers.ModelSerializer): 'junior', 'task_status', 'is_active', 'created_at','updated_at'] - - - class TopJuniorSerializer(serializers.ModelSerializer): - total_points = serializers.SerializerMethodField() - - 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 + junior = JuniorDetailSerializer() class Meta: - model = Junior - 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'] + model = JuniorPoints + 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): """junior serializer""" @@ -219,6 +195,9 @@ class GuardianProfileSerializer(serializers.ModelSerializer): email = serializers.SerializerMethodField('get_auth') first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') + total_count = serializers.SerializerMethodField('get_total_count') + complete_field_count = serializers.SerializerMethodField('get_complete_field_count') + notification_count = serializers.SerializerMethodField('get_notification_count') def get_auth(self, obj): """user email address""" @@ -231,9 +210,26 @@ class GuardianProfileSerializer(serializers.ModelSerializer): def get_last_name(self, obj): """user last name""" return obj.user.last_name + + def get_total_count(self, obj): + """total fields count""" + return 9 + + def get_complete_field_count(self, obj): + """total filled fields count""" + total_field_list = [obj.user.first_name, obj.user.last_name, obj.user.email, obj.country_name, obj.country_code, + obj.phone, obj.gender, obj.dob, obj.image] + total_complete_field = [data for data in total_field_list if data != '' and data is not None] + return len(total_complete_field) + + def get_notification_count(self, obj): + """total notification count""" + return 0 + class Meta(object): """Meta info""" model = Guardian fields = ['id', 'email', 'first_name', 'last_name', 'country_name','country_code', 'phone', 'gender', 'dob', - 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', + 'guardian_code', 'notification_count', 'total_count', 'complete_field_count', 'referral_code', + 'is_active', 'is_complete_profile', 'created_at', 'image', 'updated_at'] \ No newline at end of file diff --git a/guardian/views.py b/guardian/views.py index b6fc025..e0f2bef 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -10,7 +10,7 @@ from datetime import datetime, timedelta from .serializers import (UserSerializer, CreateGuardianSerializer, TaskSerializer, TaskDetailsSerializer, TopJuniorSerializer) from .models import Guardian, JuniorTask -from junior.models import Junior +from junior.models import Junior, JuniorPoints from junior.serializers import JuniorDetailSerializer from account.models import UserEmailOtp from .tasks import generate_otp @@ -84,7 +84,8 @@ class TaskListAPIView(viewsets.ModelViewSet): def list(self, request, *args, **kwargs): """Create guardian profile""" status_value = self.request.GET.get('status') - if status_value == 0: + print("status_value==>",status_value,'===>',type(status_value)) + if str(status_value) == '0': queryset = JuniorTask.objects.filter(guardian__user=request.user).order_by('created_at') else: queryset = JuniorTask.objects.filter(guardian__user=request.user, @@ -138,23 +139,15 @@ class SearchTaskListAPIView(viewsets.ModelViewSet): serializer = TaskDetailsSerializer(paginated_queryset, many=True) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) + class TopJuniorListAPIView(viewsets.ModelViewSet): """Top juniors list""" serializer_class = TopJuniorSerializer permission_classes = [IsAuthenticated] - queryset = JuniorTask.objects.all() + queryset = JuniorPoints.objects.all() def list(self, request, *args, **kwargs): """fetch junior list those complete their task""" - junior_ids_with_total_points = JuniorTask.objects.filter(task_status=1) \ - .values('junior') \ - .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}) + junior_total_points = self.get_queryset().order_by('-total_task_points') + serializer = self.get_serializer(junior_total_points, many=True) return custom_response(serializer.data, response_status=status.HTTP_200_OK) diff --git a/junior/admin.py b/junior/admin.py index 87cd7d8..bb9ea49 100644 --- a/junior/admin.py +++ b/junior/admin.py @@ -2,7 +2,7 @@ """Third party Django app""" from django.contrib import admin """Import Django app""" -from .models import Junior +from .models import Junior, JuniorPoints # Register your models here. @admin.register(Junior) class JuniorAdmin(admin.ModelAdmin): @@ -12,3 +12,12 @@ class JuniorAdmin(admin.ModelAdmin): def __str__(self): """Return email id""" 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 diff --git a/junior/migrations/0008_juniorpoints.py b/junior/migrations/0008_juniorpoints.py new file mode 100644 index 0000000..d16b7e2 --- /dev/null +++ b/junior/migrations/0008_juniorpoints.py @@ -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', + }, + ), + ] diff --git a/junior/models.py b/junior/models.py index 2534b50..167983f 100644 --- a/junior/models.py +++ b/junior/models.py @@ -41,3 +41,21 @@ class Junior(models.Model): def __str__(self): """Return email id""" 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}' diff --git a/junior/serializers.py b/junior/serializers.py index 7506f81..b87c799 100644 --- a/junior/serializers.py +++ b/junior/serializers.py @@ -199,6 +199,8 @@ class JuniorProfileSerializer(serializers.ModelSerializer): first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') notification_count = serializers.SerializerMethodField('get_notification_count') + total_count = serializers.SerializerMethodField('get_total_count') + complete_field_count = serializers.SerializerMethodField('get_complete_field_count') def get_auth(self, obj): """user email address""" @@ -213,12 +215,22 @@ class JuniorProfileSerializer(serializers.ModelSerializer): return obj.auth.last_name def get_notification_count(self, obj): - """user email address""" + """total notification count""" return 0 + def get_total_count(self, obj): + """total fields count""" + return 9 + + def get_complete_field_count(self, obj): + """total filled fields count""" + field_list = [obj.auth.first_name, obj.auth.last_name, obj.auth.email, obj.country_name, obj.country_code, + obj.phone, obj.gender, obj.dob, obj.image] + complete_field = [data for data in field_list if data is not None and data != ''] + return len(complete_field) class Meta(object): """Meta info""" model = Junior fields = ['id', 'email', 'first_name', 'last_name', 'country_name', 'country_code', 'phone', 'gender', 'dob', 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', - 'updated_at', 'notification_count'] + 'updated_at', 'notification_count', 'total_count', 'complete_field_count']