You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

69 lines
2.8 KiB

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)