From a372d29677d6cae3d07b73a7dcc4cf71c4fdc99a Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 6 Nov 2019 14:24:14 +0300 Subject: [PATCH] refactor comment migration --- apps/account/transfer_data.py | 16 +++-- apps/comment/admin.py | 1 + apps/comment/models.py | 15 ++--- apps/comment/transfer_data.py | 26 +++++++- apps/establishment/transfer_data.py | 1 - apps/transfer/serializers/comments.py | 91 +++++++++------------------ 6 files changed, 70 insertions(+), 80 deletions(-) diff --git a/apps/account/transfer_data.py b/apps/account/transfer_data.py index c39e0ac1..41d430fa 100644 --- a/apps/account/transfer_data.py +++ b/apps/account/transfer_data.py @@ -3,17 +3,21 @@ from pprint import pprint from transfer.models import Profiles, Accounts from transfer.serializers.account import UserSerializer +STOP_LIST = ( + 'cyril@tomatic.net', + 'cyril2@tomatic.net', + 'd.sadykova@id-east.ru', + 'd.sadykova@octopod.ru', + 'n.yurchenko@id-east.ru', +) + def transfer_user(): # queryset = Profiles.objects.all() # queryset = queryset.annotate(nickname=F("account__nickname")) # queryset = queryset.annotate(email=F("account__email")) - stop_list = ['cyril@tomatic.net', - 'cyril2@tomatic.net', - 'd.sadykova@id-east.ru', - 'd.sadykova@octopod.ru', - 'n.yurchenko@id-east.ru'] - queryset = Accounts.objects.filter(confirmed_at__isnull=False).exclude(email__in=stop_list) + + queryset = Accounts.objects.filter(confirmed_at__isnull=False).exclude(email__in=STOP_LIST) serialized_data = UserSerializer(data=list(queryset.values()), many=True) diff --git a/apps/comment/admin.py b/apps/comment/admin.py index 855f6b3e..061c9c8d 100644 --- a/apps/comment/admin.py +++ b/apps/comment/admin.py @@ -6,3 +6,4 @@ from . import models @admin.register(models.Comment) class CommentModelAdmin(admin.ModelAdmin): """Model admin for model Comment""" + raw_id_fields = ('user', 'country') diff --git a/apps/comment/models.py b/apps/comment/models.py index 29021677..3a8c8c37 100644 --- a/apps/comment/models.py +++ b/apps/comment/models.py @@ -32,21 +32,16 @@ class CommentQuerySet(ContentTypeQuerySetMixin): class Comment(ProjectBaseMixin): """Comment model.""" text = models.TextField(verbose_name=_('Comment text')) - mark = models.PositiveIntegerField(blank=True, null=True, default=None, - verbose_name=_('Mark')) - user = models.ForeignKey('account.User', - related_name='comments', - on_delete=models.CASCADE, - verbose_name=_('User')) + mark = models.PositiveIntegerField(blank=True, null=True, default=None, verbose_name=_('Mark')) + user = models.ForeignKey('account.User', related_name='comments', on_delete=models.CASCADE, verbose_name=_('User')) + country = models.ForeignKey(Country, verbose_name=_('Country'), on_delete=models.SET_NULL, null=True) + old_id = models.IntegerField(null=True, blank=True, default=None) + content_type = models.ForeignKey(generic.ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') objects = CommentQuerySet.as_manager() - country = models.ForeignKey(Country, verbose_name=_('Country'), - on_delete=models.SET_NULL, null=True) - old_id = models.IntegerField(null=True, blank=True, default=None) - class Meta: """Meta class""" diff --git a/apps/comment/transfer_data.py b/apps/comment/transfer_data.py index a9ac4f35..843da78f 100644 --- a/apps/comment/transfer_data.py +++ b/apps/comment/transfer_data.py @@ -1,11 +1,31 @@ from pprint import pprint + +from django.db.models import Q + +from account.transfer_data import STOP_LIST from transfer.models import Comments from transfer.serializers.comments import CommentSerializer def transfer_comments(): - queryset = Comments.objects.filter(account__isnull=False, mark__isnull=False)\ - .only("id", "comment", "mark", "locale", "establishment_id", "account_id") + # В queryset исключены объекты по условию в связанные моделях + # см. transfer_establishment() и transfer_user() + queryset = Comments.objects.exclude( + Q(establishment__type='Wineyard') | + Q(establishment__location__timezone__isnull=True) | + Q(account__confirmed_at__isnull=True) | + Q(account__email__in=STOP_LIST) + ).filter( + account__isnull=False, + mark__isnull=False + ).only( + 'id', + 'comment', + 'mark', + 'locale', + 'establishment_id', + 'account_id', + ) serialized_data = CommentSerializer(data=list(queryset.values()), many=True) if serialized_data.is_valid(): @@ -15,7 +35,7 @@ def transfer_comments(): data_types = { - "comment": [ + 'comment': [ transfer_comments ] } diff --git a/apps/establishment/transfer_data.py b/apps/establishment/transfer_data.py index b178b18a..15f9524d 100644 --- a/apps/establishment/transfer_data.py +++ b/apps/establishment/transfer_data.py @@ -1,6 +1,5 @@ from pprint import pprint -import requests from django.db.models import Q, F from establishment.models import Establishment diff --git a/apps/transfer/serializers/comments.py b/apps/transfer/serializers/comments.py index 14ad70e3..cd4233d1 100644 --- a/apps/transfer/serializers/comments.py +++ b/apps/transfer/serializers/comments.py @@ -4,7 +4,7 @@ from establishment.models import Establishment from location.models import Country -class CommentSerializer(serializers.ModelSerializer): +class CommentSerializer(serializers.Serializer): id = serializers.IntegerField() comment = serializers.CharField() mark = serializers.DecimalField(max_digits=4, decimal_places=2) @@ -12,25 +12,18 @@ class CommentSerializer(serializers.ModelSerializer): account_id = serializers.IntegerField() establishment_id = serializers.CharField() - class Meta: - model = Comment - fields = ( - "id", - "comment", - "mark", - "locale", - "account_id", - "establishment_id" - ) - def validate(self, data): - data = self.set_old_id(data) - data = self.set_text(data) - data = self.set_mark(data) - data = self.set_establishment(data) - data = self.set_account(data) - data = self.set_country(data) - + data.update({ + 'old_id': data.pop('id'), + 'text': data.pop('comment'), + 'mark': data['mark'] * -1 if data['mark'] < 0 else data['mark'], + 'content_object': self.get_content_object(data), + 'user': self.get_account(data), + 'country': self.get_country(data), + }) + data.pop('establishment_id') + data.pop('account_id') + data.pop('locale') return data def create(self, validated_data): @@ -39,47 +32,25 @@ class CommentSerializer(serializers.ModelSerializer): except Exception as e: raise ValueError(f"Error creating comment with {validated_data}: {e}") - def set_text(self, data): - data['text'] = data.pop('comment') - return data + @staticmethod + def get_content_object(data): + establishment = Establishment.objects.filter(old_id=data['establishment_id']).first() + if not establishment: + raise ValueError(f"Establishment not found with old_id {data['establishment_id']}: ") + return establishment - def set_mark(self, data): - if data['mark'] < 0: - data['mark'] = data['mark'] * -1 - return data + @staticmethod + def get_account(data): + user = User.objects.filter(old_id=data['account_id']).first() + if not user: + raise ValueError(f"User account not found with old_id {data['account_id']}") + return user - def set_account(self, data): - try: - data['user'] = User.objects.filter(old_id=data['account_id']).first() - except User.DoesNotExist as e: - raise ValueError(f"User account not found with {data}: {e}") - - del(data['account_id']) - - return data - - def set_establishment(self, data): - try: - data['content_object'] = Establishment.objects.filter(old_id=data['establishment_id']).first() - except Establishment.DoesNotExist as e: - raise ValueError(f"Establishment not found with {data}: {e}") - # print(f"Establishment not found with {data}: {e}") - - del(data['establishment_id']) - - return data - - def set_old_id(self, data): - data['old_id'] = data.pop("id") - return data - - def set_country(self, data): - locale = data.pop("locale") + @staticmethod + def get_country(data): + locale = data['locale'] country_code = locale[:locale.index("-")] if len(locale) > 2 else locale - - try: - data['country'] = Country.objects.filter(code=country_code).first() - except Country.DoesNotExist as e: - raise ValueError(f"Country not found with {data}: {e}") - - return data \ No newline at end of file + country = Country.objects.filter(code=country_code).first() + if not country: + raise ValueError(f"Country not found with code {country_code}") + return country