from rest_framework import serializers from apps.messaging.models import BulkMessage, Channel, MessageRecipient class SendBulkMessageSerializer(serializers.Serializer): group_id = serializers.CharField(required=False, allow_null=True, default=None) contact_ids = serializers.ListField(child=serializers.CharField(), required=False, default=list) template_id = serializers.CharField(required=False, allow_null=True, default=None) body_override = serializers.CharField(required=False, allow_blank=True, default="") channels = serializers.ListField(child=serializers.ChoiceField(choices=Channel.choices), min_length=1) def validate(self, attrs): if not attrs.get("template_id") and not attrs.get("body_override"): raise serializers.ValidationError("یا template_id بده یا body_override.") return attrs class MessageRecipientSerializer(serializers.ModelSerializer): contact_name = serializers.CharField(source="contact.name", read_only=True) contact_phone = serializers.CharField(source="contact.phone", read_only=True) class Meta: model = MessageRecipient fields = [ "id", "contact", "contact_name", "contact_phone", "channel", "status", "rendered_body", "error", ] class BulkMessageSerializer(serializers.ModelSerializer): recipients = MessageRecipientSerializer(many=True, read_only=True) needs_manual = serializers.SerializerMethodField() class Meta: model = BulkMessage fields = ["id", "group", "template", "channels", "status", "created_at", "recipients", "needs_manual"] def get_needs_manual(self, obj: BulkMessage): pending = obj.recipients.filter(status=MessageRecipient.Status.NEEDS_MANUAL) return MessageRecipientSerializer(pending, many=True).data class ContactMessageHistorySerializer(serializers.ModelSerializer): """یک ردیفِ تاریخچه — متنِ واقعیِ فرستاده‌شده، کانال، وضعیت و زمان.""" sent_at = serializers.DateTimeField(source="bulk_message.created_at", read_only=True) channel_display = serializers.CharField(source="get_channel_display", read_only=True) status_display = serializers.CharField(source="get_status_display", read_only=True) class Meta: model = MessageRecipient fields = [ "id", "channel", "channel_display", "status", "status_display", "rendered_body", "error", "sent_at", ]