|
2 | 2 | import re |
3 | 3 | from collections.abc import Sequence |
4 | 4 | from datetime import UTC, date, datetime |
5 | | -from pathlib import Path |
| 5 | +from io import BytesIO |
6 | 6 | from uuid import UUID, uuid4 |
7 | 7 |
|
8 | 8 | import calypsso |
9 | 9 | from fastapi import ( |
10 | 10 | Depends, |
11 | 11 | HTTPException, |
| 12 | + Response, |
12 | 13 | WebSocket, |
13 | 14 | ) |
14 | 15 | from fastapi.responses import FileResponse |
@@ -418,7 +419,7 @@ async def generate_and_send_results( |
418 | 419 | # emails: schemas_cdr.ResultRequest, |
419 | 420 | db: AsyncSession, |
420 | 421 | # settings: Settings, |
421 | | -) -> Path: |
| 422 | +) -> bytes: |
422 | 423 | cdr_year = await get_core_data(coredata_cdr.CdrYear, db) |
423 | 424 | seller = await cruds_cdr.get_seller_by_id(db, seller_id) |
424 | 425 | if not seller: |
@@ -478,33 +479,28 @@ async def generate_and_send_results( |
478 | 479 | each_user.id, |
479 | 480 | ), |
480 | 481 | ) |
| 482 | + |
481 | 483 | hyperion_error_logger.info( |
482 | | - f"Data for seller {seller.name} fetched. Starting to construct the dataframe.", |
| 484 | + f"Data for seller {seller.name} fetched. Generating the Excel file.", |
483 | 485 | ) |
484 | | - df = construct_dataframe_from_users_purchases( |
| 486 | + |
| 487 | + excel_io = BytesIO() |
| 488 | + |
| 489 | + construct_dataframe_from_users_purchases( |
485 | 490 | users_purchases=purchases_by_users, |
486 | 491 | users=list(users), |
487 | 492 | products=list(products), |
488 | 493 | variants=variants, |
489 | 494 | data_fields=product_fields, |
490 | 495 | users_answers=users_answers, |
491 | | - ) |
492 | | - hyperion_error_logger.info( |
493 | | - f"Dataframe for seller {seller.name} constructed. Generating the Excel file.", |
| 496 | + export_io=excel_io, |
494 | 497 | ) |
495 | 498 |
|
496 | | - file_directory = "/app/data/cdr" |
497 | | - file_uuid = uuid4() |
498 | | - # file_name = f"CdR {datetime.now(tz=UTC).year} ventes {seller.name}.xlsx" |
| 499 | + res = excel_io.getvalue() |
499 | 500 |
|
500 | | - Path.mkdir(Path(file_directory), parents=True, exist_ok=True) |
501 | | - df.to_excel( |
502 | | - Path(file_directory, str(file_uuid)), |
503 | | - index=False, |
504 | | - freeze_panes=(2, 3), |
505 | | - engine="xlsxwriter", |
506 | | - ) |
507 | | - return Path(file_directory, str(file_uuid)) |
| 501 | + excel_io.close() |
| 502 | + |
| 503 | + return res |
508 | 504 |
|
509 | 505 | # Not working, we have to keep the file in the server |
510 | 506 | # hyperion_error_logger.debug( |
@@ -545,8 +541,16 @@ async def send_seller_results( |
545 | 541 |
|
546 | 542 | await is_user_in_a_seller_group(seller_id, user=user, db=db) |
547 | 543 |
|
548 | | - path = await generate_and_send_results(seller_id=seller_id, db=db) |
549 | | - return FileResponse(path) |
| 544 | + res = await generate_and_send_results(seller_id=seller_id, db=db) |
| 545 | + |
| 546 | + headers = { |
| 547 | + "Content-Disposition": f'attachment; filename="results_{seller_id}.xlsx"', |
| 548 | + } |
| 549 | + return Response( |
| 550 | + res, |
| 551 | + headers=headers, |
| 552 | + media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", |
| 553 | + ) |
550 | 554 |
|
551 | 555 |
|
552 | 556 | @module.router.get( |
|
0 commit comments