138 lines
4.0 KiB
Python
138 lines
4.0 KiB
Python
"""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
|