|
2 | 2 | import json
|
3 | 3 | from time import gmtime, strftime
|
4 | 4 | from typing import Any, List, Union
|
| 5 | +from tempfile import NamedTemporaryFile |
5 | 6 |
|
6 | 7 | from django.conf import settings
|
7 | 8 | from django.core.cache import cache
|
|
17 | 18 | from django.utils.translation import gettext as _
|
18 | 19 | from django_filters.rest_framework import DjangoFilterBackend # type: ignore
|
19 | 20 | from gspread.exceptions import APIError # type: ignore
|
20 |
| -from openpyxl.writer.excel import save_virtual_workbook # type: ignore |
| 21 | +from openpyxl import Workbook |
21 | 22 | from rest_framework import filters, permissions, serializers, status
|
22 | 23 | from rest_framework.decorators import action
|
23 | 24 | from rest_framework.fields import Field
|
@@ -822,10 +823,12 @@ def create_calendar_xlsx_sheet(self, request, **kwargs):
|
822 | 823 | filename = xlsx_file_name("calendar", params)
|
823 | 824 | xlsx_file = generate_xlsx_campaigns_calendar(filename, calendar_data)
|
824 | 825 |
|
825 |
| - response = HttpResponse( |
826 |
| - save_virtual_workbook(xlsx_file), |
827 |
| - content_type=CONTENT_TYPE_XLSX, |
828 |
| - ) |
| 826 | + with NamedTemporaryFile() as tmp: |
| 827 | + xlsx_file.save(tmp.name) |
| 828 | + tmp.seek(0) |
| 829 | + stream = tmp.read() |
| 830 | + |
| 831 | + response = HttpResponse(stream, content_type=CONTENT_TYPE_XLSX) |
829 | 832 | response["Content-Disposition"] = "attachment; filename=%s" % filename + ".xlsx"
|
830 | 833 | return response
|
831 | 834 |
|
|
0 commit comments