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