diff --git a/apps/review/transfer_data.py b/apps/review/transfer_data.py index 8ac1104c..0b080871 100644 --- a/apps/review/transfer_data.py +++ b/apps/review/transfer_data.py @@ -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, ] } diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index 48e3b74d..28e40c50 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -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)) diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 96b5aa36..43084804 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -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) diff --git a/apps/transfer/serializers/reviews.py b/apps/transfer/serializers/reviews.py index 5cef5803..f322b51e 100644 --- a/apps/transfer/serializers/reviews.py +++ b/apps/transfer/serializers/reviews.py @@ -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)