Merge pull request #223 feature-NEWDWH2021-1127 into develop

This commit is contained in:
下田雅人 2023-07-05 12:03:58 +09:00
commit 22548e5373
20 changed files with 476 additions and 12 deletions

View File

@ -0,0 +1,185 @@
from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import HTMLResponse
from starlette import status
from src.depends.services import get_service
from src.model.internal.session import UserSession
from src.model.view.inst_emp_csv_download_view_model import \
InstEmpCsvDownloadViewModel
from src.model.view.inst_emp_csv_upload_view_model import \
InstEmpCsvUploadViewModel
from src.model.view.master_mainte_menu_view_model import \
MasterMainteMenuViewModel
from src.model.view.table_override_view_model import TableOverrideViewModel
from src.router.session_router import AuthenticatedRoute
from src.services.batch_status_service import BatchStatusService
from src.services.session_service import set_session
from src.system_var import constants
from src.templates import templates
router = APIRouter()
router.route_class = AuthenticatedRoute
#########################
# Views #
#########################
@router.get('/masterMainteMenu', response_class=HTMLResponse)
def menu_view(
request: Request,
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# マスタメンテメニューへのアクセス権がない場合、ログアウトさせる
if session.master_mainte_flg != '1':
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
# バッチ処理中の場合、ログアウトさせる
if batch_status_service.is_batch_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE)
# dump処理中の場合、ログアウトさせる
if batch_status_service.is_dump_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
# 画面表示用のモデル
menu = MasterMainteMenuViewModel()
# セッション書き換え
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)
templates_response = templates.TemplateResponse(
'masterMainteMenu.html',
{
'request': request,
'menu': menu
},
headers={'session_key': session.session_key}
)
return templates_response
@router.get('/instEmpCsvUL', response_class=HTMLResponse)
def inst_emp_csv_upload_view(
request: Request,
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# マスタメンテメニューへのアクセス権がない場合、ログアウトさせる
if session.master_mainte_flg != '1':
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
# バッチ処理中の場合、ログアウトさせる
if batch_status_service.is_batch_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE)
# dump処理中の場合、ログアウトさせる
if batch_status_service.is_dump_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
# 画面表示用のモデル
view_model = InstEmpCsvUploadViewModel()
# セッション書き換え
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)
templates_response = templates.TemplateResponse(
'instEmpCsvUL.html',
{
'request': request,
'view': view_model
},
headers={'session_key': session.session_key}
)
return templates_response
@router.get('/instEmpCsvDL', response_class=HTMLResponse)
def inst_emp_csv_download_view(
request: Request,
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# マスタメンテメニューへのアクセス権がない場合、ログアウトさせる
if session.master_mainte_flg != '1':
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
# バッチ処理中の場合、ログアウトさせる
if batch_status_service.is_batch_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE)
# dump処理中の場合、ログアウトさせる
if batch_status_service.is_dump_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
# 画面表示用のモデル
view_model = InstEmpCsvDownloadViewModel()
# セッション書き換え
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)
templates_response = templates.TemplateResponse(
'instEmpCsvDL.html',
{
'request': request,
'view': view_model
},
headers={'session_key': session.session_key}
)
return templates_response
@router.get('/tableOverride', response_class=HTMLResponse)
def table_override_view(
request: Request,
batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService))
):
session: UserSession = request.session
# マスタメンテメニューへのアクセス権がない場合、ログアウトさせる
if session.master_mainte_flg != '1':
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
# バッチ処理中の場合、ログアウトさせる
if batch_status_service.is_batch_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN,
detail=constants.LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE)
# dump処理中の場合、ログアウトさせる
if batch_status_service.is_dump_processing():
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=constants.LOGOUT_REASON_BACKUP_PROCESSING)
# 画面表示用のモデル
view_model = TableOverrideViewModel()
# セッション書き換え
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)
templates_response = templates.TemplateResponse(
'tableOverride.html',
{
'request': request,
'view': view_model
},
headers={'session_key': session.session_key}
)
return templates_response

View File

