Merge branch 'review_users' into 'develop'

Review users

See merge request gm/gm-backend!188
This commit is contained in:
d.kuzmenko 2019-12-25 12:54:11 +00:00
commit 61eca800fc
4 changed files with 152 additions and 2 deletions

View File

@ -1,7 +1,8 @@
"""Admin page for app Review""" """Admin page for app Review"""
from . import models
from django.contrib import admin from django.contrib import admin
from utils.admin import BaseModelAdminMixin from utils.admin import BaseModelAdminMixin
from . import models
@admin.register(models.Review) @admin.register(models.Review)
@ -9,3 +10,11 @@ class ReviewAdminModel(BaseModelAdminMixin, admin.ModelAdmin):
"""Admin model for model Review.""" """Admin model for model Review."""
raw_id_fields = ('reviewer', 'child', 'country') raw_id_fields = ('reviewer', 'child', 'country')
@admin.register(models.ReviewTextAuthor)
class ReviewTextAuthorAdminModel(BaseModelAdminMixin, admin.ModelAdmin):
"""Admin model for model ReviewTextAuthor."""
list_display = ('author', 'review', 'locale', 'modified')
raw_id_fields = ('author', 'review')

View File

@ -0,0 +1,33 @@
# Generated by Django 2.2.7 on 2019-12-24 08:30
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('review', '0019_review_priority'),
]
operations = [
migrations.CreateModel(
name='ReviewTextAuthor',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(default=django.utils.timezone.now, editable=False, verbose_name='Date created')),
('modified', models.DateTimeField(auto_now=True, verbose_name='Date updated')),
('locale', models.CharField(max_length=10, verbose_name='locale')),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='review_authors', to=settings.AUTH_USER_MODEL, verbose_name='author')),
('review', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='text_authors', to='review.Review', verbose_name='review')),
],
options={
'verbose_name': 'Text author',
'verbose_name_plural': 'Text authors',
'unique_together': {('locale', 'review')},
},
),
]

View File

@ -1,7 +1,11 @@
"""Review app models.""" """Review app models."""
from pprint import pprint
from django.contrib.contenttypes import fields as generic from django.contrib.contenttypes import fields as generic
from django.core.validators import MinValueValidator, MaxValueValidator from django.core.validators import MinValueValidator, MaxValueValidator
from django.db import models from django.db import models
from django.db.models.signals import post_init, post_save
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from utils.models import (BaseAttributes, TranslatedFieldsMixin, from utils.models import (BaseAttributes, TranslatedFieldsMixin,
@ -93,6 +97,27 @@ class Review(BaseAttributes, TranslatedFieldsMixin):
verbose_name_plural = _('Reviews') verbose_name_plural = _('Reviews')
class ReviewTextAuthor(ProjectBaseMixin):
author = models.ForeignKey(
'account.User',
verbose_name=_('author'),
on_delete=models.CASCADE,
related_name='review_authors',
)
review = models.ForeignKey(
'review.Review',
verbose_name=_('review'),
on_delete=models.CASCADE,
related_name='text_authors',
)
locale = models.CharField(_('locale'), max_length=10)
class Meta:
verbose_name = _('Text author')
verbose_name_plural = _('Text authors')
unique_together = ('locale', 'review')
class Inquiries(GalleryMixin, ProjectBaseMixin): class Inquiries(GalleryMixin, ProjectBaseMixin):
NONE = 0 NONE = 0
DINER = 1 DINER = 1

View File

@ -1,9 +1,10 @@
"""Review app back serializers.""" """Review app back serializers."""
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from rest_framework import serializers from rest_framework import serializers
from account.models import User from account.models import User
from review.models import Review from review.models import Review, ReviewTextAuthor
class _ReviewerSerializer(serializers.ModelSerializer): class _ReviewerSerializer(serializers.ModelSerializer):
@ -28,10 +29,24 @@ class _ContentTypeSerializer(serializers.ModelSerializer):
) )
class _ReviewTextAuthorSerializer(serializers.ModelSerializer):
author = _ReviewerSerializer(read_only=True)
class Meta:
model = ReviewTextAuthor
fields = (
'id',
'author',
'locale',
'modified',
)
class ReviewBackSerializer(serializers.ModelSerializer): class ReviewBackSerializer(serializers.ModelSerializer):
reviewer_data = _ReviewerSerializer(read_only=True, source='reviewer') reviewer_data = _ReviewerSerializer(read_only=True, source='reviewer')
content_type_data = _ContentTypeSerializer(read_only=True, source='content_type') content_type_data = _ContentTypeSerializer(read_only=True, source='content_type')
status_display = serializers.CharField(read_only=True, source='get_status_display') status_display = serializers.CharField(read_only=True, source='get_status_display')
authors = _ReviewTextAuthorSerializer(read_only=True, many=True, source='text_authors')
class Meta: class Meta:
model = Review model = Review
@ -51,4 +66,72 @@ class ReviewBackSerializer(serializers.ModelSerializer):
'content_type', 'content_type',
'content_type_data', 'content_type_data',
'object_id', '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