From 69723b362f47b2353861dc7d03aa3a560860a84d Mon Sep 17 00:00:00 2001 From: jain Date: Thu, 10 Aug 2023 15:30:46 +0530 Subject: [PATCH] current page update in article api --- guardian/views.py | 4 +-- ...uniorarticle_current_card_page_and_more.py | 23 ++++++++++++ junior/models.py | 2 ++ junior/serializers.py | 2 +- junior/utils.py | 5 +-- junior/views.py | 12 +++++-- web_admin/serializers/article_serializer.py | 36 +++++++++++++++++-- web_admin/views/article.py | 8 ++--- 8 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 junior/migrations/0024_juniorarticle_current_card_page_and_more.py diff --git a/guardian/views.py b/guardian/views.py index c67037c..c17c95b 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -270,14 +270,12 @@ class TopJuniorListAPIView(viewsets.ModelViewSet): """Fetch junior list of those who complete their tasks""" try: junior_total_points = self.get_queryset().order_by('-total_points') - # Update the position field for each JuniorPoints object for index, junior in enumerate(junior_total_points): junior.position = index + 1 send_notification.delay(LEADERBOARD_RANKING, None, junior.junior.auth.id, {}) junior.save() - - serializer = self.get_serializer(junior_total_points, many=True) + serializer = self.get_serializer(junior_total_points[:15], many=True) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) diff --git a/junior/migrations/0024_juniorarticle_current_card_page_and_more.py b/junior/migrations/0024_juniorarticle_current_card_page_and_more.py new file mode 100644 index 0000000..b00eba9 --- /dev/null +++ b/junior/migrations/0024_juniorarticle_current_card_page_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.2 on 2023-08-10 08:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('junior', '0023_juniorarticlecard'), + ] + + operations = [ + migrations.AddField( + model_name='juniorarticle', + name='current_card_page', + field=models.IntegerField(blank=True, default=0, null=True), + ), + migrations.AddField( + model_name='juniorarticle', + name='current_que_page', + field=models.IntegerField(blank=True, default=0, null=True), + ), + ] diff --git a/junior/models.py b/junior/models.py index 12d8476..d3912e0 100644 --- a/junior/models.py +++ b/junior/models.py @@ -173,6 +173,8 @@ class JuniorArticle(models.Model): # article completed""" is_completed = models.BooleanField(default=False) status = models.CharField(max_length=10, choices=ARTICLE_STATUS, null=True, blank=True, default='1') + current_card_page = models.IntegerField(blank=True, null=True, default=0) + current_que_page = models.IntegerField(blank=True, null=True, default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) diff --git a/junior/serializers.py b/junior/serializers.py index 0f014fe..8b0f9be 100644 --- a/junior/serializers.py +++ b/junior/serializers.py @@ -146,7 +146,7 @@ class JuniorDetailSerializer(serializers.ModelSerializer): """Meta info""" model = Junior fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob', - 'guardian_code', 'is_invited', 'referral_code','is_active', 'is_complete_profile', 'created_at', + 'guardian_code', 'image', 'is_invited', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', 'updated_at'] class JuniorDetailListSerializer(serializers.ModelSerializer): diff --git a/junior/utils.py b/junior/utils.py index 1afd8d5..ba177a8 100644 --- a/junior/utils.py +++ b/junior/utils.py @@ -4,6 +4,7 @@ from django.conf import settings """Third party Django app""" from templated_email import send_templated_mail from .models import JuniorPoints +from base.constants import NUMBER from django.db.models import F # junior notification # email for sending email @@ -53,8 +54,8 @@ def update_positions_based_on_points(): juniors_points = JuniorPoints.objects.order_by('-total_points', 'created_at') # Now, iterate through the queryset and update the position field based on the order. - position = 1 + position = NUMBER['one'] for junior_point in juniors_points: junior_point.position = position junior_point.save() - position += 1 + position += NUMBER['one'] diff --git a/junior/views.py b/junior/views.py index ed42430..3ffea4c 100644 --- a/junior/views.py +++ b/junior/views.py @@ -481,7 +481,8 @@ class StartArticleAPIView(viewsets.ModelViewSet): article_id = request.data.get('article_id') article_data = Article.objects.filter(id=article_id).last() if not JuniorArticle.objects.filter(junior=junior_instance, article=article_data).last(): - JuniorArticle.objects.create(junior=junior_instance, article=article_data, status=str(NUMBER['two'])) + JuniorArticle.objects.create(junior=junior_instance, article=article_data, status=str(NUMBER['two']), + current_card_page=NUMBER['zero'], current_que_page=NUMBER['zero']) if article_data: question_query = ArticleSurvey.objects.filter(article=article_id) for question in question_query: @@ -534,6 +535,7 @@ class CheckAnswerAPIView(viewsets.ModelViewSet): try: answer_id = self.request.GET.get('answer_id') + current_page = self.request.GET.get('current_page') queryset = self.get_queryset() submit_ans = SurveyOption.objects.filter(id=answer_id, is_answer=True).last() junior_article_points = JuniorArticlePoints.objects.filter(junior__auth=self.request.user, @@ -541,10 +543,13 @@ class CheckAnswerAPIView(viewsets.ModelViewSet): if submit_ans: junior_article_points.update(submitted_answer=submit_ans, is_attempt=True, is_answer_correct=True) JuniorPoints.objects.filter(junior__auth=self.request.user).update(total_points= - F('total_points')+ queryset.points) + F('total_points') + queryset.points) else: junior_article_points.update(submitted_answer=submit_ans, is_attempt=True, earn_points=0, is_answer_correct=False) + JuniorArticle.objects.filter(junior__auth=self.request.user, + article=queryset.article).update( + current_que_page=int(current_page) + NUMBER['one']) return custom_response(None, response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) @@ -588,9 +593,12 @@ class ReadArticleCardAPIView(views.APIView): junior_instance = Junior.objects.filter(auth=self.request.user).last() article = self.request.data.get('article_id') article_card = self.request.data.get('article_card') + current_page = self.request.data.get('current_page') JuniorArticleCard.objects.filter(junior=junior_instance, article__id=article, article_card__id=article_card).update(is_read=True) + JuniorArticle.objects.filter(junior=junior_instance, + article__id=article).update(current_card_page=int(current_page)+NUMBER['one']) return custom_response(SUCCESS_CODE['3043'], response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index a3a7a46..e78bd3e 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -12,7 +12,7 @@ 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, get_image_url -from junior.models import JuniorArticlePoints +from junior.models import JuniorArticlePoints, JuniorArticle USER = get_user_model() @@ -268,12 +268,44 @@ class StartAssessmentSerializer(serializers.ModelSerializer): serializer for article API """ article_survey = ArticleQuestionSerializer(many=True) + current_page = serializers.SerializerMethodField('get_current_page') + def get_current_page(self, obj): + """current page""" + context_data = self.context.get('user') + data = JuniorArticle.objects.filter(junior__auth=context_data, article=obj).last() + if data: + return data.current_que_page + return NUMBER['zero'] class Meta: """ meta class """ model = Article - fields = ('article_survey',) + fields = ('article_survey', 'current_page') + +class ArticleCardlistSerializer(serializers.ModelSerializer): + """ + Article Card serializer + """ + id = serializers.IntegerField(required=False) + image_name = serializers.CharField(required=False) + image_url = serializers.CharField(required=False) + current_page = serializers.SerializerMethodField('get_current_page') + + def get_current_page(self, obj): + """current page""" + context_data = self.context.get('user') + data = JuniorArticle.objects.filter(junior__auth=context_data, article=obj.article).last() + if data: + return data.current_card_page + return NUMBER['zero'] + + class Meta: + """ + meta class + """ + model = ArticleCard + fields = ('id', 'title', 'description', 'image_name', 'image_url', 'current_page') diff --git a/web_admin/views/article.py b/web_admin/views/article.py index d4cc843..e57577e 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -16,8 +16,8 @@ from base.messages import SUCCESS_CODE, ERROR_CODE from web_admin.models import Article, ArticleCard, ArticleSurvey, DefaultArticleCardImage from web_admin.permission import AdminPermission from web_admin.serializers.article_serializer import (ArticleSerializer, ArticleCardSerializer, - DefaultArticleCardImageSerializer, ArticleListSerializer - ) + DefaultArticleCardImageSerializer, ArticleListSerializer, + ArticleCardlistSerializer) USER = get_user_model() @@ -229,7 +229,7 @@ class ArticleListViewSet(GenericViewSet, mixins.ListModelMixin): class ArticleCardListViewSet(viewsets.ModelViewSet): """Junior Points viewset""" - serializer_class = ArticleCardSerializer + serializer_class = ArticleCardlistSerializer permission_classes = [IsAuthenticated] http_method_names = ('get',) @@ -242,7 +242,7 @@ class ArticleCardListViewSet(viewsets.ModelViewSet): try: queryset = self.get_queryset() # article card list - serializer = ArticleCardSerializer(queryset, many=True) + serializer = ArticleCardlistSerializer(queryset, context={"user": self.request.user}, many=True) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)