import json from pprint import pprint from django.db.models import Q from account.transfer_data import STOP_LIST from review.models import Inquiries as NewInquiries, Review from transfer.models import Reviews, ReviewTexts, Inquiries, GridItems from transfer.serializers.grid import GridItemsSerializer from transfer.serializers.inquiries import InquiriesSerializer from transfer.serializers.reviews import LanguageSerializer, ReviewSerializer, Establishment def transfer_languages(): queryset = ReviewTexts.objects.raw("""SELECT id, locale FROM review_texts WHERE CHAR_LENGTH(locale) = 5 AND review_texts.locale IS NOT NULL GROUP BY locale""") queryset = [vars(query) for query in queryset] serialized_data = LanguageSerializer(data=queryset, many=True) if serialized_data.is_valid(): serialized_data.save() else: pprint(f"Language serializer errors: {serialized_data.errors}") def transfer_reviews(): # TODO: убрать LIKE UPPER("%%paris%%"), accounts.email IN queryset = Reviews.objects.raw("""SELECT reviews.id, reviews.vintage, reviews.establishment_id, reviews.reviewer_id, review_texts.text AS text, reviews.mark, reviews.published_at, review_texts.created_at AS published, review_texts.locale AS locale, reviews.aasm_state FROM reviews LEFT OUTER JOIN review_texts ON (reviews.id = review_texts.review_id) WHERE reviews.reviewer_id > 0 AND reviews.reviewer_id IS NOT NULL AND review_texts.text IS NOT NULL AND review_texts.locale IS NOT NULL AND reviews.mark IS NOT NULL AND reviews.reviewer_id IN ( SELECT accounts.id FROM accounts WHERE accounts.confirmed_at IS NOT NULL AND NOT accounts.email IN ( "cyril@tomatic.net", "cyril2@tomatic.net", "cyril2@tomatic.net", "d.sadykova@id-east.ru", "d.sadykova@octopod.ru", "n.yurchenko@id-east.ru" )) AND reviews.establishment_id IN ( SELECT establishments.id FROM establishments INNER JOIN locations ON (establishments.location_id = locations.id) INNER JOIN cities ON (locations.city_id = cities.id) WHERE establishments.type IS NOT NULL AND locations.timezone IS NOT NULL AND NOT establishments.type = "Wineyard" ) ORDER BY review_texts.created_at DESC """) queryset_result = [] establishments_mark_list = {} for query in queryset: query = vars(query) if query['establishment_id'] not in establishments_mark_list.keys(): if "aasm_state" in query and query['aasm_state'] is not None and query['aasm_state'] == "published": establishments_mark_list[query['establishment_id']] = [ int(query['mark']), json.dumps({query['locale']: query['text']}) ] else: establishments_mark_list[query['establishment_id']] = int(query['mark']) del (query['mark']) queryset_result.append(query) serialized_data = ReviewSerializer(data=queryset_result, many=True) if serialized_data.is_valid(): serialized_data.save() for establishment_id, mark in establishments_mark_list.items(): try: establishment = Establishment.objects.get(old_id=establishment_id) except Establishment.DoesNotExist: continue if isinstance(mark, list): mark, review_text = mark establishment.public_mark = mark establishment.save() else: pprint(serialized_data.errors) def transfer_inquiries(): reviews = Review.objects.all().values_list('old_id', flat=True) inquiries = Inquiries.objects.exclude( Q(account__confirmed_at__isnull=True) | Q(account__email__in=STOP_LIST) ).filter(review_id__in=list(reviews)) serialized_data = InquiriesSerializer(data=list(inquiries.values()), many=True) if serialized_data.is_valid(): serialized_data.save() else: pprint(f"Inquiries serializer errors: {serialized_data.errors}") def transfer_grid(): inquiries = NewInquiries.objects.all().values_list('old_id', flat=True) grids = GridItems.objects.filter(inquiry_id__in=list(inquiries)) serialized_data = GridItemsSerializer(data=list(grids.values()), many=True) if serialized_data.is_valid(): serialized_data.save() else: pprint(f"GridItems serializer errors: {serialized_data.errors}") data_types = { "overlook": [ transfer_languages, transfer_reviews ], 'inquiries': [ transfer_inquiries, transfer_grid, ] }