From e9aa2dfda98d527f7efdaa7122a92c728a726cdf Mon Sep 17 00:00:00 2001 From: jain Date: Thu, 24 Aug 2023 16:08:20 +0530 Subject: [PATCH 1/4] limit for 3 guardian code and article list API optimization --- base/constants.py | 3 ++- guardian/views.py | 5 +++-- junior/views.py | 8 ++++++-- web_admin/serializers/article_serializer.py | 10 +++++++--- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/base/constants.py b/base/constants.py index 1ab15a2..da203ae 100644 --- a/base/constants.py +++ b/base/constants.py @@ -43,7 +43,8 @@ FILE_SIZE = 5 * 1024 * 1024 # String constant for configurable date for allocation lock period ALLOCATION_LOCK_DATE = 1 - +# guardian code status tuple +guardian_code_tuple = ('1','3') """user type""" USER_TYPE = ( ('1', 'junior'), diff --git a/guardian/views.py b/guardian/views.py index e49beaf..b541660 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -10,7 +10,7 @@ from rest_framework.permissions import IsAuthenticated from rest_framework import viewsets, status from rest_framework.pagination import PageNumberPagination from django.contrib.auth.models import User - +from base.constants import guardian_code_tuple from rest_framework.filters import SearchFilter from django.utils import timezone @@ -178,7 +178,8 @@ class CreateTaskAPIView(viewsets.ModelViewSet): junior = request.data['junior'] junior_id = Junior.objects.filter(id=junior).last() guardian_data = Guardian.objects.filter(user=request.user).last() - if guardian_data.guardian_code not in junior_id.guardian_code: + if (guardian_data.guardian_code not in junior_id.guardian_code or + junior_id.guardian_code_status in guardian_code_tuple): return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST) allowed_extensions = ['.jpg', '.jpeg', '.png'] if not any(extension in str(image) for extension in allowed_extensions): diff --git a/junior/views.py b/junior/views.py index 2abd61d..96b9222 100644 --- a/junior/views.py +++ b/junior/views.py @@ -191,6 +191,8 @@ class AddJuniorAPIView(viewsets.ModelViewSet): return custom_error_response(ERROR_CODE['2077'], response_status=status.HTTP_400_BAD_REQUEST) elif not data: return custom_error_response(ERROR_CODE['2076'], response_status=status.HTTP_400_BAD_REQUEST) + if data == "Max": + return custom_error_response(ERROR_CODE['2081'], response_status=status.HTTP_400_BAD_REQUEST) return custom_response(SUCCESS_CODE['3021'], response_status=status.HTTP_200_OK) # use AddJuniorSerializer serializer serializer = AddJuniorSerializer(data=request.data, context=info_data) @@ -209,10 +211,12 @@ class AddJuniorAPIView(viewsets.ModelViewSet): return none if junior.guardian_code and (guardian.guardian_code in junior.guardian_code): return False - if type(junior.guardian_code) is list: + if not junior.guardian_code: + junior.guardian_code = [guardian.guardian_code] + if type(junior.guardian_code) is list and len(junior.guardian_code) < 4: junior.guardian_code.append(guardian.guardian_code) else: - junior.guardian_code = [guardian.guardian_code] + return "Max" junior.guardian_code_status = str(NUMBER['two']) junior.save() JuniorGuardianRelationship.objects.get_or_create(guardian=guardian, junior=junior, diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index e125acf..62d09d4 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -219,8 +219,7 @@ class ArticleListSerializer(serializers.ModelSerializer): """ serializer for article API """ - article_cards = ArticleCardSerializer(many=True) - article_survey = ArticleSurveySerializer(many=True) + image = serializers.SerializerMethodField('get_image') total_points = serializers.SerializerMethodField('get_total_points') is_completed = serializers.SerializerMethodField('get_is_completed') @@ -229,8 +228,13 @@ class ArticleListSerializer(serializers.ModelSerializer): meta class """ model = Article - fields = ('id', 'title', 'description', 'article_cards', 'article_survey', 'total_points', 'is_completed') + fields = ('id', 'title', 'description','image', 'total_points', 'is_completed') + def get_image(self, obj): + """article image""" + if obj.article_cards.first(): + return obj.article_cards.first().image_url + return None def get_total_points(self, obj): """total points of article""" total_question = ArticleSurvey.objects.filter(article=obj).count() From 1028822908ae731881aef25a3f35b963b83cb093 Mon Sep 17 00:00:00 2001 From: jain Date: Thu, 24 Aug 2023 18:00:14 +0530 Subject: [PATCH 2/4] article-list optimization --- account/custom_middleware.py | 22 +++++++++++---------- web_admin/serializers/article_serializer.py | 5 ++--- web_admin/views/article.py | 5 +---- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/account/custom_middleware.py b/account/custom_middleware.py index ca89a86..42a3b0f 100644 --- a/account/custom_middleware.py +++ b/account/custom_middleware.py @@ -45,7 +45,11 @@ class CustomMiddleware(object): api_endpoint = request.path if request.user.is_authenticated: # device details - device_details = UserDeviceDetails.objects.filter(user=request.user, device_id=device_id).last() + if device_id: + device_details = UserDeviceDetails.objects.filter(user=request.user, device_id=device_id).last() + if not device_details and api_endpoint != '/api/v1/user/login/': + custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND) + response = custom_response(custom_error) if user_type and str(user_type) == str(NUMBER['one']): junior = Junior.objects.filter(auth=request.user, is_active=False).last() if junior: @@ -56,13 +60,11 @@ class CustomMiddleware(object): if guardian: custom_error = custom_error_response(ERROR_CODE['2075'], response_status=status.HTTP_404_NOT_FOUND) response = custom_response(custom_error) - if device_id and not device_details and api_endpoint != '/api/v1/user/login/': - custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND) - response = custom_response(custom_error) - force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last() - api_endpoint_checks = not any(endpoint in api_endpoint for endpoint in ['/admin/', '/api/v1/admin/']) - if not force_update and version and device_type: - custom_error = custom_error_response(ERROR_CODE['2079'], - response_status=status.HTTP_308_PERMANENT_REDIRECT) - response = custom_response(custom_error, status.HTTP_308_PERMANENT_REDIRECT) + + if version and device_type: + force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last() + if not force_update: + custom_error = custom_error_response(ERROR_CODE['2079'], + response_status=status.HTTP_308_PERMANENT_REDIRECT) + response = custom_response(custom_error, status.HTTP_308_PERMANENT_REDIRECT) return response diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index 62d09d4..675591f 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -237,8 +237,7 @@ class ArticleListSerializer(serializers.ModelSerializer): return None def get_total_points(self, obj): """total points of article""" - total_question = ArticleSurvey.objects.filter(article=obj).count() - return total_question * NUMBER['five'] + return obj.article_survey.all().count() * NUMBER['five'] def get_is_completed(self, obj): """complete all question""" @@ -278,7 +277,7 @@ class ArticleQuestionSerializer(serializers.ModelSerializer): """attempt question or not""" context_data = self.context.get('user') junior_article_obj = JuniorArticlePoints.objects.filter(junior__auth=context_data, - question=obj, is_answer_correct=True).last() + question=obj).last() if junior_article_obj: return junior_article_obj.submitted_answer.id return None diff --git a/web_admin/views/article.py b/web_admin/views/article.py index f362f8b..902f579 100644 --- a/web_admin/views/article.py +++ b/web_admin/views/article.py @@ -229,10 +229,7 @@ class ArticleListViewSet(GenericViewSet, mixins.ListModelMixin): http_method_names = ['get',] def get_queryset(self): - article = self.queryset.objects.filter(is_deleted=False, is_published=True).prefetch_related( - 'article_cards', 'article_survey', 'article_survey__options' - ).order_by('-created_at') - queryset = self.filter_queryset(article) + queryset = self.queryset.objects.filter(is_deleted=False, is_published=True).order_by('-created_at') return queryset def list(self, request, *args, **kwargs): From f5a03e2fdf888abaad174665b1018ce4e0bff784 Mon Sep 17 00:00:00 2001 From: jain Date: Thu, 24 Aug 2023 18:26:15 +0530 Subject: [PATCH 3/4] assement id --- web_admin/serializers/article_serializer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web_admin/serializers/article_serializer.py b/web_admin/serializers/article_serializer.py index 675591f..4e98e55 100644 --- a/web_admin/serializers/article_serializer.py +++ b/web_admin/serializers/article_serializer.py @@ -271,14 +271,14 @@ class ArticleQuestionSerializer(serializers.ModelSerializer): ans_obj = SurveyOption.objects.filter(survey=obj, is_answer=True).last() if ans_obj: return ans_obj.id - return str("None") + return None def get_attempted_answer(self, obj): """attempt question or not""" context_data = self.context.get('user') junior_article_obj = JuniorArticlePoints.objects.filter(junior__auth=context_data, question=obj).last() - if junior_article_obj: + if junior_article_obj and junior_article_obj.submitted_answer: return junior_article_obj.submitted_answer.id return None From a65eb2f77d8146eacb3692075fd25f9e72a571ae Mon Sep 17 00:00:00 2001 From: jain Date: Thu, 24 Aug 2023 18:58:31 +0530 Subject: [PATCH 4/4] assessment answer --- junior/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junior/views.py b/junior/views.py index 96b9222..b91a8cd 100644 --- a/junior/views.py +++ b/junior/views.py @@ -620,7 +620,7 @@ class CheckAnswerAPIView(viewsets.ModelViewSet): 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() + submit_ans = SurveyOption.objects.filter(id=answer_id).last() junior_article_points = JuniorArticlePoints.objects.filter(junior__auth=self.request.user, question=queryset) if submit_ans: