text: from django import forms
  
  from utils.api import serializers, UsernameSerializer
  
  from .models import AdminType, ProblemPermission, User, UserProfile
  
  
  class UserLoginSerializer(serializers.Serializer):
      username = serializers.CharField()
      password = serializers.CharField()
      tfa_code = serializers.CharField(required=False, allow_blank=True)
  
  
  class UsernameOrEmailCheckSerializer(serializers.Serializer):
      username = serializers.CharField(required=False)
      email = serializers.EmailField(required=False)
  
  
  class UserRegisterSerializer(serializers.Serializer):
      username = serializers.CharField(max_length=32)
      password = serializers.CharField(min_length=6)
      email = serializers.EmailField(max_length=64)
      captcha = serializers.CharField()
  
  
  class UserChangePasswordSerializer(serializers.Serializer):
      old_password = serializers.CharField()
      new_password = serializers.CharField(min_length=6)
      tfa_code = serializers.CharField(required=False, allow_blank=True)
  
  
  class UserChangeEmailSerializer(serializers.Serializer):
      password = serializers.CharField()
      new_email = serializers.EmailField(max_length=64)
      tfa_code = serializers.CharField(required=False, allow_blank=True)
  
  
  class GenerateUserSerializer(serializers.Serializer):
      prefix = serializers.CharField(max_length=16, allow_blank=True)
      suffix = serializers.CharField(max_length=16, allow_blank=True)
      number_from = serializers.IntegerField()
      number_to = serializers.IntegerField()
      password_length = serializers.IntegerField(max_value=16, default=8)
  
  
  class ImportUserSeralizer(serializers.Serializer):
      users = serializers.ListField(
          child=serializers.ListField(child=serializers.CharField(max_length=64)))
  
  
  class UserAdminSerializer(serializers.ModelSerializer):
      real_name = serializers.SerializerMethodField()
  
      class Meta:
          model = User
          fields = ["id", "username", "email", "admin_type", "problem_permission", "real_name",
                    "create_time", "last_login", "two_factor_auth", "open_api", "is_disabled"]
  
      def get_real_name(self, obj):
          return obj.userprofile.real_name
  
  
  class UserSerializer(serializers.ModelSerializer):
      class Meta:
          model = User
          fields = ["id", "username", "email", "admin_type", "problem_permission",
                    "create_time", "last_login", "two_factor_auth", "open_api", "is_disabled"]
  
  
  class UserProfileSerializer(serializers.ModelSerializer):
      user = UserSerializer()
      real_name = serializers.SerializerMethodField()
      group = serializers.StringRelatedField()
  
      class Meta:
          model = UserProfile
          fields = "__all__"
  
      def __init__(self, *args, **kwargs):
          self.show_real_name = kwargs.pop("show_real_name", False)
          super(UserProfileSerializer, self).__init__(*args, **kwargs)
  
      def get_real_name(self, obj):
          return obj.real_name if self.show_real_name else None
  
  
  class EditUserSerializer(serializers.Serializer):
      id = serializers.IntegerField()
      username = serializers.CharField(max_length=32)
      real_name = serializers.CharField(max_length=32, allow_blank=True, allow_null=True)
      password = serializers.CharField(min_length=6, allow_blank=True, required=False, default=None)
      email = serializers.EmailField(max_length=64)
      admin_type = serializers.ChoiceField(choices=(AdminType.REGULAR_USER, AdminType.ADMIN, AdminType.SUPER_ADMIN))
      problem_permission = serializers.ChoiceField(choices=(ProblemPermission.NONE, ProblemPermission.OWN,
                                                            ProblemPermission.ALL))
      open_api = serializers.BooleanField()
      two_factor_auth = serializers.BooleanField()
      is_disabled = serializers.BooleanField()
  
  
  class EditUserProfileSerializer(serializers.HyperlinkedModelSerializer):
  
      class Meta:
          model = UserProfile
          fields = (
              'avatar', 'mood', 'blog', 'github',
          )
  
  
  class ApplyResetPasswordSerializer(serializers.Serializer):
      email = serializers.EmailField()
      captcha = serializers.CharField()
  
  
  class ResetPasswordSerializer(serializers.Serializer):
      token = serializers.CharField()
      password = serializers.CharField(min_length=6)
      captcha = serializers.CharField()
  
  
  class SSOSerializer(serializers.Serializer):
      appkey = serializers.CharField()
      token = serializers.CharField()
  
  
  class TwoFactorAuthCodeSerializer(serializers.Serializer):
      code = serializers.IntegerField()
  
  
  class ImageUploadForm(forms.Form):
      image = forms.FileField()
  
  
  class RankInfoSerializer(serializers.ModelSerializer):
      user = UsernameSerializer()
      group = serializers.StringRelatedField()
  
      class Meta:
          model = UserProfile
          fields = "__all__"
  