diff --git a/apps/review/migrations/0005_review_old_id.py b/apps/review/migrations/0005_review_old_id.py new file mode 100644 index 00000000..c0e92f04 --- /dev/null +++ b/apps/review/migrations/0005_review_old_id.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.4 on 2019-10-31 06:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('review', '0004_review_country'), + ] + + operations = [ + migrations.AddField( + model_name='review', + name='old_id', + field=models.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='old id'), + ), + ] diff --git a/apps/review/models.py b/apps/review/models.py index 4c7f3385..194c6d58 100644 --- a/apps/review/models.py +++ b/apps/review/models.py @@ -68,6 +68,9 @@ class Review(BaseAttributes, TranslatedFieldsMixin): country = models.ForeignKey('location.Country', on_delete=models.CASCADE, related_name='country', verbose_name=_('Country'), null=True) + + old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) + objects = ReviewQuerySet.as_manager() class Meta: diff --git a/apps/review/transfer_data.py b/apps/review/transfer_data.py index 9bc9e5fb..2859c446 100644 --- a/apps/review/transfer_data.py +++ b/apps/review/transfer_data.py @@ -1,6 +1,7 @@ from transfer.models import Reviews, ReviewTexts from transfer.serializers.reviews import LanguageSerializer, ReviewSerializer, Establishment from pprint import pprint +import json def transfer_languages(): @@ -20,14 +21,16 @@ def transfer_languages(): def transfer_reviews(): queryset = Reviews.objects.raw("""SELECT reviews.id, reviews.vintage, reviews.establishment_id, - reviews.reviewer_id, review_texts.text AS text, reviews.mark, - review_texts.created_at AS published, review_texts.locale AS locale + 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 @@ -40,8 +43,19 @@ def transfer_reviews(): "d.sadykova@id-east.ru", "d.sadykova@octopod.ru", "n.yurchenko@id-east.ru" - ) - ) ORDER BY review_texts.created_at DESC + )) + 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 UPPER(cities.name) LIKE UPPER("%%paris%%") + AND NOT establishments.type = "Wineyard" + AND establishments.type IS NOT NULL AND locations.timezone IS NOT NULL + ) + ORDER BY review_texts.created_at DESC """) queryset_result = [] @@ -50,7 +64,13 @@ def transfer_reviews(): for query in queryset: query = vars(query) if query['establishment_id'] not in establishments_mark_list.keys(): - establishments_mark_list[query['establishment_id']] = int(query['mark']) + 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) @@ -58,11 +78,15 @@ def transfer_reviews(): 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: @@ -71,7 +95,7 @@ def transfer_reviews(): data_types = { "overlook": [ - transfer_languages, + # transfer_languages, transfer_reviews ] } diff --git a/apps/transfer/serializers/reviews.py b/apps/transfer/serializers/reviews.py index e6bd11ac..024ea033 100644 --- a/apps/transfer/serializers/reviews.py +++ b/apps/transfer/serializers/reviews.py @@ -10,23 +10,35 @@ class ReviewSerializer(serializers.ModelSerializer): reviewer_id = serializers.IntegerField() vintage = serializers.IntegerField() published = serializers.DateTimeField() + published_at = serializers.DateTimeField(allow_null=True) establishment_id = serializers.IntegerField() text = serializers.CharField() locale = serializers.CharField() + aasm_state = serializers.CharField(allow_null=True) class Meta: model = Review fields = ( - "id", "reviewer_id", "published", "vintage", "establishment_id", "text", "locale" + "id", "reviewer_id", "published", "vintage", + "establishment_id", "text", "locale", + "published_at", "aasm_state" ) def validate(self, data): data = self.set_old_id(data) + data = self.set_published_at(data) data = self.set_reviewer(data) data = self.set_establishment(data) data = self.set_language(data) + data = self.set_published(data) return data + def create(self, validated_data): + try: + return Review.objects.create(**validated_data) + except Exception as e: + raise ValueError(f"Error creating review with {validated_data}: {e}") + def set_old_id(self, data): data['old_id'] = data.pop("id") return data @@ -41,9 +53,9 @@ class ReviewSerializer(serializers.ModelSerializer): def set_establishment(self, data): try: - data['establishment'] = Establishment.objects.get(old_id=data.pop('old_id')) + data['content_object'] = Establishment.objects.get(old_id=data.pop('establishment_id')) except Establishment.DoesNotExist as e: - raise ValueError(f"Cannot find establishment with {data}: {e}") + raise ValueError(f"Cannot find review establishment with {data}: {e}") return data def set_language(self, data): @@ -56,6 +68,16 @@ class ReviewSerializer(serializers.ModelSerializer): return data + def set_published(self, data): + data['published_at'] = data.pop("published") + return data + + def set_published_at(self, data): + if "aasm_state" in data and data['aasm_state'] is not None and data['aasm_state'] == "published": + data['status'] = Review.READY + del(data['aasm_state']) + return data + class LanguageSerializer(serializers.ModelSerializer):