60 lines
2.6 KiB
Python
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
|