From e5faea0df4d875c9a6a50be70affd5046b9af0a1 Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Tue, 2 Apr 2024 19:59:24 +0300 Subject: [PATCH 1/3] [feat] excel download --- backend/project/api/users/views.py | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/backend/project/api/users/views.py b/backend/project/api/users/views.py index ac4053f..86a63a9 100644 --- a/backend/project/api/users/views.py +++ b/backend/project/api/users/views.py @@ -8,6 +8,10 @@ from rest_framework.viewsets import ModelViewSet from api.events.models import Event from api.users.models import User from api.users.serializers import UserSerializer +from django.http import HttpResponse +from rest_framework.views import APIView +from rest_framework.response import Response +import pandas as pd class UserViewSet(ModelViewSet): @@ -55,3 +59,42 @@ class RegisterUsersFromExcelView(APIView): return Response( {"error": str(e)}, status=status.HTTP_400_BAD_REQUEST ) + + +class ExportUsersExcel(APIView): + def get(self, request, event_id): + event = Event.objects.get(id=event_id) + + users = event.users.all() + + users_data = { + "First Name": [user.first_name for user in users], + "Last Name": [user.last_name for user in users], + "Email": [user.email for user in users], + "Birth Date": [ + user.birth_date.strftime("%Y-%m-%d") for user in users + ], + "Bio": [user.bio for user in users], + } + df = pd.DataFrame(users_data) + + excel_file = pd.ExcelWriter("event_users.xlsx", engine="xlsxwriter") + df.to_excel(excel_file, index=False, sheet_name="Users") + excel_file.save() + + with open("event_users.xlsx", "rb") as excel: + content = excel.read() + + # Удаляем созданный временный файл + import os + + os.remove("event_users.xlsx") + + # Отправляем Excel файл как HttpResponse + response = HttpResponse( + content, content_type="application/vnd.ms-excel" + ) + response[ + "Content-Disposition" + ] = 'attachment; filename="event_users.xlsx"' + return response From 1b54e1e23883fdcb3778cef3ee9963493bf41acc Mon Sep 17 00:00:00 2001 From: ITQ Date: Tue, 2 Apr 2024 20:28:32 +0300 Subject: [PATCH 2/3] Fix CI/CD --- frontend/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index f066bb4..4a111aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -65,7 +65,6 @@ "eslint-plugin-react-refresh": "^0.4.6", "prettier": "^3.2.5", "@vitejs/plugin-react": "^4.2.0", - "autoprefixer": "^10.4.16", "postcss": "^8.4.32", "tailwindcss": "^3.3.5", "vite": "^5.0.0" From 88b93f7321bee0db5468068e926a65c17b5f89ed Mon Sep 17 00:00:00 2001 From: FlyingPigeon-py Date: Tue, 2 Apr 2024 20:34:56 +0300 Subject: [PATCH 3/3] [fix] excel download --- backend/project/api/users/urls.py | 6 ++++ backend/project/api/users/views.py | 56 ++++++++++-------------------- 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/backend/project/api/users/urls.py b/backend/project/api/users/urls.py index 60025d1..2708ef3 100644 --- a/backend/project/api/users/urls.py +++ b/backend/project/api/users/urls.py @@ -2,6 +2,7 @@ from django.urls import include, path from rest_framework import routers from api.users.views import ( + DownloadUsersFromExcelView, RegisterUsersFromExcelView, UserViewSet, ) @@ -19,4 +20,9 @@ urlpatterns = [ RegisterUsersFromExcelView.as_view(), name="excel-upload", ), + path( + "download/excel//", + DownloadUsersFromExcelView.as_view(), + name="excel-download", + ) ] diff --git a/backend/project/api/users/views.py b/backend/project/api/users/views.py index 86a63a9..0654900 100644 --- a/backend/project/api/users/views.py +++ b/backend/project/api/users/views.py @@ -1,5 +1,8 @@ +import io + import pandas as pd +from django.http import FileResponse from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView @@ -8,10 +11,6 @@ from rest_framework.viewsets import ModelViewSet from api.events.models import Event from api.users.models import User from api.users.serializers import UserSerializer -from django.http import HttpResponse -from rest_framework.views import APIView -from rest_framework.response import Response -import pandas as pd class UserViewSet(ModelViewSet): @@ -61,40 +60,23 @@ class RegisterUsersFromExcelView(APIView): ) -class ExportUsersExcel(APIView): - def get(self, request, event_id): - event = Event.objects.get(id=event_id) +class DownloadUsersFromExcelView(APIView): + def get(self, _, event_id): + try: + users = Event.objects.get(pk=event_id).users + except Event.DoesNotExist: + return Response( + {"error": "Event does not exist"}, + status=status.HTTP_404_NOT_FOUND, + ) - users = event.users.all() + serializer = UserSerializer(users, many=True) + data = serializer.data - users_data = { - "First Name": [user.first_name for user in users], - "Last Name": [user.last_name for user in users], - "Email": [user.email for user in users], - "Birth Date": [ - user.birth_date.strftime("%Y-%m-%d") for user in users - ], - "Bio": [user.bio for user in users], - } - df = pd.DataFrame(users_data) + data = pd.DataFrame(data) - excel_file = pd.ExcelWriter("event_users.xlsx", engine="xlsxwriter") - df.to_excel(excel_file, index=False, sheet_name="Users") - excel_file.save() + excel_data = io.BytesIO() + data.to_excel(excel_data, index=False) + excel_data.seek(0) - with open("event_users.xlsx", "rb") as excel: - content = excel.read() - - # Удаляем созданный временный файл - import os - - os.remove("event_users.xlsx") - - # Отправляем Excel файл как HttpResponse - response = HttpResponse( - content, content_type="application/vnd.ms-excel" - ) - response[ - "Content-Disposition" - ] = 'attachment; filename="event_users.xlsx"' - return response + return FileResponse(excel_data, filename="users.xlsx")