From 6a987532bad9b81657734a0754364848f5521c9d Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 17 Dec 2019 11:54:50 +0300 Subject: [PATCH] fix recipe duplicates --- apps/recipe/models.py | 3 +++ apps/recipe/serializers/common.py | 11 +++++++++-- apps/recipe/transfer_data.py | 17 +++++++++++++++++ apps/recipe/views/common.py | 14 +++++++++++++- apps/review/transfer_data.py | 4 +++- apps/transfer/management/commands/transfer.py | 1 + 6 files changed, 46 insertions(+), 4 deletions(-) diff --git a/apps/recipe/models.py b/apps/recipe/models.py index 6eaa2155..c419be4c 100644 --- a/apps/recipe/models.py +++ b/apps/recipe/models.py @@ -25,6 +25,9 @@ class RecipeQuerySet(models.QuerySet): default=False, output_field=models.BooleanField(default=False))) + def by_locale(self, locale): + return self.filter(title__icontains=locale) + class Recipe(TranslatedFieldsMixin, ImageMixin, BaseAttributes): """Recipe model.""" diff --git a/apps/recipe/serializers/common.py b/apps/recipe/serializers/common.py index fec5978d..a0ec4363 100644 --- a/apps/recipe/serializers/common.py +++ b/apps/recipe/serializers/common.py @@ -14,8 +14,15 @@ class RecipeListSerializer(serializers.ModelSerializer): """Meta class.""" model = models.Recipe - fields = ('id', 'title_translated', 'subtitle_translated', 'author', - 'published_at', 'in_favorites') + fields = ( + 'id', + 'title_translated', + 'subtitle_translated', + 'author', + 'created_by', + 'published_at', + 'in_favorites', + ) read_only_fields = fields diff --git a/apps/recipe/transfer_data.py b/apps/recipe/transfer_data.py index 22b44baa..4c1c3a5a 100644 --- a/apps/recipe/transfer_data.py +++ b/apps/recipe/transfer_data.py @@ -1,5 +1,8 @@ from pprint import pprint +from django.db.models import Count + +from recipe.models import Recipe from transfer.models import PageTexts from transfer.serializers.recipe import RecipeSerializer @@ -25,6 +28,20 @@ def transfer_recipe(): serialized_data.save() else: pprint(f'Recipe serializer errors: {serialized_data.errors}') + return + + # Удаление дубликатов рецептов по одинаковым description + duplicate_descriptions = Recipe.objects.values( + 'description' + ).annotate( + description_count=Count('description') + ).filter( + description_count__gt=1 + ) + for data in duplicate_descriptions: + description = data['description'] + _list = list(Recipe.objects.filter(description=description).values_list('pk', flat=True)[1:]) + Recipe.objects.filter(id__in=_list).delete() data_types = { diff --git a/apps/recipe/views/common.py b/apps/recipe/views/common.py index f268107e..31e74f20 100644 --- a/apps/recipe/views/common.py +++ b/apps/recipe/views/common.py @@ -1,5 +1,7 @@ """Recipe app common views.""" +from django.utils import translation from rest_framework import generics, permissions + from recipe import models from recipe.serializers import common as serializers @@ -10,9 +12,14 @@ class RecipeViewMixin(generics.GenericAPIView): pagination_class = None permission_classes = (permissions.AllowAny,) - def get_queryset(self): + def get_queryset(self, *args, **kwargs): user = self.request.user qs = models.Recipe.objects.published().annotate_in_favorites(user) + + locale = kwargs.get('locale') + if locale: + qs = qs.by_locale(locale) + return qs @@ -21,6 +28,11 @@ class RecipeListView(RecipeViewMixin, generics.ListAPIView): serializer_class = serializers.RecipeListSerializer + def get_queryset(self, *args, **kwargs): + locale = translation.get_language() + kwargs.update({'locale': locale}) + return super().get_queryset(*args, **kwargs) + class RecipeDetailView(RecipeViewMixin, generics.RetrieveAPIView): """Resource for detailed recipe information.""" diff --git a/apps/review/transfer_data.py b/apps/review/transfer_data.py index 20c5712d..ac3749f6 100644 --- a/apps/review/transfer_data.py +++ b/apps/review/transfer_data.py @@ -127,8 +127,10 @@ def transfer_product_reviews(): data_types = { + "languages": [ + transfer_languages, + ], "overlook": [ - # transfer_languages, transfer_reviews, transfer_text_review, make_en_text_review, diff --git a/apps/transfer/management/commands/transfer.py b/apps/transfer/management/commands/transfer.py index b4a42349..4e849b13 100644 --- a/apps/transfer/management/commands/transfer.py +++ b/apps/transfer/management/commands/transfer.py @@ -49,6 +49,7 @@ class Command(BaseCommand): 'guide_elements_bulk', 'guide_element_advertorials', 'guide_complete', + 'languages', # №4 - перенос языков ] def handle(self, *args, **options):