feat: セッションの書き換えと、JSONResponseにしたことによる微妙な挙動の違いを埋めた

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2023-10-04 19:03:37 +09:00
parent ad557d499e
commit 6d2ca2167b
4 changed files with 51 additions and 9 deletions

View File

@ -1,17 +1,22 @@
import datetime
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from starlette import status
from src.depends.services import get_service
from src.logging.get_logger import get_logger
from src.model.db.bio_sales_lot import BioSalesLotDBModel
from src.model.internal.session import UserSession
from src.model.request.bio import BioModel
from src.model.view.bio_view_model import BioViewModel
from src.router.session_router import AuthenticatedRoute
from src.services.batch_status_service import BatchStatusService
from src.services.bio_view_service import BioViewService
from src.system_var import constants
from src.services.session_service import set_session
from src.system_var import constants, environment
from src.templates import templates
router = APIRouter()
@ -97,4 +102,41 @@ def search_bio_ajax(
bio_sales_lot_data = bio_service.search_bio_data(bio_form)
bio_sales_lot_count = bio_service.count_bio_data(bio_form, session)
return {'data': bio_sales_lot_data, 'count': bio_sales_lot_count}
# セッション書き換え
session.update(
actions=[
UserSession.last_access_time.set(UserSession.new_last_access_time()),
UserSession.record_expiration_time.set(UserSession.new_record_expiration_time()),
]
)
set_session(session)
def custom_encode(obj):
encoded_obj = obj.model_dump()
for key, value in encoded_obj.items():
if type(value) == datetime.datetime:
encoded_obj[key] = value.strftime("%Y-%m-%d %H:%M:%S") if obj is not None else ''
if type(value) == datetime.date:
encoded_obj[key] = value.strftime("%Y-%m-%d") if obj is not None else ''
print(key, value)
return encoded_obj
data = jsonable_encoder(
bio_sales_lot_data,
custom_encoder={
BioSalesLotDBModel: custom_encode
}
)
# クッキーも書き換え
json_response = JSONResponse(content={
'data': data,
'count': bio_sales_lot_count
})
json_response.set_cookie(
key='session',
value=session.session_key,
max_age=environment.SESSION_EXPIRE_MINUTE * 60, # cookieの有効期限は秒数指定なので、60秒をかける
secure=True,
httponly=True
)
return json_response

View File

@ -3,6 +3,6 @@ from src.util.sanitize import sanitize
@sanitize
class BisDisplayModel(BioSalesLotDBModel):
class BioDisplayModel(BioSalesLotDBModel):
def __init__(self, param: BioSalesLotDBModel) -> None:
super().__init__(**param.model_dump())

View File

@ -8,7 +8,7 @@ from pydantic import BaseModel
from src.model.db.pharmacy_product_master import PharmacyProductMasterModel
from src.model.db.wholesaler_master import WholesalerMasterModel
from src.model.request.bio import BioModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.model.view.bio_disp_model import BioDisplayModel
from src.system_var import environment
@ -17,7 +17,7 @@ class BioViewModel(BaseModel):
user_id: str
whs_models: list[WholesalerMasterModel]
phm_models: list[PharmacyProductMasterModel]
bio_data: Optional[list[BisDisplayModel]] = None
bio_data: Optional[list[BioDisplayModel]] = None
form_data: BioModel = None
excel_max_lines: int = str(environment.BIO_EXCEL_RESULT_MAX_COUNT)

View File

@ -11,7 +11,7 @@ from src.aws.s3 import S3Client
from src.logging.get_logger import get_logger
from src.model.internal.session import UserSession
from src.model.request.bio import BioModel
from src.model.view.bio_disp_model import BisDisplayModel
from src.model.view.bio_disp_model import BioDisplayModel
from src.model.view.bio_view_model import BioViewModel
from src.repositories.base_repository import BaseRepository
from src.repositories.bio_sales_lot_repository import BioSalesLotRepository
@ -65,13 +65,13 @@ class BioViewService(BaseService):
def search_bio_data(self, search_params: BioModel):
# 生物由来データを検索
bio_sales_view_data = self.bio_sales_repository.fetch_many(parameter=search_params)
bio_sales_lot_data = self.bio_sales_repository.fetch_many(parameter=search_params)
# 画面表示用に加工
display_bio_data: list[BisDisplayModel] = [BisDisplayModel(data) for data in bio_sales_view_data]
display_bio_data: list[BioDisplayModel] = [BioDisplayModel(data) for data in bio_sales_lot_data]
return display_bio_data
def count_bio_data(self, search_params: BioModel, session: UserSession):
def count_bio_data(self, search_params: BioModel, session: UserSession) -> int:
# 生物由来データの件数を取得
bio_sales_data_count = self.bio_sales_repository.fetch_count(parameter=search_params)
return bio_sales_data_count