nabilah_argyanti_ardyningrum/backend/easycookapi-main/accounts/serializers.py
2024-12-31 09:49:01 +07:00

106 lines
3.5 KiB
Python

from rest_framework import serializers, status
from django.contrib.auth import authenticate
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.models import User
from profiles.models import Account
from django.db import IntegrityError
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['first_name', 'last_name', 'username', 'email']
class RegisterSerializer(serializers.ModelSerializer):
username = serializers.CharField(
error_messages={
"required": "Username harus diisi",
"invalid": "Username yang diisi tidak sesuai dengan format",
"unique": "Username sudah terdaftar. Silakan gunakan username lain",
},
)
email = serializers.CharField(
error_messages={
"required": "Email harus diisi",
"invalid": "Email yang diisi tidak sesuai dengan format",
"unique": "Email sudah terdaftar. Silakan gunakan email lain.",
},
)
phone = serializers.CharField(max_length=20, required=False, error_messages={
"unique": "Nomor telepon sudah terdaftar. Silakan gunakan nomor lain.",
},)
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = ['first_name', 'last_name',
'username', 'email', 'phone', 'password']
def create(self, validated_data):
phone = validated_data.pop('phone', None)
first_name = validated_data.get('first_name', '')
words = first_name.split()
if len(words) > 1 and 'last_name' not in validated_data:
first_name = words[0]
last_name = ' '.join(words[1:])
validated_data['first_name'] = first_name
validated_data['last_name'] = last_name
try:
user = User.objects.create_user(**validated_data)
Account.objects.create(user=user, phone=phone)
except IntegrityError:
error_message = "Username atau email sudah pernah digunakan"
raise serializers.ValidationError(
{"message": error_message}, code=status.HTTP_400_BAD_REQUEST)
return user
class AuthTokenSerializer(serializers.Serializer):
username = serializers.CharField(
label=_("Username"),
error_messages={'required': 'Username harus diisi'}
)
password = serializers.CharField(
label=_("Password"),
style={'input_type': 'password'},
trim_whitespace=False,
write_only=True,
error_messages={'required': 'Password harus diisi'}
)
token = serializers.CharField(
label=_("Token"),
read_only=True
)
extra_kwargs = {
"username": {
"error_messages": {
"required": "Username harus diisi",
"invalid": "Username yang diisi tidak sesuai dengan format"
}
}
}
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if username and password:
user = authenticate(request=self.context.get('request'),
username=username, password=password)
if not user:
msg = _('Username atau password salah')
raise serializers.ValidationError(msg, code='authorization')
else:
msg = _('Harap masukan "username" dan "password"')
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
return attrs