diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py
new file mode 100644
index 00000000..ad5eb3e1
--- /dev/null
+++ b/ecs/jskult-webapp/src/controller/master_mainte.py
@@ -0,0 +1,60 @@
+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.master_mainte_menu_view_model import \
+ MasterMainteMenuViewModel
+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
diff --git a/ecs/jskult-webapp/src/main.py b/ecs/jskult-webapp/src/main.py
index 2aca351c..8717c7cb 100644
--- a/ecs/jskult-webapp/src/main.py
+++ b/ecs/jskult-webapp/src/main.py
@@ -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')
diff --git a/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py b/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py
new file mode 100644
index 00000000..c8ff644a
--- /dev/null
+++ b/ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py
@@ -0,0 +1,5 @@
+from pydantic import BaseModel
+
+
+class MasterMainteMenuViewModel(BaseModel):
+ subtitle: str = 'MeDaCA 機能メニュー'
diff --git a/ecs/jskult-webapp/src/services/batch_status_service.py b/ecs/jskult-webapp/src/services/batch_status_service.py
index c9f6c6a7..ffb57af0 100644
--- a/ecs/jskult-webapp/src/services/batch_status_service.py
+++ b/ecs/jskult-webapp/src/services/batch_status_service.py
@@ -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('日付テーブルのレコードが存在しません')
diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py
index b7ffa0e2..604acfe5 100644
--- a/ecs/jskult-webapp/src/system_var/constants.py
+++ b/ecs/jskult-webapp/src/system_var/constants.py
@@ -1,6 +1,8 @@
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')
@@ -115,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'
@@ -125,6 +128,7 @@ LOGOUT_REASON_MESSAGE_MAP = {
LOGOUT_REASON_LOGIN_ERROR: '存在しないユーザー、
またはパスワードが違います。',
LOGOUT_REASON_BATCH_PROCESSING: '日次バッチ処理中なので、
生物由来データ参照は使用出来ません。',
LOGOUT_REASON_BATCH_PROCESSING_FOR_MAINTE: '日次バッチ処理中のため、
マスタ-メンテは使用出来ません。',
+ LOGOUT_REASON_BACKUP_PROCESSING: 'バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテは使用できません',
LOGOUT_REASON_NOT_LOGIN: 'Loginしてからページにアクセスしてください。',
LOGOUT_REASON_SESSION_EXPIRED: 'セッションが切れています。
再度Loginしてください。',
LOGOUT_REASON_DB_ERROR: 'DB接続に失敗しました。
再度Loginするか、
管理者にお問い合わせください。',
diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html
new file mode 100644
index 00000000..147ab2da
--- /dev/null
+++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html
@@ -0,0 +1,25 @@
+
+
+