from rest_framework import serializers from .models import Task, TaskApplication, TaskInvitation, DeliveryRecord class DeliveryRecordSerializer(serializers.ModelSerializer): class Meta: model = DeliveryRecord fields = '__all__' class TaskApplicationSerializer(serializers.ModelSerializer): applicant_name = serializers.ReadOnlyField(source='applicant.nickname') applicant_username = serializers.ReadOnlyField(source='applicant.username') applicant_avatar = serializers.ReadOnlyField(source='applicant.avatar_url') applicant_rating = serializers.ReadOnlyField(source='applicant.rating') applicant_completed_tasks = serializers.ReadOnlyField(source='applicant.completed_tasks') task_detail = serializers.SerializerMethodField() is_invited = serializers.SerializerMethodField() delivery_records = DeliveryRecordSerializer(many=True, read_only=True) class Meta: model = TaskApplication fields = '__all__' read_only_fields = ['id', 'applicant', 'status', 'reviewed_by', 'reviewed_at', 'created_at', 'updated_at'] def get_task_detail(self, obj): return { 'id': obj.task.id, 'title': obj.task.title, 'budget_min': obj.task.budget_min, 'budget_max': obj.task.budget_max, 'status': obj.task.status, } def get_is_invited(self, obj): from .models import TaskInvitation return TaskInvitation.objects.filter(task=obj.task, expert=obj.applicant).exists() class TaskInvitationSerializer(serializers.ModelSerializer): enterprise_name = serializers.ReadOnlyField(source='task.enterprise.company_name') enterprise_logo = serializers.ReadOnlyField(source='task.enterprise.logo_url') enterprise_avatar = serializers.ReadOnlyField(source='task.publisher.avatar_url') inviter_name = serializers.ReadOnlyField(source='task.publisher.nickname') enterprise_phone = serializers.ReadOnlyField(source='task.publisher.phone') task_title = serializers.ReadOnlyField(source='task.title') expert_name = serializers.ReadOnlyField(source='expert.nickname') expert_avatar = serializers.ReadOnlyField(source='expert.avatar_url') expert_phone = serializers.ReadOnlyField(source='expert.phone') class Meta: model = TaskInvitation fields = '__all__' read_only_fields = ['id', 'created_at', 'updated_at'] class TaskSerializer(serializers.ModelSerializer): applications = TaskApplicationSerializer(many=True, read_only=True) invitations = TaskInvitationSerializer(many=True, read_only=True) publisher_name = serializers.ReadOnlyField(source='publisher.nickname') publisher_avatar = serializers.ReadOnlyField(source='publisher.avatar_url') publisher_phone = serializers.ReadOnlyField(source='publisher.phone') enterprise_name = serializers.ReadOnlyField(source='enterprise.company_name') enterprise_logo = serializers.ReadOnlyField(source='enterprise.logo_url') class Meta: model = Task fields = '__all__' read_only_fields = ['id', 'publisher', 'enterprise', 'created_at', 'updated_at', 'assigned_at', 'completed_at', 'cancelled_at']