""" web_admin analytics serializer file """ # third party imports from rest_framework import serializers # django imports from django.contrib.auth import get_user_model from account.utils import get_user_full_name # local imports from base.constants import USER_TYPE, JUNIOR from junior.models import JuniorPoints, Junior USER = get_user_model() class JuniorLeaderboardSerializer(serializers.ModelSerializer): """ junior leaderboard serializer """ name = serializers.SerializerMethodField() first_name = serializers.SerializerMethodField() last_name = serializers.SerializerMethodField() class Meta: """ meta class """ model = Junior fields = ('id', 'name', 'first_name', 'last_name', 'is_active', 'image', 'is_deleted') @staticmethod def get_name(obj): """ :param obj: junior object :return: full name """ return get_user_full_name(obj.auth) @staticmethod def get_first_name(obj): """ :param obj: junior object :return: first name """ return obj.auth.first_name @staticmethod def get_last_name(obj): """ :param obj: junior object :return: last name """ return obj.auth.last_name class LeaderboardSerializer(serializers.ModelSerializer): """ leaderboard serializer """ user_id = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField() junior = JuniorLeaderboardSerializer() rank = serializers.IntegerField() class Meta: """ meta class """ model = JuniorPoints fields = ('user_id', 'user_type', 'total_points', 'rank', 'junior') @staticmethod def get_user_id(obj): return obj.junior.auth.id @staticmethod def get_user_type(obj): return JUNIOR class UserCSVReportSerializer(serializers.ModelSerializer): """ user csv/xls report serializer """ name = serializers.SerializerMethodField() phone_number = serializers.SerializerMethodField() user_type = serializers.SerializerMethodField() is_active = serializers.SerializerMethodField() date_joined = serializers.SerializerMethodField() class Meta: """ meta class """ model = USER fields = ('name', 'email', 'phone_number', 'user_type', 'is_active', 'date_joined') @staticmethod def get_name(obj): """ :param obj: user object :return: full name """ return get_user_full_name(obj) @staticmethod def get_phone_number(obj): """ :param obj: user object :return: user phone number """ if profile := (obj.guardian_profile.all().first() or obj.junior_profile.all().first()): return f"+{profile.country_code}{profile.phone}" \ if profile.country_code and profile.phone else profile.phone @staticmethod def get_user_type(obj): """ :param obj: user object :return: user type """ if obj.guardian_profile.all().first(): return dict(USER_TYPE).get('2').capitalize() elif obj.junior_profile.all().first(): return dict(USER_TYPE).get('1').capitalize() @staticmethod def get_is_active(obj): """ :param obj: user object :return: user type """ if profile := (obj.guardian_profile.all().first() or obj.junior_profile.all().first()): return "Active" if profile.is_active else "Inactive" @staticmethod def get_date_joined(obj): """ :param obj: user obj :return: formatted date """ date = obj.date_joined.strftime("%d %b %Y") return date