"""Review app back serializers.""" from django.contrib.contenttypes.models import ContentType from rest_framework import serializers from account.models import User from review.models import Review, ReviewTextAuthor class _ReviewerSerializer(serializers.ModelSerializer): class Meta: model = User fields = ( 'id', 'username', 'first_name', 'last_name', 'email', ) class _ContentTypeSerializer(serializers.ModelSerializer): class Meta: model = ContentType fields = ( 'id', 'app_label', 'model', ) class _ReviewTextAuthorSerializer(serializers.ModelSerializer): author = _ReviewerSerializer(read_only=True) class Meta: model = ReviewTextAuthor fields = ( 'id', 'author', 'locale', 'modified', ) class ReviewBackSerializer(serializers.ModelSerializer): reviewer_data = _ReviewerSerializer(read_only=True, source='reviewer') content_type_data = _ContentTypeSerializer(read_only=True, source='content_type') status_display = serializers.CharField(read_only=True, source='get_status_display') authors = _ReviewTextAuthorSerializer(read_only=True, many=True, source='text_authors') class Meta: model = Review fields = ( 'id', 'reviewer', 'reviewer_data', 'text', 'status', 'status_display', 'mark', 'priority', # 'child', 'published_at', 'vintage', # 'country', 'content_type', 'content_type_data', 'object_id', 'authors', ) def update(self, instance, validated_data): old_text = instance.text new_text = validated_data['text'] # если поле text не менялось - то ничего не делаем if new_text == old_text: return super().update(instance, validated_data) # если пользователь анонимный - то ничего не делаем user = self.context['request'].user if user.is_anonymous: return super().update(instance, validated_data) for locale, text in new_text.items(): # если поменяли имеющийся текст if locale in old_text and text != old_text[locale]: review_author, _ = ReviewTextAuthor.objects.update_or_create( review=instance, locale=locale, defaults={ 'author': user, } ) # если добавили новый перевод elif locale not in old_text: ReviewTextAuthor.objects.create( author=user, review=instance, locale=locale, ) for locale in old_text: # Если удалили перевод if locale not in new_text: ReviewTextAuthor.objects.filter( author=user, review=instance, locale=locale, ).delete() return super().update(instance, validated_data) def create(self, validated_data): obj = super().create(validated_data) new_text = validated_data['text'] # если нет переводов для review - то ничего не делаем if not isinstance(new_text, dict): return obj # если пользователь анонимный - то ничего не делаем user = self.context['request'].user if user.is_anonymous: return obj for locale, text in new_text.items(): ReviewTextAuthor.objects.create( author=user, review=obj, locale=locale, ) return obj