from rest_framework import serializers from django.contrib.auth import get_user_model from .models import Account, Transaction, Budget, Expense, Profile, Deadline User = get_user_model() class AccountSerializer(serializers.ModelSerializer): class Meta: model = Account exclude = ['user'] class TransactionSerializer(serializers.ModelSerializer): class Meta: model = Transaction fields = '__all__' def validate(self, data): request = self.context.get('request') if not request: return data user = request.user source = data.get('source_account') or (self.instance.source_account if self.instance else None) dest = data.get('destination_account') or (self.instance.destination_account if self.instance else None) if source and source.user != user: raise serializers.ValidationError('Source account does not belong to you.') if dest and dest.user != user: raise serializers.ValidationError('Destination account does not belong to you.') return data class BudgetSerializer(serializers.ModelSerializer): class Meta: model = Budget fields = '__all__' class ExpenseSerializer(serializers.ModelSerializer): class Meta: model = Expense fields = '__all__' class ProfileSerializer(serializers.ModelSerializer): totp_enabled = serializers.BooleanField(read_only=True) class Meta: model = Profile exclude = ['user', 'totp_secret', 'email_verify_token', 'email_verify_token_expires', 'password_reset_token_hash', 'password_reset_token_expires'] class DeadlineSerializer(serializers.ModelSerializer): class Meta: model = Deadline exclude = ['user'] class RegisterSerializer(serializers.Serializer): email = serializers.EmailField() password = serializers.CharField(min_length=8, write_only=True) def validate_email(self, value): if User.objects.filter(email=value).exists(): raise serializers.ValidationError('Email already registered.') return value def create(self, validated_data): email = validated_data['email'] return User.objects.create_user( username=email, email=email, password=validated_data['password'], )