"""Serializer file for junior""" """Import Django 3rd party app""" from rest_framework import serializers from django.contrib.auth.models import User from django.db import transaction import random """Import django app""" from junior.models import Junior, JuniorPoints from guardian.utils import upload_image_to_alibaba from base.messages import ERROR_CODE, SUCCESS_CODE from guardian.models import Guardian, JuniorTask from base.constants import PENDING, IN_PROGRESS, REJECTED, REQUESTED, COMPLETED class ListCharField(serializers.ListField): """Serializer for Array field""" child = serializers.CharField() def to_representation(self, data): """to represent the data""" return data def to_internal_value(self, data): """internal value""" if isinstance(data, list): return data raise serializers.ValidationError({"details":ERROR_CODE['2025']}) class CreateJuniorSerializer(serializers.ModelSerializer): """Create junior serializer""" first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') email = serializers.SerializerMethodField('get_email') phone = serializers.CharField(max_length=20, required=False) country_code = serializers.IntegerField(required=False) dob = serializers.DateField(required=False) referral_code = serializers.CharField(max_length=100, required=False) guardian_code = ListCharField(required=False) image = serializers.URLField(required=False) class Meta(object): """Meta info""" model = Junior fields = ['first_name', 'last_name', 'email', 'phone', 'gender', 'country_code', 'dob', 'referral_code', 'passcode', 'is_complete_profile', 'guardian_code', 'referral_code_used', 'country_name', 'image'] def get_first_name(self,obj): """first name of junior""" return obj.auth.first_name def get_last_name(self,obj): """last name of junior""" return obj.auth.last_name def get_email(self,obj): """email of junior""" return obj.auth.email def create(self, validated_data): """Create junior profile""" guardian_code = validated_data.get('guardian_code',None) user = User.objects.filter(username=self.context['user']).last() if user: """Save first and last name of junior""" if self.context.get('first_name') != '' and self.context.get('first_name') is not None: user.first_name = self.context.get('first_name') if self.context.get('last_name') != '' and self.context.get('last_name') is not None: user.last_name = self.context.get('last_name') user.save() """Create junior data""" junior, created = Junior.objects.get_or_create(auth=self.context['user']) if created: """Create referral code and junior code""" junior.referral_code = ''.join([str(random.randrange(9)) for _ in range(4)]) junior.junior_code = ''.join([str(random.randrange(9)) for _ in range(4)]) if junior: """update details according to the data get from request""" junior.gender = validated_data.get('gender',junior.gender) """Update guardian code""" junior.guardian_code = validated_data.get('guardian_code', junior.guardian_code) """condition for guardian code""" if guardian_code: junior.guardian_code = guardian_code junior.dob = validated_data.get('dob',junior.dob) junior.passcode = validated_data.get('passcode', junior.passcode) junior.country_name = validated_data.get('country_name', junior.country_name) """Update country code and phone number""" junior.phone = validated_data.get('phone', junior.phone) 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) """Complete profile of the junior if below all data are filled""" complete_profile_field = all([junior.phone, junior.gender, junior.country_name, junior.image, junior.dob, junior.country_code, user.first_name, user.last_name, user.email, junior.passcode]) junior.is_complete_profile = False if complete_profile_field: junior.is_complete_profile = True junior.save() return junior def save(self, **kwargs): """Save the data into junior table""" with transaction.atomic(): instance = super().save(**kwargs) return instance class JuniorDetailSerializer(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.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 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'] class JuniorDetailListSerializer(serializers.ModelSerializer): """junior serializer""" email = serializers.SerializerMethodField('get_auth') first_name = serializers.SerializerMethodField('get_first_name') last_name = serializers.SerializerMethodField('get_last_name') assigned_task = serializers.SerializerMethodField('get_assigned_task') points = serializers.SerializerMethodField('get_points') in_progress_task = serializers.SerializerMethodField('get_in_progress_task') completed_task = serializers.SerializerMethodField('get_completed_task') requested_task = serializers.SerializerMethodField('get_requested_task') rejected_task = serializers.SerializerMethodField('get_rejected_task') pending_task = serializers.SerializerMethodField('get_pending_task') position = serializers.SerializerMethodField('get_position') 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 def get_assigned_task(self, obj): data = JuniorTask.objects.filter(junior=obj).count() return data def get_position(self, obj): data = JuniorPoints.objects.filter(junior=obj).last() if data: return data.position return 99999 def get_points(self, obj): data = sum(JuniorTask.objects.filter(junior=obj, task_status=COMPLETED).values_list('points', flat=True)) return data def get_in_progress_task(self, obj): data = JuniorTask.objects.filter(junior=obj, task_status=IN_PROGRESS).count() return data def get_completed_task(self, obj): data = JuniorTask.objects.filter(junior=obj, task_status=COMPLETED).count() return data def get_requested_task(self, obj): data = JuniorTask.objects.filter(junior=obj, task_status=REQUESTED).count() return data def get_rejected_task(self, obj): data = JuniorTask.objects.filter(junior=obj, task_status=REJECTED).count() return data def get_pending_task(self, obj): data = JuniorTask.objects.filter(junior=obj, task_status=PENDING).count() return data 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', 'assigned_task','points', 'pending_task', 'in_progress_task', 'completed_task', 'requested_task', 'rejected_task', 'position'] 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') total_count = serializers.SerializerMethodField('get_total_count') complete_field_count = serializers.SerializerMethodField('get_complete_field_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): """total notification count""" return 0 def get_total_count(self, obj): """total fields count""" return 10 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, obj.passcode] 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', 'total_count', 'complete_field_count', 'signup_method']