gault-millau/apps/review/transfer_data.py
2019-11-12 08:40:42 +03:00

151 lines
6.4 KiB
Python

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, InquiryPhotos
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, 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}")
def transfer_inquiry_photos():
inquiries = NewInquiries.objects.all().values_list('old_id', flat=True)
grids = InquiryPhotos.objects.filter(inquiry_id__in=list(inquiries), attachment_suffix_url__isnull=False)
serialized_data = InquiryGallerySerializer(data=list(grids.values()), many=True)
if serialized_data.is_valid():
serialized_data.save()
else:
pprint(f"InquiryGallery serializer errors: {serialized_data.errors}")
data_types = {
"overlook": [
transfer_languages,
transfer_reviews
],
'inquiries': [
transfer_inquiries,
transfer_grid,
transfer_inquiry_photos,
]
}