From 606c1fa6e62185af48e81fa5413ea1ce2a9381ce Mon Sep 17 00:00:00 2001 From: abutalib-kiwi Date: Mon, 21 Aug 2023 14:28:06 +0530 Subject: [PATCH] minor changes in excel import api method --- web_admin/utils.py | 21 +++++++++- web_admin/views/analytics.py | 74 ++++++++++++------------------------ 2 files changed, 44 insertions(+), 51 deletions(-) diff --git a/web_admin/utils.py b/web_admin/utils.py index 4170cf9..3dbb3b2 100644 --- a/web_admin/utils.py +++ b/web_admin/utils.py @@ -2,8 +2,9 @@ web_utils file """ import base64 +import datetime -from base.constants import ARTICLE_CARD_IMAGE_FOLDER +from base.constants import ARTICLE_CARD_IMAGE_FOLDER, DATE_FORMAT from guardian.utils import upload_image_to_alibaba, upload_base64_image_to_alibaba @@ -40,3 +41,21 @@ def get_image_url(data): # upload image on ali baba image_url = upload_image_to_alibaba(image, filename) return image_url + + +def get_dates(start_date, end_date): + """ + to get start and end date + :param start_date: format (yyyy-mm-dd) + :param end_date: format (yyyy-mm-dd) + :return: start and end date + """ + + if start_date and end_date: + start_date = datetime.datetime.strptime(start_date, DATE_FORMAT).date() + end_date = datetime.datetime.strptime(end_date, DATE_FORMAT).date() + else: + end_date = datetime.date.today() + start_date = end_date - datetime.timedelta(days=6) + + return start_date, end_date diff --git a/web_admin/views/analytics.py b/web_admin/views/analytics.py index ddc4e0d..c0747d7 100644 --- a/web_admin/views/analytics.py +++ b/web_admin/views/analytics.py @@ -6,9 +6,6 @@ import datetime import io import pandas as pd import xlsxwriter -import tempfile -import oss2 -from django.conf import settings # third party imports from rest_framework.viewsets import GenericViewSet @@ -33,7 +30,7 @@ from junior.models import JuniorPoints from web_admin.pagination import CustomPageNumberPagination from web_admin.permission import AdminPermission from web_admin.serializers.analytics_serializer import LeaderboardSerializer, UserCSVReportSerializer -from web_admin.serializers.user_management_serializer import UserManagementListSerializer +from web_admin.utils import get_dates USER = get_user_model() @@ -56,7 +53,7 @@ class AnalyticsViewSet(GenericViewSet): ).prefetch_related('guardian_profile', 'junior_profile' ).exclude(junior_profile__isnull=True, - guardian_profile__isnull=True).order_by('date_joined') + guardian_profile__isnull=True).order_by('-date_joined') return user_qs @action(methods=['get'], url_name='users-count', url_path='users-count', detail=False) @@ -67,13 +64,8 @@ class AnalyticsViewSet(GenericViewSet): :param request: end_date: date format (yyyy-mm-dd) :return: """ - - end_date = datetime.date.today() - start_date = end_date - datetime.timedelta(days=6) - - if request.query_params.get('start_date') and request.query_params.get('end_date'): - start_date = datetime.datetime.strptime(request.query_params.get('start_date'), DATE_FORMAT) - end_date = datetime.datetime.strptime(request.query_params.get('end_date'), DATE_FORMAT) + start_date, end_date = get_dates(request.query_params.get('start_date'), + request.query_params.get('end_date')) user_qs = self.get_queryset() queryset = user_qs.filter(date_joined__range=(start_date, (end_date + datetime.timedelta(days=1)))) @@ -92,12 +84,8 @@ class AnalyticsViewSet(GenericViewSet): :param request: end_date: date format (yyyy-mm-dd) :return: """ - end_date = datetime.date.today() - start_date = end_date - datetime.timedelta(days=6) - - if request.query_params.get('start_date') and request.query_params.get('end_date'): - start_date = datetime.datetime.strptime(request.query_params.get('start_date'), DATE_FORMAT) - end_date = datetime.datetime.strptime(request.query_params.get('end_date'), DATE_FORMAT) + start_date, end_date = get_dates(request.query_params.get('start_date'), + request.query_params.get('end_date')) user_qs = self.get_queryset() signup_data = user_qs.filter(date_joined__range=[start_date, (end_date + datetime.timedelta(days=1))] @@ -114,12 +102,8 @@ class AnalyticsViewSet(GenericViewSet): :param request: end_date: date format (yyyy-mm-dd) :return: """ - end_date = datetime.date.today() - start_date = end_date - datetime.timedelta(days=6) - - if request.query_params.get('start_date') and request.query_params.get('end_date'): - start_date = datetime.datetime.strptime(request.query_params.get('start_date'), DATE_FORMAT) - end_date = datetime.datetime.strptime(request.query_params.get('end_date'), DATE_FORMAT) + start_date, end_date = get_dates(request.query_params.get('start_date'), + request.query_params.get('end_date')) assign_tasks = JuniorTask.objects.filter( created_at__range=[start_date, (end_date + datetime.timedelta(days=1))] @@ -163,12 +147,8 @@ class AnalyticsViewSet(GenericViewSet): response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; filename="ZOD_Bank_Analytics.xlsx"' - end_date = datetime.date.today() - start_date = end_date - datetime.timedelta(days=6) - - if request.query_params.get('start_date') and request.query_params.get('end_date'): - start_date = datetime.datetime.strptime(request.query_params.get('start_date'), DATE_FORMAT) - end_date = datetime.datetime.strptime(request.query_params.get('end_date'), DATE_FORMAT) + start_date, end_date = get_dates(request.query_params.get('start_date'), + request.query_params.get('end_date')) # Use BytesIO for binary data buffer = io.BytesIO() @@ -177,7 +157,7 @@ class AnalyticsViewSet(GenericViewSet): workbook = xlsxwriter.Workbook(buffer) # Add sheets - sheets = ['Users', 'Assign Tasks', 'Juniors leaderboard'] + sheets = ['Users', 'Assign Tasks', 'Juniors Leaderboard'] for sheet_name in sheets: worksheet = workbook.add_worksheet(name=sheet_name) @@ -195,12 +175,7 @@ class AnalyticsViewSet(GenericViewSet): 'Date Joined': user['date_joined']} for user in serializer.data ]) - for idx, col in enumerate(df_users.columns): - # Write header - worksheet.write(0, idx, col) - for row_num, row in enumerate(df_users.values, start=1): - for col_num, value in enumerate(row): - worksheet.write(row_num, col_num, value) + write_excel_worksheet(worksheet, df_users) # sheet 2 for Assign Task elif sheet_name == 'Assign Tasks': @@ -213,15 +188,10 @@ class AnalyticsViewSet(GenericViewSet): for task in assign_tasks ]) - for idx, col in enumerate(df_tasks.columns): - # Write header - worksheet.write(0, idx, col) - for row_num, row in enumerate(df_tasks.values, start=1): - for col_num, value in enumerate(row): - worksheet.write(row_num, col_num, value) + write_excel_worksheet(worksheet, df_tasks) # sheet 3 for Juniors Leaderboard and rank - elif sheet_name == 'Juniors leaderboard': + elif sheet_name == 'Juniors Leaderboard': queryset = JuniorPoints.objects.prefetch_related('junior', 'junior__auth').annotate(rank=Window( expression=Rank(), order_by=[F('total_points').desc(), 'junior__created_at'] @@ -236,12 +206,7 @@ class AnalyticsViewSet(GenericViewSet): for junior in queryset ]) - for idx, col in enumerate(df_leaderboard.columns): - # Write header - worksheet.write(0, idx, col) - for row_num, row in enumerate(df_leaderboard.values, start=1): - for col_num, value in enumerate(row): - worksheet.write(row_num, col_num, value) + write_excel_worksheet(worksheet, df_leaderboard) # Close the workbook to save the content workbook.close() @@ -255,3 +220,12 @@ class AnalyticsViewSet(GenericViewSet): file_link = upload_excel_file_to_alibaba(response, filename) return custom_response(None, file_link) + +def write_excel_worksheet(worksheet, dataframe): + for idx, col in enumerate(dataframe.columns): + # Write header + worksheet.write(0, idx, col) + for row_num, row in enumerate(dataframe.values, start=1): + for col_num, value in enumerate(row): + worksheet.write(row_num, col_num, value) + return worksheet