from rest_framework import serializers from django.contrib.auth.models import User from .models import Guardian from django.db import transaction import random from account.models import UserProfile from junior.models import Junior from base.constants import GENDERS, GUARDIAN, JUNIOR, SUPERUSER from rest_framework_simplejwt.tokens import RefreshToken from base.messages import ERROR_CODE, SUCCESS_CODE class UserSerializer(serializers.ModelSerializer): auth_token = serializers.SerializerMethodField('get_auth_token') class Meta(object): model = User fields = ['email', 'password', 'auth_token'] def get_auth_token(self, obj): refresh = RefreshToken.for_user(obj) access_token = str(refresh.access_token) return access_token def create(self, validated_data): email = validated_data.get('email') user_type = self.context password = validated_data.get('password') try: user = User.objects.create_user(username=email, email=email, password=password) UserProfile.objects.create(user=user, user_type=user_type) return user except: raise serializers.ValidationError({"details":ERROR_CODE['2021']}) def save(self, **kwargs): with transaction.atomic(): instance = super().save(**kwargs) return instance class CreateGuardianSerializer(serializers.ModelSerializer): 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) family_name = serializers.CharField(max_length=100, required=False) country_code = serializers.IntegerField(required=False) dob = serializers.DateField(required=False) referral_code = serializers.CharField(max_length=100, required=False) class Meta(object): model = Guardian fields = ['first_name', 'last_name', 'email', 'phone', 'family_name', 'gender', 'country_code', 'dob', 'referral_code', 'passcode', 'is_complete_profile'] def get_first_name(self,obj): return obj.user.first_name def get_last_name(self,obj): return obj.user.last_name def get_email(self,obj): return obj.user.email def create(self, validated_data): user = User.objects.filter(username=self.context['user']).last() if user: user.first_name = self.context.get('first_name', user.first_name) user.last_name = self.context.get('last_name', user.last_name) user.save() guardian, created = Guardian.objects.get_or_create(user=self.context['user']) if created: guardian.referral_code = ''.join([str(random.randrange(9)) for _ in range(4)]) guardian.guardian_code = ''.join([str(random.randrange(9)) for _ in range(4)]) if guardian: guardian.phone = validated_data.get('phone', guardian.phone) guardian.gender = validated_data.get('gender',guardian.gender) guardian.family_name = validated_data.get('family_name', guardian.family_name) guardian.dob = validated_data.get('dob',guardian.dob) guardian.passcode = validated_data.get('passcode', guardian.passcode) complete_profile_field = all([guardian.phone, guardian.gender, guardian.family_name, guardian.dob, guardian.country_code, user.first_name, user.last_name]) guardian.is_complete_profile = False if complete_profile_field: guardian.is_complete_profile = True guardian.country_code = validated_data.get('country_code', guardian.country_code) guardian.save() return guardian def save(self, **kwargs): with transaction.atomic(): instance = super().save(**kwargs) return instance