gault-millau/apps/review/transfer_data.py
2019-11-11 17:45:34 +03:00

138 lines
5.8 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
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,
]
}