@ -32,6 +32,7 @@ def menu_view(
hdke_tbl_record = batch_status_service.hdke_table_record
batch_status = hdke_tbl_record.bch_actf
dump_status = hdke_tbl_record.dump_sts_kbn
user = UserViewModel(
doc_flg=session.doc_flg,
inst_flg=session.inst_flg,
@ -40,6 +41,7 @@ def menu_view(
)
menu = MenuViewModel(
batch_status=batch_status,
dump_status=dump_status,
user_model=user
)
# セッション書き換え

View File

@ -6,7 +6,7 @@ from starlette import status
import src.static as static
from src.controller import (bio, bio_download, healthcheck, login, logout,
menu, root, ultmarc)
master_mainte, menu, root, ultmarc)
from src.controller.sample_send_file import router as sample_router
from src.core import tasks
from src.error.exception_handler import http_exception_handler
@ -31,6 +31,8 @@ app.include_router(ultmarc.router, prefix='/ultmarc')
# 生物由来のダウンロード用APIルーター。
# クライアントから非同期呼出しされるため、共通ルーターとは異なる扱いとする。
app.include_router(bio_download.router, prefix='/bio')
# マスタメンテ
app.include_router(master_mainte.router, prefix='/masterMainte')
# ヘルスチェック用のルーター
app.include_router(healthcheck.router, prefix='/healthcheck')

View File

@ -5,3 +5,4 @@ from src.model.db.base_db_model import BaseDBModel
class HdkeTblModel(BaseDBModel):
bch_actf: Optional[str]
dump_sts_kbn: Optional[str]

View File

@ -0,0 +1,5 @@
from pydantic import BaseModel
class InstEmpCsvDownloadViewModel(BaseModel):
subtitle: str = '施設担当者データCSVダウンロード'

View File

@ -0,0 +1,5 @@
from pydantic import BaseModel
class InstEmpCsvUploadViewModel(BaseModel):
subtitle: str = '施設担当者データCSVアップロード'

View File

@ -0,0 +1,5 @@
from pydantic import BaseModel
class MasterMainteMenuViewModel(BaseModel):
subtitle: str = 'MeDaCA マスターメンテメニュー'

View File

@ -3,15 +3,20 @@ from typing import Optional
from pydantic import BaseModel
from src.model.view.user_view_model import UserViewModel
from src.system_var import constants
class MenuViewModel(BaseModel):
subtitle: str = 'MeDaCA 機能メニュー'
batch_status: Optional[str]
dump_status: Optional[str]
user_model: UserViewModel
def is_batch_processing(self):
return self.batch_status == '1'
return self.batch_status == constants.BATCH_STATUS_PROCESSING
def is_backup_processing(self):
return self.dump_status != constants.DUMP_STATUS_UNPROCESSED
def is_available_ult_doctor_menu(self):
return self.user_model.has_ult_doctor_permission()

View File

@ -0,0 +1,5 @@
from pydantic import BaseModel
class TableOverrideViewModel(BaseModel):
subtitle: str = 'テーブル上書きコピー'

View File

@ -4,10 +4,10 @@ from pydantic import BaseModel
class UserViewModel(BaseModel):
bio_flg: str # AUTH_FLG1
doc_flg: str # AUTH_FLG2
inst_flg: str # AUTH_FLG3
master_mainte_flg: str # AUTH_FLG4
bio_flg: Optional[str] # AUTH_FLG1
doc_flg: Optional[str] # AUTH_FLG2
inst_flg: Optional[str] # AUTH_FLG3
master_mainte_flg: Optional[str] # AUTH_FLG4
user_flg: Optional[str] # MNTUSER_FLG
def has_ult_doctor_permission(self):

View File

@ -6,7 +6,7 @@ logger = get_logger('日付テーブル取得')
class HdkeTblRepository(BaseRepository):
FETCH_SQL = "SELECT bch_actf FROM src05.hdke_tbl"
FETCH_SQL = "SELECT bch_actf, dump_sts_kbn FROM src05.hdke_tbl"
def fetch_all(self) -> list[HdkeTblModel]:
try:

View File

@ -4,6 +4,7 @@ from src.model.db.hdke_tbl import HdkeTblModel
from src.repositories.base_repository import BaseRepository
from src.repositories.hdke_tbl_repository import HdkeTblRepository
from src.services.base_service import BaseService
from src.system_var import constants
class BatchStatusService(BaseService):
@ -25,17 +26,30 @@ class BatchStatusService(BaseService):
@property
def hdke_table_record(self) -> HdkeTblModel:
"""日付テーブルを取得する"""
# 日付マスタのレコードがあることを確認
self.__assert_record_exists()
# 日付テーブルのレコードは必ず1件
return self.__hdke_table_record[0]
def is_batch_processing(self):
"""バッチ処理中かどうかを判定する"""
# 日付マスタのレコードがあることを確認
self.__assert_record_exists()
return self.hdke_table_record.bch_actf == '1' # TODO: 定数化する
return self.hdke_table_record.bch_actf == constants.BATCH_STATUS_PROCESSING
def is_dump_processing(self):
"""dump処理処理中かどうかを判定する"""
# 日付マスタのレコードがあることを確認
self.__assert_record_exists()
return self.hdke_table_record.dump_sts_kbn != constants.DUMP_STATUS_UNPROCESSED
def __assert_record_exists(self):
"""日付テーブルが有ることを保証する"""
# 日付マスタのレコードがない場合は例外とする
if len(self.__hdke_table_record) == 0:
raise DBException('日付テーブルのレコードが存在しません')

View File

@ -0,0 +1,164 @@
body{
background-color: LightCyan;
font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, " Pゴシック", "MS PGothic", sans-serif;
}
h1{
margin-left : 1%;
}
/*ヘッダー*/
.headerTable{
width: 100%;
}
.headerTdLeft{
width: 80%;
}
.headerTdRight{
text-align: right;
padding-right: 2%;
width: 20%;
}
.buttonSize{
width: 85px;
}
/*////////////////////////*/
/*施設担当者データCSVダウンロード*/
/*////////////////////////*/
.searchColumnTd{
width: 14%;
}
.searchTextboxTd{
width: 18%;
}
.searchTable{
margin-left: 3%;
margin-right: 3%;
margin-bottom: 1%;
padding-bottom: 1%;
border-bottom: solid 1px gray;
width: 94%;
}
.searchLabelTd{
text-align: right;
width: 10%;
}
.searchInputTd{
width: 19%;
}
.searchTextbox{
width: 90%;
margin-left: 2.5%;
margin-right: 2.5%;
margin-top: 0.8%;
margin-bottom: 0.8%;
}
.searchDateTextbox{
width: 37%;
margin-left: 2.5%;
margin-right: 2.5%;
margin-top: 0.8%;
margin-bottom: 0.8%;
}
.searchButtonTd{
text-align: right;
padding-top: 1%;
}
.csvOutputMessage{
margin-left: 3%;
}
.errorColor{
color: red;
}
/*//////////////////////////*/
/*施設担当者データExcelアップロード*/
/*//////////////////////////*/
.inputTable{
margin-left: 3%;
margin-right: 3%;
margin-bottom: 1%;
padding-bottom: 1%;
border-bottom: solid 1px gray;
width: 94%;
}
.inputLabelTd{
width: 10%;
}
.inputTd{
width:20%;
}
.inputButtonTd{
width: 50%;
text-align: right;
}
.dataCntDisp{
text-align: right;
margin-right: 3%;
}
table.inputData {
font-family:arial;
background-color: #CDCDCD;
font-size: 12pt;
text-align: left;
white-space: nowrap;
border: 0.1px solid silver;
padding: 4px;
padding-right: 20px;
border-collapse: collapse;
margin-left: 3%;
width: 94%;
}
table.inputData tbody th {
color: #3D3D3D;
padding: 4px;
background-color: #e6EEEE;
border: 0.1px solid silver;
vertical-align: top;
}
table.inputData tbody td {
color: #3D3D3D;
padding: 4px;
background-color: #FFF;
border: 0.1px solid silver;
vertical-align: top;
}
.footerMsg{
margin-left: 3%;
}
/*//////////////////////////*/
/*データ上書きコピー */
/*//////////////////////////*/
.tableOverRide{
margin-right: 3%;
margin-left: 3%;
margin-bottom: 2%;
border-bottom: solid 1px gray;
width: 94%;
}

View File

@ -37,7 +37,7 @@ body{
font-size: 160%;
}
.notUseBioMsg{
.notUseBioMsg,.notUseMainteMsg{
font-size: 143%;
color: red;
}

View File

@ -1,5 +1,10 @@
import os.path as path
# 日付テーブル.バッチ処理ステータス:未処理
BATCH_STATUS_PROCESSING = '1'
# 日付テーブル.dump取得状態区分未処理
DUMP_STATUS_UNPROCESSED = '0'
BIO_TEMPORARY_FILE_DIR_PATH = path.join(path.curdir, 'src', 'data')
BIO_EXCEL_TEMPLATE_FILE_PATH = path.join(BIO_TEMPORARY_FILE_DIR_PATH, 'BioData_template.xlsx')
@ -112,6 +117,7 @@ LOGOUT_REASON_DO_LOGOUT = 'do_logout'
LOGOUT_REASON_LOGIN_ERROR = 'login_error'
LOGOUT_REASON_BATCH_PROCESSING = 'batch_processing'
LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE = 'batch_processing_ult'
LOGOUT_REASON_BACKUP_PROCESSING = 'dump_processing'
LOGOUT_REASON_NOT_LOGIN = 'not_login'
LOGOUT_REASON_SESSION_EXPIRED = 'session_expired'
LOGOUT_REASON_DB_ERROR = 'db_error'
@ -122,6 +128,7 @@ LOGOUT_REASON_MESSAGE_MAP = {
LOGOUT_REASON_LOGIN_ERROR: '存在しないユーザー、<br>またはパスワードが違います。',
LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、<br>生物由来データ参照は使用出来ません。',
LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、<br>マスタ-メンテは使用出来ません。',
LOGOUT_REASON_BACKUP_PROCESSING: 'バックアップ取得を開始しました。<br>日次バッチ更新が終了するまでマスターメンテは使用できません',
LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。',
LOGOUT_REASON_SESSION_EXPIRED: 'セッションが切れています。<br>再度Loginしてください。',
LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。<br>再度Loginするか、<br>管理者にお問い合わせください。',

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="ja">
<head>
{% with subtitle = view.subtitle %}
{% include '_header.html' %}
{% endwith %}
<link href="/static/css/masterMainte.css" rel="stylesheet" />
</head>
<body>
<h1>施設担当者データCSVダウンロード</h1>
</body>
</html>

View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="ja">
<head>
{% with subtitle = view.subtitle %}
{% include '_header.html' %}
{% endwith %}
<!-- TODO: CSS変える -->
<link href="/static/css/masterMainte.css" rel="stylesheet" />
</head>
<body>
<h1>施設担当者データCSVアップロード</h1>
</body>
</html>

View File

@ -0,0 +1,25 @@
<!DOCTYPE html>
<html lang="ja">
<head>
{% with subtitle = menu.subtitle %}
{% include '_header.html' %}
{% endwith %}
<link href="/static/css/menuStyle.css" rel="stylesheet">
<body>
<div class="container-fluid text-center background">
<h1>MeDaCA<br/>マスターメンテメニュー</h1>
<br><br>
<!-- 施設担当者データExcelアップロード -->
<a href="/masterMainte/instEmpCsvUL" class="btn btn-primary btn-lg btn_width">施設担当者データCSVアップロード</a><br><br>
<!-- 施設担当者データCSVダウンロード -->
<a href="/masterMainte/instEmpCsvDL" class="btn btn-primary btn-lg btn_width">施設担当者データCSVダウンロード</a><br><br>
<!-- データ上書きコピー -->
<a href="/masterMainte/tableOverride" class="btn btn-primary btn-lg btn_width">テーブル上書きコピー</a><br><br>
<!-- 機能メニューへ -->
<br><br><a href="/menu/" class="btn btn-info btn-lg btn_width">メニューへ</a>
</div>
</body>
</html>

View File

@ -24,10 +24,12 @@
{% endif %}
{% endif %}
{% if menu.is_available_master_maintenance_menu() %}
{% if not menu.is_batch_processing() %}
<a href="{{masterMaintePath}}" class="btn btn-primary btn-lg btn_width">マスターメンテメニュー</a><br><br>
{% if menu.is_batch_processing() %}
<div class="notUseMainteMsg"> マスターメンテメニューは <br> 日次バッチ処理中のため利用出来ません </div>
{% elif menu.is_backup_processing() %}
<div class="notUseMainteMsg"> バックアップ取得を開始しました。 <br>日次バッチ更新が終了するまでマスターメンテメニューは利用できません</div>
{% else %}
<div class="notUseBioMsg"> マスターメンテメニューは <br> 日次バッチ処理中のため利用出来ません </div>
<a href="/masterMainte/masterMainteMenu" class="btn btn-primary btn-lg btn_width">マスターメンテメニュー</a><br><br>
{% endif %}
{% endif %}
<br><br><a href="/logout/?reason=do_logout" class="btn btn-info btn-lg btn_width">Logout</a>

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="ja">
<head>
{% with subtitle = view.subtitle %}
{% include '_header.html' %}
{% endwith %}
<link href="/static/css/masterMainte.css" rel="stylesheet" />
</head>
<body>
<h1>テーブル上書きコピー</h1>
</body>
</html>