from rest_framework import serializers from django.contrib.auth.models import User from .models import UserPreferences, UserProfile class UserSerializer(serializers.ModelSerializer): club_id = serializers.SerializerMethodField() club_name = serializers.SerializerMethodField() class Meta: model = User fields = ['id', 'username', 'email', 'first_name', 'last_name', 'club_id', 'club_name'] read_only_fields = ['id'] def get_club_id(self, obj): if hasattr(obj, 'profile') and obj.profile and obj.profile.club: return obj.profile.club.id return None def get_club_name(self, obj): if hasattr(obj, 'profile') and obj.profile and obj.profile.club: return obj.profile.club.name return None class LoginSerializer(serializers.Serializer): username = serializers.CharField() password = serializers.CharField(write_only=True) class RegisterSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True, min_length=8) password_confirm = serializers.CharField(write_only=True) class Meta: model = User fields = ['username', 'email', 'password', 'password_confirm', 'first_name', 'last_name'] def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError('A user with this email already exists') return value def validate(self, attrs): if attrs['password'] != attrs['password_confirm']: raise serializers.ValidationError({'password_confirm': 'Passwords do not match'}) return attrs def create(self, validated_data): validated_data.pop('password_confirm') user = User.objects.create_user( username=validated_data['username'], email=validated_data.get('email', ''), password=validated_data['password'], first_name=validated_data.get('first_name', ''), last_name=validated_data.get('last_name', ''), ) return user class UserPreferencesSerializer(serializers.ModelSerializer): class Meta: model = UserPreferences fields = '__all__' class UserListSerializer(serializers.ModelSerializer): role = serializers.SerializerMethodField() class Meta: model = User fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_active', 'role', 'date_joined'] def get_role(self, obj): if hasattr(obj, 'profile'): return obj.profile.role return 'trainer' class UserCreateSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) role = serializers.ChoiceField(choices=UserProfile.ROLE_CHOICES, default='trainer') class Meta: model = User fields = ['id', 'username', 'email', 'first_name', 'last_name', 'password', 'role'] def create(self, validated_data): role = validated_data.pop('role', 'trainer') user = User.objects.create_user(**validated_data) user.profile.role = role user.profile.save(update_fields=['role']) return user class UserUpdateSerializer(serializers.ModelSerializer): role = serializers.ChoiceField(choices=UserProfile.ROLE_CHOICES, required=False) class Meta: model = User fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_active', 'role'] def update(self, instance, validated_data): role = validated_data.pop('role', None) user = super().update(instance, validated_data) if role and hasattr(user, 'profile'): user.profile.role = role user.profile.save() return user class PasswordChangeSerializer(serializers.Serializer): password = serializers.CharField(write_only=True, required=True)