wallet/apps/users/serializers.py
2022-09-27 18:03:16 +03:30

121 lines
3.7 KiB
Python

from django.core.validators import RegexValidator
from rest_framework import serializers
from apps.users.models import User
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
phone_number_validator = RegexValidator(regex=r'^\+98\d{10,10}$', message=_(
"Phone number must be entered in the format: '+989999999999'."
),)
class PublicUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('avatar', 'name', 'username', "first_name", "last_name", "uuid")
read_only_fields = ['avatar', 'name', 'username', 'first_name', 'last_name', "uuid"]
class AccountSerializer(serializers.ModelSerializer):
phone_number = serializers.CharField(validators=[phone_number_validator], required=False, read_only=True)
class Meta:
model = User
fields = (
"uuid",
'username',
'email',
'phone_number',
"first_name",
"last_name",
'name',
'avatar',
'iban',
'iban_verified',
# 'country',
'province',
'province_name',
'city',
'city_name',
'postal_code',
'address',
)
read_only_fields = ['uuid', 'email', 'phone_number', 'iban_verified', 'province_name', 'city_name',]
class RequestOTPSerializer(serializers.ModelSerializer):
phone_number = serializers.CharField(required=True, validators=[phone_number_validator])
ttl = serializers.SerializerMethodField()
class Meta:
model = User
fields = (
'phone_number',
'otp_expire',
'ttl'
)
read_only_fields = ['otp_expire', 'ttl']
def save(self, **kwargs):
# TODO: move it to query set
validated_data = self.validated_data
user = User.objects.filter(phone_number=validated_data['phone_number']).first()
if not user:
validated_data['username'] = validated_data['phone_number']
user = User.objects.create_user(**validated_data)
if not user.otp_is_valid():
user.set_otp()
user.save()
user.send_otp()
self.instance = user
return user
def get_ttl(self, obj: User):
if obj.otp_expire > timezone.now():
ttl = obj.otp_expire - timezone.now()
result = ttl.total_seconds()
else:
result = 0
return result
class RequestOTTSerializer(serializers.ModelSerializer):
application = serializers.CharField(required=True, write_only=True)
class Meta:
model = User
fields = (
'application',
'ott',
'ott_expire',
)
read_only_fields = ['ott', 'ott_expire']
class UserInquirySerializer(serializers.ModelSerializer):
phone_number = serializers.CharField(required=True, validators=[phone_number_validator])
class Meta:
model = User
fields = ('avatar', 'name', 'username', "first_name", "last_name", "uuid", 'phone_number')
read_only_fields = ['avatar', 'name', 'username', 'first_name', 'last_name', "uuid"]
def save(self, **kwargs):
# TODO: move it to query set
validated_data = self.validated_data
user = User.objects.filter(phone_number=validated_data['phone_number']).first()
if not user:
user = User.objects.create_user(**validated_data)
self.instance = user
return user
class ChangePasswordSerializer(serializers.Serializer):
old_password = serializers.CharField(required=True)
old_password_field = serializers.CharField(default='password')
new_password = serializers.CharField(required=True)