From 901e6e9cd9d238675da904e7fc069e20da0ae4f9 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 14:56:40 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20=E3=83=A1=E3=83=8B=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E7=94=BB=E9=9D=A2=E3=81=AEdump=E5=8F=96=E5=BE=97?= =?UTF-8?q?=E7=8A=B6=E6=85=8B=E5=8C=BA=E5=88=86=E3=81=AB=E3=82=88=E3=82=8B?= =?UTF-8?q?=E5=88=B6=E5=BE=A1=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/menu.py | 2 ++ ecs/jskult-webapp/src/model/db/hdke_tbl.py | 1 + ecs/jskult-webapp/src/model/view/menu_view_model.py | 7 ++++++- ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py | 2 +- ecs/jskult-webapp/src/static/css/menuStyle.css | 2 +- ecs/jskult-webapp/src/system_var/constants.py | 3 +++ ecs/jskult-webapp/src/templates/menu.html | 8 +++++--- 7 files changed, 19 insertions(+), 6 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/menu.py b/ecs/jskult-webapp/src/controller/menu.py index 61a1a3a0..96826fce 100644 --- a/ecs/jskult-webapp/src/controller/menu.py +++ b/ecs/jskult-webapp/src/controller/menu.py @@ -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 ) # セッション書き換え diff --git a/ecs/jskult-webapp/src/model/db/hdke_tbl.py b/ecs/jskult-webapp/src/model/db/hdke_tbl.py index 944581d5..9655c6c1 100644 --- a/ecs/jskult-webapp/src/model/db/hdke_tbl.py +++ b/ecs/jskult-webapp/src/model/db/hdke_tbl.py @@ -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] diff --git a/ecs/jskult-webapp/src/model/view/menu_view_model.py b/ecs/jskult-webapp/src/model/view/menu_view_model.py index 647bdec9..7a7970d2 100644 --- a/ecs/jskult-webapp/src/model/view/menu_view_model.py +++ b/ecs/jskult-webapp/src/model/view/menu_view_model.py @@ -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() diff --git a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py index 46f5bfcc..967fbbe1 100644 --- a/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py +++ b/ecs/jskult-webapp/src/repositories/hdke_tbl_repository.py @@ -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: diff --git a/ecs/jskult-webapp/src/static/css/menuStyle.css b/ecs/jskult-webapp/src/static/css/menuStyle.css index b1920070..3a07d9fc 100644 --- a/ecs/jskult-webapp/src/static/css/menuStyle.css +++ b/ecs/jskult-webapp/src/static/css/menuStyle.css @@ -37,7 +37,7 @@ body{ font-size: 160%; } -.notUseBioMsg{ +.notUseBioMsg,.notUseMainteMsg{ font-size: 143%; color: red; } diff --git a/ecs/jskult-webapp/src/system_var/constants.py b/ecs/jskult-webapp/src/system_var/constants.py index 899c19e5..b7ffa0e2 100644 --- a/ecs/jskult-webapp/src/system_var/constants.py +++ b/ecs/jskult-webapp/src/system_var/constants.py @@ -1,5 +1,8 @@ import os.path as path +BATCH_STATUS_PROCESSING = '1' +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') diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index b8026593..bbfca152 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -24,10 +24,12 @@ {% endif %} {% endif %} {% if menu.is_available_master_maintenance_menu() %} - {% if not menu.is_batch_processing() %} - マスターメンテメニュー

+ {% if menu.is_batch_processing() %} +
マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ {% elif menu.is_backup_processing() %} +
バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテメニューは利用できません
{% else %} -
マスターメンテメニューは
日次バッチ処理中のため利用出来ません
+ マスターメンテメニュー

{% endif %} {% endif %}

