Coverage for api/endpoints/orders/archive.py: 60%
48 statements
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
« prev ^ index » next coverage.py v7.6.2, created at 2024-10-10 03:02 +0300
1from typing import Annotated
3import aiofiles.os as aios
4from fastapi import APIRouter, Depends
5from handlers.authorization.check_role import has_role
6from handlers.authorization.company_employee_access import (
7 flexible_company_assertion_query,
8)
9from handlers.authorization.confidential import hide_model_fields_from_carrier
10from handlers.grabbers.orders import archive_data_grabber
11from handlers.orders.archive import (
12 export_to_xml,
13 get_archive_orders,
14 on_get_archive_stats,
15)
16from keycloak import idp
17from sotrans_models.models._mongo import PydanticObjectIdPath
18from sotrans_models.models.orders.order import OrderDBModel
19from sotrans_models.models.responses import (
20 ErrorRepr,
21 GenericGetListResponse,
22 MonthlyStatisticsResponse,
23)
24from sotrans_models.models.roles import SotransRole
25from sotrans_models.models.users import SotransOIDCUserModel
26from starlette.background import BackgroundTasks
27from starlette.responses import FileResponse
28from utils.access_wrapper import get_active_user
29from utils.data_grabber import BaseGetListQueryParams, BaseGetOneQueryParams
30from utils.excel import export_orders_to_excel
31from utils.helper import get_org_oid
33archive_router = APIRouter(prefix="/archive", tags=["orders", "archive"])
36@archive_router.get("")
37async def get_archive(
38 user=Depends(
39 get_active_user(
40 [SotransRole.carrier_logistician, SotransRole.drivers_bot]
41 )
42 ),
43 params: BaseGetListQueryParams = Depends(),
44) -> GenericGetListResponse[OrderDBModel]:
45 return await get_archive_orders(user, params)
48@archive_router.get("/xml")
49async def export_archive_as_xml(
50 user: Annotated[
51 SotransOIDCUserModel,
52 Depends(
53 idp.get_current_user(
54 required_role_names=[SotransRole.company_logistician]
55 )
56 ),
57 ],
58 bg_task: BackgroundTasks,
59 params: BaseGetListQueryParams = Depends(),
60) -> FileResponse:
61 archive_orders = await get_archive_orders(user, params)
62 file_path = await export_to_xml(archive_orders.items)
63 bg_task.add_task(aios.remove, file_path)
64 return FileResponse(file_path)
67@archive_router.get("/xlsx")
68async def export_archive_as_xlsx(
69 user: Annotated[
70 SotransOIDCUserModel,
71 Depends(
72 idp.get_current_user(
73 required_role_names=[SotransRole.company_logistician]
74 )
75 ),
76 ],
77 bg_task: BackgroundTasks,
78 params: BaseGetListQueryParams = Depends(),
79) -> FileResponse:
80 archive_orders = await get_archive_orders(user, params)
81 to_cut = False if has_role(user, SotransRole.company_logistician) else True
82 file_path = await export_orders_to_excel(archive_orders.items, to_cut)
83 bg_task.add_task(aios.remove, file_path)
84 return FileResponse(file_path)
87@archive_router.get("/statistics")
88async def get_archive_statistics(
89 _: Annotated[
90 SotransOIDCUserModel,
91 Depends(
92 idp.get_current_user(
93 required_role_names=[SotransRole.company_logistician]
94 )
95 ),
96 ],
97) -> MonthlyStatisticsResponse:
98 """Each number in key represents how far ago starting period was."""
99 return await on_get_archive_stats()
102@archive_router.get("/{order_id}", responses={404: {"model": ErrorRepr}})
103async def get_archive_by_id(
104 order_id: PydanticObjectIdPath,
105 user=Depends(
106 get_active_user(
107 [
108 SotransRole.carrier_logistician,
109 SotransRole.drivers_bot,
110 ]
111 )
112 ),
113 params: BaseGetOneQueryParams = Depends(),
114) -> OrderDBModel:
115 if has_role(user, SotransRole.drivers_bot):
116 return await archive_data_grabber.get_one(order_id, params)
117 if has_role(user, SotransRole.company_logistician):
118 restriction_q = await flexible_company_assertion_query(user)
119 return await archive_data_grabber.get_one_by_id_with_pattern(
120 order_id, params, restriction_q
121 )
122 return await archive_data_grabber.get_one_by_id_with_pattern(
123 order_id,
124 params,
125 {OrderDBModel.carrier.id: get_org_oid(user)},
126 processors=[hide_model_fields_from_carrier],
127 )