from decimal import Decimal from rest_framework import serializers from drf_spectacular.utils import extend_schema_field from apps.donations.models import ( DonationCampaign, DonationTransaction, CampaignCategory, CampaignPriority, PaymentStatus, ) class DonationTransactionSerializer(serializers.ModelSerializer): campaign_title = serializers.CharField(source='campaign.title', read_only=True) class Meta: model = DonationTransaction fields = [ 'id', 'transaction_reference', 'campaign', 'campaign_title', 'donor_name', 'amount', 'currency', 'payment_status', 'created_at', ] read_only_fields = ['id', 'transaction_reference', 'payment_status', 'created_at'] class DonationCampaignListSerializer(serializers.ModelSerializer): institution_name = serializers.CharField(source='institution.name', read_only=True) progress_percentage = serializers.IntegerField(read_only=True) donors_count = serializers.IntegerField(read_only=True) class Meta: model = DonationCampaign fields = [ 'id', 'title', 'slug', 'description', 'target_amount', 'raised_amount', 'currency', 'category', 'priority', 'cover_image', 'institution', 'institution_name', 'organization_name', 'deadline', 'progress_percentage', 'donors_count', 'is_featured', 'created_at', ] class DonationCampaignDetailSerializer(serializers.ModelSerializer): institution_name = serializers.CharField(source='institution.name', read_only=True) progress_percentage = serializers.IntegerField(read_only=True) donors_count = serializers.IntegerField(read_only=True) recent_donations = serializers.SerializerMethodField() class Meta: model = DonationCampaign fields = [ 'id', 'title', 'slug', 'description', 'target_amount', 'raised_amount', 'currency', 'category', 'priority', 'cover_image', 'institution', 'institution_name', 'organization_name', 'deadline', 'progress_percentage', 'donors_count', 'is_featured', 'recent_donations', 'created_at', 'updated_at', ] @extend_schema_field(DonationTransactionSerializer(many=True)) def get_recent_donations(self, obj): recent = obj.transactions.filter(payment_status=PaymentStatus.COMPLETED)[:5] return DonationTransactionSerializer(recent, many=True).data class DonationContributeRequestSerializer(serializers.Serializer): amount = serializers.DecimalField(max_digits=12, decimal_places=2, min_value=Decimal('1.00')) donor_name = serializers.CharField(required=False, default='Anonymous Donor', allow_blank=True) donor_email = serializers.EmailField(required=False, allow_blank=True, allow_null=True)