add product review loader

This commit is contained in:
Dmitriy Kuzmenko 2019-11-15 02:44:09 +03:00
parent 2367fec098
commit 6b83003eac
4 changed files with 78 additions and 4 deletions

View File

@ -2,6 +2,7 @@ from pprint import pprint
from django.db.models import Q
from product.models import Product
from account.models import User
from account.transfer_data import STOP_LIST
from establishment.models import Establishment
@ -10,7 +11,10 @@ from transfer.models import Reviews, ReviewTexts, Inquiries, GridItems, InquiryP
from transfer.serializers.grid import GridItemsSerializer
from transfer.serializers.inquiries import InquiriesSerializer
from transfer.serializers.inquiry_gallery import InquiryGallerySerializer
from transfer.serializers.reviews import LanguageSerializer, ReviewSerializer, ReviewTextSerializer
from transfer.serializers.reviews import (
LanguageSerializer, ReviewSerializer, ReviewTextSerializer, ProductReviewSerializer
)
def transfer_languages():
@ -103,6 +107,26 @@ def transfer_inquiry_photos():
pprint(f"InquiryGallery serializer errors: {serialized_data.errors}")
def transfer_product_reviews():
products = Product.objects.filter(
old_id__isnull=False).values_list('old_id', flat=True)
users = User.objects.filter(
old_id__isnull=False).values_list('old_id', flat=True)
queryset = Reviews.objects.filter(
product_id__in=list(products),
reviewer_id__in=list(users),
).values('id', 'reviewer_id', 'aasm_state', 'created_at', 'product_id', 'mark', 'vintage')
serialized_data = ProductReviewSerializer(data=list(queryset.values()), many=True)
if serialized_data.is_valid():
serialized_data.save()
else:
pprint(f"ProductReviewSerializer serializer errors: {serialized_data.errors}")
data_types = {
"overlook": [
# transfer_languages,
@ -113,5 +137,8 @@ data_types = {
transfer_inquiries,
transfer_grid,
transfer_inquiry_photos,
],
"product_review": [
transfer_product_reviews,
]
}

View File

@ -36,11 +36,13 @@ class Command(BaseCommand):
'souvenir',
'establishment_note',
'assemblage',
'rating_count'
'rating_count',
'product_review',
]
def handle(self, *args, **options):
"""Находим включённую опцию путём пересечения множества типов данных и множества включённых опций"""
"""
Находим включённую опцию путём пересечения множества типов данных и множества включённых опций"""
data_type = list(set(option for option in options.keys() if options[option]) & set(self.LONG_DATA_TYPES))
if len(data_type) != 1:
data_type = list(set(option for option in options.keys() if options[option]) & set(self.SHORT_DATA_TYPES))

View File

@ -711,7 +711,7 @@ class Reviews(MigrateMixin):
reviewer = models.ForeignKey(Accounts, models.DO_NOTHING, blank=True, null=True)
priority = models.IntegerField(blank=True, null=True)
# TODO: модель Products в postgres закомментирована
# product = models.ForeignKey("Products", models.DO_NOTHING, blank=True, null=True)
product = models.ForeignKey("Products", models.DO_NOTHING, blank=True, null=True)
received_at = models.DateTimeField(blank=True, null=True)
reviewer_name = models.CharField(max_length=255, blank=True, null=True)
type = models.CharField(max_length=255, blank=True, null=True)

View File

@ -3,6 +3,7 @@ from review.models import Review
from account.models import User
from translation.models import Language
from establishment.models import Establishment
from product.models import Product
class ReviewSerializer(serializers.Serializer):
@ -49,6 +50,50 @@ class ReviewSerializer(serializers.Serializer):
return establishment
class ProductReviewSerializer(ReviewSerializer):
vintage = serializers.IntegerField()
mark = serializers.FloatField(allow_null=True)
product_id = serializers.IntegerField()
created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S')
aasm_state = serializers.CharField(allow_null=True)
reviewer_id = serializers.IntegerField()
id = serializers.IntegerField()
def validate(self, data):
data.update({
'reviewer': self.get_reviewer(data),
'status': Review.READY if data['aasm_state'] == 'published' else Review.TO_INVESTIGATE,
'published_at': data.pop('created_at'),
'old_id': data.pop('id'),
'content_object': self.get_product(data),
})
data.pop('reviewer_id')
data.pop('product_id')
data.pop('aasm_state')
return data
def create(self, validated_data):
obj, _ = Review.objects.update_or_create(
old_id=validated_data['old_id'],
defaults=validated_data,
)
return obj
@staticmethod
def get_reviewer(data):
user = User.objects.filter(old_id=data['reviewer_id']).first()
if not user:
raise ValueError(f"User account not found with old_id {data['reviewer_id']}")
return user
@staticmethod
def get_product(data):
establishment = Product.objects.filter(old_id=data['product_id']).first()
if not establishment:
raise ValueError(f"Product not found with old_id {data['product_id']}: ")
return establishment
class ReviewTextSerializer(serializers.Serializer):
review_id = serializers.IntegerField()
locale = serializers.CharField(allow_null=True)