Files
pagasis/backend/authentication/serializers.py
T
2025-10-20 16:14:08 -06:00

64 lines
2.4 KiB
Python

from rest_framework import serializers
from django.contrib.auth import authenticate
from django.contrib.auth.models import User
from .models import UserProfile
import re
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ['account_number', 'user_type', 'full_name']
class UserSerializer(serializers.ModelSerializer):
profile = UserProfileSerializer(source='userprofile', read_only=True)
class Meta:
model = User
fields = ['id', 'username', 'email', 'first_name', 'last_name', 'profile', 'is_staff', 'is_superuser']
class LoginSerializer(serializers.Serializer):
account_number = serializers.CharField(max_length=20)
def validate_account_number(self, value):
# Validar formato para números de cuenta (8 dígitos)
if not re.match(r'^\d{8}$', value):
raise serializers.ValidationError('El número de cuenta debe tener exactamente 8 dígitos.')
return value
def validate(self, data):
account_number = data.get('account_number')
if not account_number:
raise serializers.ValidationError('Debe incluir número de cuenta.')
# Primero buscar en usuarios regulares (estudiantes/asistentes)
try:
profile = UserProfile.objects.get(account_number=account_number)
user = profile.user
if not user.is_active:
raise serializers.ValidationError('Esta cuenta está desactivada.')
data['user'] = user
return data
except UserProfile.DoesNotExist:
pass
# Si no es usuario regular, buscar en usuarios externos
from authentication.models import ExternalUser
try:
external_user = ExternalUser.objects.get(account_number=account_number)
if external_user.status != 'approved':
raise serializers.ValidationError('Usuario externo no aprobado.')
# Crear o buscar usuario de Django asociado
user, created = User.objects.get_or_create(
username=f'ext_{account_number}',
defaults={'first_name': external_user.full_name}
)
data['user'] = user
data['external_user'] = external_user
return data
except ExternalUser.DoesNotExist:
raise serializers.ValidationError('Número de cuenta no encontrado.')
return data