Logout From dbe7b3e007f4f89ff962e2e9871029cdd61fab0a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 15:34:33 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=E3=83=9E=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=A1=E3=83=B3=E3=83=86=E3=83=A1=E3=83=8B=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 60 +++++++++++++++++++ ecs/jskult-webapp/src/main.py | 4 +- .../view/master_mainte_menu_view_model.py | 5 ++ .../src/services/batch_status_service.py | 16 ++++- ecs/jskult-webapp/src/system_var/constants.py | 4 ++ .../src/templates/masterMainteMenu.html | 25 ++++++++ ecs/jskult-webapp/src/templates/menu.html | 2 +- 7 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 ecs/jskult-webapp/src/controller/master_mainte.py create mode 100644 ecs/jskult-webapp/src/model/view/master_mainte_menu_view_model.py create mode 100644 ecs/jskult-webapp/src/templates/masterMainteMenu.html 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 @@ + + + + {% with subtitle = menu.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + + diff --git a/ecs/jskult-webapp/src/templates/menu.html b/ecs/jskult-webapp/src/templates/menu.html index bbfca152..59eb8a74 100644 --- a/ecs/jskult-webapp/src/templates/menu.html +++ b/ecs/jskult-webapp/src/templates/menu.html @@ -29,7 +29,7 @@ {% elif menu.is_backup_processing() %}
バックアップ取得を開始しました。
日次バッチ更新が終了するまでマスターメンテメニューは利用できません
{% else %} - マスターメンテメニュー

+ マスターメンテメニュー

{% endif %} {% endif %}

Logout From af13fa66553ac49d53448a8176b03a7ccbf3e223 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:13:04 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix:=20=E3=83=A1=E3=83=B3=E3=83=86?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB=E3=82=A8=E3=83=A9?= =?UTF-8?q?=E3=83=BC=E9=80=9A=E7=9F=A5=E3=81=8C=E5=87=BA=E3=81=A6=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=86=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3=E3=80=82?= =?UTF-8?q?SSO=E3=81=AF=E9=80=9A=E7=9F=A5=E3=81=95=E3=81=9B=E3=82=8B?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 09032af5..6d867645 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,10 +69,10 @@ def login( try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: - logger.exception(e) + logger.info(f'ログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: - logger.exception(e) + logger.info(f'ログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) verified_token = jwt_token.verify_token() @@ -126,7 +126,7 @@ def sso_authorize( # トークン検証 verified_token = jwt_token.verify_token() except JWTTokenVerifyException as e: - logger.exception(e) + logger.exception(f'SSOログイン失敗:{e}') raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) # トークンからユーザーIDを取得 From cb1db32d2dfc05e8cf1fb57865018a250a38468d Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 16:39:12 +0900 Subject: [PATCH 04/11] =?UTF-8?q?fix:=20=E3=83=A6=E3=83=BC=E3=82=B6?= =?UTF-8?q?=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=AB=E3=83=AC=E3=82=B3=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB?= =?UTF-8?q?=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/login.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 6d867645..00e5cb75 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -79,6 +79,10 @@ def login( # 普通の認証だと、`cognito:username`に入る。 user_id = verified_token.user_id user_record = login_service.logged_in_user(user_id) + # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする + if user_record is None: + logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') @@ -132,6 +136,11 @@ def sso_authorize( # トークンからユーザーIDを取得 user_id = verified_token.user_id user_record = login_service.logged_in_user(user_id) + + # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする + if user_record is None: + logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') From d18b12a0f62f87dcfafaf2c397b00f6f8a986e97 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 17:13:35 +0900 Subject: [PATCH 05/11] =?UTF-8?q?Revert=20"fix:=20=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=86=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E5=A4=B1=E6=95=97=E6=99=82=E3=81=AB=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E9=80=9A=E7=9F=A5=E3=81=8C=E5=87=BA=E3=81=A6?= =?UTF-8?q?=E3=81=97=E3=81=BE=E3=81=86=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82SSO=E3=81=AF=E9=80=9A=E7=9F=A5=E3=81=95=E3=81=9B?= =?UTF-8?q?=E3=82=8B=E3=80=82"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit af13fa66553ac49d53448a8176b03a7ccbf3e223. --- ecs/jskult-webapp/src/controller/login.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index 00e5cb75..d8e7d569 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -69,10 +69,10 @@ def login( try: jwt_token = login_service.login(request.username, request.password) except NotAuthorizeException as e: - logger.info(f'ログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) except JWTTokenVerifyException as e: - logger.info(f'ログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) verified_token = jwt_token.verify_token() @@ -130,7 +130,7 @@ def sso_authorize( # トークン検証 verified_token = jwt_token.verify_token() except JWTTokenVerifyException as e: - logger.exception(f'SSOログイン失敗:{e}') + logger.exception(e) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_SESSION_EXPIRED) # トークンからユーザーIDを取得 From 4c3339fc24c68c707e4539efd60b0ec56eb811f8 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 29 Jun 2023 17:13:41 +0900 Subject: [PATCH 06/11] =?UTF-8?q?Revert=20"fix:=20=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=9E=E3=82=B9=E3=82=BF=E3=81=AB=E3=83=AC=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=A0=B4=E5=90=88=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=81=AA=E3=82=8B=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit cb1db32d2dfc05e8cf1fb57865018a250a38468d. --- ecs/jskult-webapp/src/controller/login.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ecs/jskult-webapp/src/controller/login.py b/ecs/jskult-webapp/src/controller/login.py index d8e7d569..09032af5 100644 --- a/ecs/jskult-webapp/src/controller/login.py +++ b/ecs/jskult-webapp/src/controller/login.py @@ -79,10 +79,6 @@ def login( # 普通の認証だと、`cognito:username`に入る。 user_id = verified_token.user_id user_record = login_service.logged_in_user(user_id) - # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする - if user_record is None: - logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') @@ -136,11 +132,6 @@ def sso_authorize( # トークンからユーザーIDを取得 user_id = verified_token.user_id user_record = login_service.logged_in_user(user_id) - - # ユーザーがマスタに存在しない場合、ログアウトにリダイレクトする - if user_record is None: - logger.info(f'存在しないユーザー: {user_id}, ユーザーID: {user_id}') - raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_ERROR) # ユーザーが有効ではない場合、ログアウトにリダイレクトする if not user_record.is_enable_user(): logger.info(f'無効なユーザー: {user_id}, 有効フラグ: {user_record.enabled_flg}') From c5d66c6d25e99463ba7f01a2a1259557cbb2d2ab Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 10:44:00 +0900 Subject: [PATCH 07/11] =?UTF-8?q?fix:=20=E7=94=BB=E9=9D=A2=E5=88=A9?= =?UTF-8?q?=E7=94=A8=E5=8F=AF=E5=90=A6=E3=83=95=E3=83=A9=E3=82=B0=E3=81=AF?= =?UTF-8?q?NULL=E3=81=8C=E8=A8=B1=E5=AE=B9=E3=81=95=E3=82=8C=E3=82=8B?= =?UTF-8?q?=E3=81=9F=E3=82=81=E3=80=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/model/view/user_view_model.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ecs/jskult-webapp/src/model/view/user_view_model.py b/ecs/jskult-webapp/src/model/view/user_view_model.py index 55f1528a..5b523b4c 100644 --- a/ecs/jskult-webapp/src/model/view/user_view_model.py +++ b/ecs/jskult-webapp/src/model/view/user_view_model.py @@ -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): From 646dd4f7d9b1f606b5c423dd0e5aef9a9bc1dba3 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 14:57:34 +0900 Subject: [PATCH 08/11] =?UTF-8?q?fix:=20=E6=96=87=E8=A8=80=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/model/view/master_mainte_menu_view_model.py | 2 +- ecs/jskult-webapp/src/templates/masterMainteMenu.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 index c8ff644a..2b1629b1 100644 --- 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 @@ -2,4 +2,4 @@ from pydantic import BaseModel class MasterMainteMenuViewModel(BaseModel): - subtitle: str = 'MeDaCA 機能メニュー' + subtitle: str = 'MeDaCA マスターメンテメニュー' diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 147ab2da..987615bf 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -7,7 +7,7 @@
-

MeDaCA
マスタメンテメニュー

+

MeDaCA
マスターメンテメニュー



施設担当者データCSVアップロード

From ae6aa29994fa8f5b14f6e272c8c4c56c81760231 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 30 Jun 2023 15:26:24 +0900 Subject: [PATCH 09/11] =?UTF-8?q?feat:=20=E5=90=84=E3=83=9E=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=A1=E3=83=B3=E3=83=86=E7=94=BB=E9=9D=A2=E3=81=AE?= =?UTF-8?q?=E5=81=B4=E3=81=A0=E3=81=91=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/master_mainte.py | 125 ++++++++++++++++++ .../view/inst_emp_csv_download_view_model.py | 5 + .../view/inst_emp_csv_upload_view_model.py | 5 + .../model/view/table_override_view_model.py | 5 + .../src/templates/instEmpCsvDL.html | 13 ++ .../src/templates/instEmpCsvUL.html | 13 ++ .../src/templates/masterMainteMenu.html | 2 +- .../src/templates/tableOverride.html | 13 ++ 8 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py create mode 100644 ecs/jskult-webapp/src/model/view/table_override_view_model.py create mode 100644 ecs/jskult-webapp/src/templates/instEmpCsvDL.html create mode 100644 ecs/jskult-webapp/src/templates/instEmpCsvUL.html create mode 100644 ecs/jskult-webapp/src/templates/tableOverride.html diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index ad5eb3e1..b8b8e087 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -4,8 +4,13 @@ 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 @@ -58,3 +63,123 @@ def menu_view( 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 new_inst_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 diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py new file mode 100644 index 00000000..220294ba --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_download_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class InstEmpCsvDownloadViewModel(BaseModel): + subtitle: str = '施設担当者データCSVダウンロード' diff --git a/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py new file mode 100644 index 00000000..64bde407 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/inst_emp_csv_upload_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class InstEmpCsvUploadViewModel(BaseModel): + subtitle: str = '施設担当者データCSVアップロード' diff --git a/ecs/jskult-webapp/src/model/view/table_override_view_model.py b/ecs/jskult-webapp/src/model/view/table_override_view_model.py new file mode 100644 index 00000000..e03b1fd0 --- /dev/null +++ b/ecs/jskult-webapp/src/model/view/table_override_view_model.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class TableOverrideViewModel(BaseModel): + subtitle: str = 'テーブル上書きコピー' diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html new file mode 100644 index 00000000..07712d73 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -0,0 +1,13 @@ + + + + {% with subtitle = view.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + +

施設担当者データCSVダウンロード

+ + diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html new file mode 100644 index 00000000..bdd305d8 --- /dev/null +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -0,0 +1,13 @@ + + + + {% with subtitle = view.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + +

施設担当者データCSVアップロード

+ + diff --git a/ecs/jskult-webapp/src/templates/masterMainteMenu.html b/ecs/jskult-webapp/src/templates/masterMainteMenu.html index 987615bf..957279fa 100644 --- a/ecs/jskult-webapp/src/templates/masterMainteMenu.html +++ b/ecs/jskult-webapp/src/templates/masterMainteMenu.html @@ -10,7 +10,7 @@

MeDaCA
マスターメンテメニュー



- 施設担当者データCSVアップロード

+ 施設担当者データCSVアップロード

施設担当者データCSVダウンロード

diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html new file mode 100644 index 00000000..272cd0cd --- /dev/null +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -0,0 +1,13 @@ + + + + {% with subtitle = view.subtitle %} + {% include '_header.html' %} + {% endwith %} + + + + +

テーブル上書きコピー

+ + From 788e13f1da8d60dbfeefffadaed2f758e96ed785 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 10:31:14 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20=E9=96=A2=E6=95=B0=E5=90=8D?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/jskult-webapp/src/controller/master_mainte.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/jskult-webapp/src/controller/master_mainte.py b/ecs/jskult-webapp/src/controller/master_mainte.py index b8b8e087..ea972ad6 100644 --- a/ecs/jskult-webapp/src/controller/master_mainte.py +++ b/ecs/jskult-webapp/src/controller/master_mainte.py @@ -106,7 +106,7 @@ def inst_emp_csv_upload_view( @router.get('/instEmpCsvDL', response_class=HTMLResponse) -def new_inst_view( +def inst_emp_csv_download_view( request: Request, batch_status_service: BatchStatusService = Depends(get_service(BatchStatusService)) ): From 3573bf08618362c6e2e5192424a9180a6c7e06e3 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Mon, 3 Jul 2023 10:54:06 +0900 Subject: [PATCH 11/11] =?UTF-8?q?style:=20CSS=E7=A7=BB=E6=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/static/css/masterMainte.css | 164 ++++++++++++++++++ .../src/templates/instEmpCsvDL.html | 3 +- .../src/templates/instEmpCsvUL.html | 2 +- .../src/templates/tableOverride.html | 3 +- 4 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 ecs/jskult-webapp/src/static/css/masterMainte.css diff --git a/ecs/jskult-webapp/src/static/css/masterMainte.css b/ecs/jskult-webapp/src/static/css/masterMainte.css new file mode 100644 index 00000000..a59c1681 --- /dev/null +++ b/ecs/jskult-webapp/src/static/css/masterMainte.css @@ -0,0 +1,164 @@ +body{ + background-color: LightCyan; + font-family : "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, Osaka, "MS 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%; +} + diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html index 07712d73..7e84fd4c 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvDL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvDL.html @@ -4,8 +4,7 @@ {% with subtitle = view.subtitle %} {% include '_header.html' %} {% endwith %} - - +

施設担当者データCSVダウンロード

diff --git a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html index bdd305d8..9ec84207 100644 --- a/ecs/jskult-webapp/src/templates/instEmpCsvUL.html +++ b/ecs/jskult-webapp/src/templates/instEmpCsvUL.html @@ -5,7 +5,7 @@ {% include '_header.html' %} {% endwith %} - +

施設担当者データCSVアップロード

diff --git a/ecs/jskult-webapp/src/templates/tableOverride.html b/ecs/jskult-webapp/src/templates/tableOverride.html index 272cd0cd..e473b469 100644 --- a/ecs/jskult-webapp/src/templates/tableOverride.html +++ b/ecs/jskult-webapp/src/templates/tableOverride.html @@ -4,8 +4,7 @@ {% with subtitle = view.subtitle %} {% include '_header.html' %} {% endwith %} - - +

テーブル上書きコピー