158 lines
4.8 KiB
Python
158 lines
4.8 KiB
Python
from django.core.validators import RegexValidator
|
|
from oauth2_provider.models import get_access_token_model
|
|
from rest_framework import serializers
|
|
|
|
from apps.users.models import User
|
|
from django.utils import timezone
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from utils.exceptions import UnprocessableEntity
|
|
|
|
phone_number_validator = RegexValidator(regex=r'^\+98[1-9]\d{9}$', 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',
|
|
'gender',
|
|
'education_degree',
|
|
'education_field',
|
|
'birthdate',
|
|
'iban',
|
|
'iban_verified',
|
|
# 'country',
|
|
'province',
|
|
'province_name',
|
|
'city',
|
|
'city_name',
|
|
'postal_code',
|
|
'address',
|
|
)
|
|
read_only_fields = ['uuid', '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():
|
|
try:
|
|
user.set_otp()
|
|
except Exception as e:
|
|
raise UnprocessableEntity(_('otp expire time not reached'))
|
|
|
|
user.send_otp()
|
|
|
|
else:
|
|
raise UnprocessableEntity(_('otp expire time not reached yet'))
|
|
|
|
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"]
|
|
|
|
fields = ("uuid", 'phone_number')
|
|
read_only_fields = ["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)
|
|
|
|
|
|
AccessToken = get_access_token_model()
|
|
class SessionSerializer(serializers.ModelSerializer):
|
|
is_current = serializers.SerializerMethodField()
|
|
|
|
def get_is_current(self, obj):
|
|
request = self.context.get('request')
|
|
token = request and request.auth and request.auth.token
|
|
if token == obj.token:
|
|
result = True
|
|
|
|
else:
|
|
result = False
|
|
|
|
return result
|
|
|
|
|
|
class Meta:
|
|
model = AccessToken
|
|
fields = ('uuid', 'created', "detail", "is_current")
|
|
read_only_fields = ['uuid', 'created', "detail", "is_current" ]
|