2026-08-24 15:54:08 +03:30
|
|
|
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
|
2026-09-04 13:05:54 +03:30
|
|
|
|
|
|
|
|
|
|
|
|
|
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",
|
|
|
|
|
]
|