60 lines
2.6 KiB
Python

from djoser.serializers import UserCreateSerializer as BaseUserCreateSerializer
from rest_framework import serializers
from .models import CustomUser
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.tokens import RefreshToken
from django.conf import settings
class UserCreateSerializer(BaseUserCreateSerializer):
# Serializer สำหรับการลงทะเบียน (Djoser จะใช้ตัวนี้)
class Meta(BaseUserCreateSerializer.Meta):
model = CustomUser
fields = ('id', 'username', 'email', 'phone_number', 'password') # เพิ่ม phone_number
class UserSerializer(serializers.ModelSerializer):
# Serializer สำหรับการดึงข้อมูล (ใช้แสดงข้อมูลผู้ใช้ปัจจุบัน)
class Meta:
model = CustomUser
fields = (
'id', 'username', 'email', 'phone_number', 'first_name', 'last_name',
# เพิ่มฟิลด์สถานะสิทธิ์/Role สำหรับ RBAC
'is_active', 'is_staff', 'is_superuser',
# เพิ่ม 'role' ใน model
'role',
)
# ตั้งค่า is_active, is_staff, is_superuser เป็น read_only
read_only_fields = ('id', 'username', 'is_active', 'is_staff', 'is_superuser', 'role')
# Serializer สำหรับ Login JWT ที่รับค่า remember_me
class CustomTokenObtainPairSerializer(TokenObtainPairSerializer):
def validate(self, attrs):
# print("CustomTokenObtainPairSerializer called")
data = super().validate(attrs)
# รับ remember_me จาก request (รองรับ true/false ทั้ง bool และ string)
remember_raw = self.context['request'].data.get('remember_me', False)
remember_me = (
remember_raw is True or
str(remember_raw).lower() == "true" or
remember_raw == "1"
)
refresh = self.get_token(self.user)
# ฝัง remember_me ลงใน payload
refresh['remember_me'] = remember_me
# ถ้า remember_me=True → อายุ Refresh Token เป็น 30 วัน
if remember_me:
refresh.set_exp(
from_time=refresh.current_time,
lifetime=settings.SIMPLE_JWT['REFRESH_TOKEN_LIFETIME_REMEMBER_ME']
)
data['refresh'] = str(refresh)
data['access'] = str(refresh.access_token)
return data