Files
opc-backend/tasks/serializers.py

70 lines
3.1 KiB
Python
Raw Permalink Normal View History

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']