From ee92c98f34d5cedc996ed6b956396915e4e6f77e Mon Sep 17 00:00:00 2001 From: abutalib-kiwi Date: Tue, 1 Aug 2023 13:12:37 +0530 Subject: [PATCH 1/4] article list api changes, changed related name for survey_options to options --- .../0004_alter_surveyoption_survey.py | 19 +++++++++++++++++++ web_admin/models.py | 2 +- web_admin/views/article.py | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 web_admin/migrations/0004_alter_surveyoption_survey.py diff --git a/web_admin/migrations/0004_alter_surveyoption_survey.py b/web_admin/migrations/0004_alter_surveyoption_survey.py new file mode 100644 index 0000000..8d28957 --- /dev/null +++ b/web_admin/migrations/0004_alter_surveyoption_survey.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.2 on 2023-08-01 07:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('web_admin', '0003_defaultarticlecardimage_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='surveyoption', + name='survey', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='options', to='web_admin.articlesurvey'), + ), + ] diff --git a/web_admin/models.py b/web_admin/models.py index 950eec6..8a3bb16 100644 --- a/web_admin/models.py +++ b/web_admin/models.py @@ -56,7 +56,7 @@ class SurveyOption(models.Model): """ Survey Options model """ - survey = models.ForeignKey(ArticleSurvey, on_delete=models.CASCADE, related_name='survey_options') + survey = models.ForeignKey(ArticleSurvey, on_delete=models.CASCADE, related_name='options') option = models.CharField(max_length=255) is_answer = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) diff --git a/web_admin/views/article.py b/web_admin/views/article.py index 5aa88b3..5b0ca92 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -36,7 +36,7 @@ class ArticleViewSet(GenericViewSet, mixins.CreateModelMixin, mixins.UpdateModel def get_queryset(self): article = self.queryset.objects.filter(is_deleted=False).prefetch_related( - 'article_cards', 'article_survey', 'article_survey__survey_options' + 'article_cards', 'article_survey', 'article_survey__options' ).order_by('-created_at') queryset = self.filter_queryset(article) return queryset From d3564efbb97a49829442f8c16a698bfcee186ffc Mon Sep 17 00:00:00 2001 From: abutalib-kiwi Date: Tue, 1 Aug 2023 20:13:35 +0530 Subject: [PATCH 2/4] change in update api, added method to upload and get image url --- web_admin/serializers/article_serializer.py | 42 +++++++-------------- web_admin/utils.py | 11 ++++++ 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index e374679..6945880 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -11,7 +11,7 @@ from base.constants import (ARTICLE_SURVEY_POINTS, MAX_ARTICLE_CARD, MIN_ARTICLE from base.messages import ERROR_CODE from guardian.utils import upload_image_to_alibaba from web_admin.models import Article, ArticleCard, SurveyOption, ArticleSurvey, DefaultArticleCardImage -from web_admin.utils import pop_id +from web_admin.utils import pop_id, get_image_url USER = get_user_model() @@ -32,11 +32,7 @@ class ArticleCardSerializer(serializers.ModelSerializer): fields = ('id', 'title', 'description', 'image', 'image_url') def create(self, validated_data): - if 'image' in validated_data and validated_data['image'] is not None: - image = validated_data.pop('image') - filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" - # upload image on ali baba - validated_data['image_url'] = upload_image_to_alibaba(image, filename) + validated_data['image_url'] = get_image_url(validated_data) article_card = ArticleCard.objects.create(article_id='1', **validated_data) return article_card @@ -111,11 +107,7 @@ class ArticleSerializer(serializers.ModelSerializer): for card in article_cards: card = pop_id(card) - if 'image' in card and card['image'] is not None: - image = card.pop('image') - filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" - # upload image on ali baba - card['image_url'] = upload_image_to_alibaba(image, filename) + card['image_url'] = get_image_url(card) ArticleCard.objects.create(article=article, **card) for survey in article_survey: @@ -139,28 +131,22 @@ class ArticleSerializer(serializers.ModelSerializer): instance.title = validated_data.get('title', instance.title) instance.description = validated_data.get('description', instance.description) instance.save() - + prev_card = list(ArticleCard.objects.filter(article=instance).values_list('id', flat=True)) # Update or create cards for card_data in article_cards: card_id = card_data.get('id', None) if card_id: + prev_card.remove(card_id) card = ArticleCard.objects.get(id=card_id, article=instance) card.title = card_data.get('title', card.title) card.description = card_data.get('description', card.description) - if 'image' in card_data and card_data['image'] is not None: - image = card_data.pop('image') - filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" - # upload image on ali baba - card.image_url = upload_image_to_alibaba(image, filename) + card.image_url = get_image_url(card_data) card.save() else: card_data = pop_id(card_data) - if 'image' in card_data and card_data['image'] is not None: - image = card_data.pop('image') - filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" - # upload image on ali baba - card_data['image_url'] = upload_image_to_alibaba(image, filename) + card_data['image_url'] = get_image_url(card_data) ArticleCard.objects.create(article=instance, **card_data) + ArticleCard.objects.filter(id__in=prev_card, article=instance).delete() # Update or create survey sections for survey_data in article_survey: @@ -172,7 +158,7 @@ class ArticleSerializer(serializers.ModelSerializer): survey.save() else: survey_data = pop_id(survey_data) - survey = ArticleSurvey.objects.create(article=instance, **survey_data) + survey = ArticleSurvey.objects.create(article=instance, points=ARTICLE_SURVEY_POINTS, **survey_data) # Update or create survey options for option_data in options_data: @@ -210,6 +196,9 @@ class DefaultArticleCardImageSerializer(serializers.ModelSerializer): """ if 'image' not in attrs and attrs.get('image') is None: raise serializers.ValidationError({'details': ERROR_CODE['2061']}) + image = attrs.get('image') + if image and image.size == NUMBER['zero']: + raise serializers.ValidationError(ERROR_CODE['2035']) return attrs def create(self, validated_data): @@ -217,12 +206,7 @@ class DefaultArticleCardImageSerializer(serializers.ModelSerializer): to create and upload image :return: card_image object """ - image = validated_data.pop('image') - filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" - if image and image.size == NUMBER['zero']: - raise serializers.ValidationError(ERROR_CODE['2035']) - # upload image on ali baba - validated_data['image_url'] = upload_image_to_alibaba(image, filename) + validated_data['image_url'] = get_image_url(validated_data) card_image = DefaultArticleCardImage.objects.create(**validated_data) return card_image diff --git a/web_admin/utils.py b/web_admin/utils.py index 2e09e2f..aea72e8 100644 --- a/web_admin/utils.py +++ b/web_admin/utils.py @@ -1,6 +1,8 @@ """ web_utils file """ +from base.constants import ARTICLE_CARD_IMAGE_FOLDER +from guardian.utils import upload_image_to_alibaba def pop_id(data): @@ -11,3 +13,12 @@ def pop_id(data): """ data.pop('id') if 'id' in data else data return data + + +def get_image_url(data): + if 'image' in data and data['image'] is not None: + image = data.pop('image') + filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" + # upload image on ali baba + image_url = upload_image_to_alibaba(image, filename) + return image_url From f3a8b5261708bed0b49c62c73255b7ff9bf6e793 Mon Sep 17 00:00:00 2001 From: jain Date: Wed, 2 Aug 2023 11:00:02 +0530 Subject: [PATCH 3/4] api response time --- guardian/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/guardian/views.py b/guardian/views.py index 9706e87..15b29c5 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -131,7 +131,6 @@ class TaskListAPIView(viewsets.ModelViewSet): serializer_class = TaskDetailsSerializer permission_classes = [IsAuthenticated] pagination_class = PageNumberPagination - queryset = JuniorTask.objects.all() http_method_names = ('get',) def list(self, request, *args, **kwargs): From af121f5a539c628ae59a70962a2764c4d10bf84e Mon Sep 17 00:00:00 2001 From: abutalib-kiwi Date: Wed, 2 Aug 2023 11:16:12 +0530 Subject: [PATCH 4/4] changes in article update api and get image url method --- web_admin/serializers/article_serializer.py | 6 +++++- web_admin/utils.py | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index 6945880..f3b5d06 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -33,7 +33,8 @@ class ArticleCardSerializer(serializers.ModelSerializer): def create(self, validated_data): validated_data['image_url'] = get_image_url(validated_data) - article_card = ArticleCard.objects.create(article_id='1', **validated_data) + article = Article.objects.all().first() + article_card = ArticleCard.objects.create(article=article, **validated_data) return article_card @@ -148,11 +149,13 @@ class ArticleSerializer(serializers.ModelSerializer): ArticleCard.objects.create(article=instance, **card_data) ArticleCard.objects.filter(id__in=prev_card, article=instance).delete() + prev_survey = list(ArticleSurvey.objects.filter(article=instance).values_list('id', flat=True)) # Update or create survey sections for survey_data in article_survey: survey_id = survey_data.get('id', None) options_data = survey_data.pop('options') if survey_id: + prev_survey.remove(survey_id) survey = ArticleSurvey.objects.get(id=survey_id, article=instance) survey.question = survey_data.get('question', survey.question) survey.save() @@ -171,6 +174,7 @@ class ArticleSerializer(serializers.ModelSerializer): else: option_data = pop_id(option_data) SurveyOption.objects.create(survey=survey, **option_data) + ArticleSurvey.objects.filter(id__in=prev_survey, article=instance).delete() return instance diff --git a/web_admin/utils.py b/web_admin/utils.py index aea72e8..6ecd5e3 100644 --- a/web_admin/utils.py +++ b/web_admin/utils.py @@ -16,7 +16,9 @@ def pop_id(data): def get_image_url(data): - if 'image' in data and data['image'] is not None: + if 'image_url' in data: + return data['image_url'] + elif 'image' in data and data['image'] is not None: image = data.pop('image') filename = f"{ARTICLE_CARD_IMAGE_FOLDER}/{image.name}" # upload image on ali baba