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
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)
|