90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
from django.db import transaction
|
|
|
|
from rest_framework import serializers
|
|
|
|
from core.apps.tasks.models.comment import Comment, CommentFile
|
|
|
|
|
|
class CommentCreatedBySerializer(serializers.Serializer):
|
|
id = serializers.IntegerField()
|
|
first_name = serializers.CharField()
|
|
last_name = serializers.CharField()
|
|
avatar = serializers.SerializerMethodField()
|
|
|
|
def get_avatar(self, obj):
|
|
request = self.context.get('request')
|
|
if obj.avatar and request:
|
|
return request.build_absolute_uri(obj.avatar.url)
|
|
if obj.avatar:
|
|
return obj.avatar.url
|
|
return None
|
|
|
|
|
|
class CommentFileSerializer(serializers.ModelSerializer):
|
|
file = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = CommentFile
|
|
fields = ['id', 'file']
|
|
|
|
def get_file(self, obj):
|
|
request = self.context.get('request')
|
|
if not obj.file:
|
|
return None
|
|
if request:
|
|
return request.build_absolute_uri(obj.file.url)
|
|
return obj.file.url
|
|
|
|
|
|
class CommentSerializer(serializers.ModelSerializer):
|
|
created_by = CommentCreatedBySerializer(read_only=True)
|
|
files = CommentFileSerializer(many=True, read_only=True)
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = [
|
|
'id', 'message', 'type', 'created_by', 'created_at', 'files'
|
|
]
|
|
|
|
|
|
class CommentCreateSerializer(serializers.ModelSerializer):
|
|
files = serializers.ListField(
|
|
child=serializers.FileField(),
|
|
required=False,
|
|
write_only=True,
|
|
)
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = [
|
|
'id', 'message', 'type', 'task', 'files', 'created_at'
|
|
]
|
|
read_only_fields = ['id', 'created_at']
|
|
|
|
def create(self, validated_data):
|
|
files = validated_data.pop('files', [])
|
|
with transaction.atomic():
|
|
comment = Comment.objects.create(
|
|
created_by=self.context['request'].user,
|
|
**validated_data
|
|
)
|
|
CommentFile.objects.bulk_create([
|
|
CommentFile(comment=comment, file=f) for f in files
|
|
])
|
|
return comment
|
|
|
|
def update(self, instance, validated_data):
|
|
files = validated_data.pop('files', None)
|
|
with transaction.atomic():
|
|
for attr, value in validated_data.items():
|
|
setattr(instance, attr, value)
|
|
instance.save()
|
|
if files is not None:
|
|
CommentFile.objects.bulk_create([
|
|
CommentFile(comment=instance, file=f) for f in files
|
|
])
|
|
return instance
|
|
|
|
def to_representation(self, instance):
|
|
return CommentSerializer(instance, context=self.context).data
|