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