From d22e8b5a2371ea763b70daacf53fdea48b36bd3b Mon Sep 17 00:00:00 2001 From: Akira Date: Fri, 8 Nov 2024 14:33:46 +0900 Subject: [PATCH] final stage update bugs --- .DS_Store | Bin 10244 -> 0 bytes SumasenLibs/excel_lib/sumaexcel/sumaexcel.py | 6 +- .../testdata/certificate_template.xlsx | Bin 11217 -> 11221 bytes docbase/certificate.ini | 1 + rog/postgres_views.sql | 6 +- rog/views.py | 4 +- supervisor/html/index.html | 175 ++++++++++-------- 7 files changed, 108 insertions(+), 84 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index cf4dc94a120fcb52bfec8d0b78ac27a416bab8b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMzmF3~6n=AezOyj_OF0k-MOp-kD2|KI%8^(!<}d{XQiKT<0gm;L_*SfUjqSrA z>yQfylt9BDKtZ|`L205;AR&?Rk+gS-b+k|9;GDuW#DkUeUe{6d%Ksrm03D z1@tZYZl3hRn)1&}n0?Q`k%d)FT_aA~cPHMi$9mw^{NSXJu^Rog!i{*x=@>E7R~*M~ z#Joyf>LKzL9i}!Uzcr~t4Ln^TA84v^nPZx0!d@TK9;(B-MwemPfiJddDUS{5yMvlK z{9Pv(Eq;Q(dm2U`Z|ZN17kUtjYA2PosF)ic@$n3)BZ^oI;**&5b|VJx3VuVz#*AHj zAG1r-DR^fjRF5(J*D?JJ@NnVVMGqWZo35J{at7(>q+roNbRM}eO-5jhraseBKRzlz zQ}d(Gvr9kBUVL$0&ND+}W0oar=yNRfw2cmE8^*=!F`#Rk%_Xrz<31l z_A5QNx7uBDJKylznK1OL@1EW2S+CJw&dnYVgP!XJjgB<%>J6xzKj#JYu)h?p2KBDA ztwaqOl;zx>!JzPEan30$7T4ySL9vjZb3QK?*48rVT?alpdV2Y?-wML-7)bmKP(K&w zqv(D8&ht-=S?8E0{`hC3Md$bBr%!G@U;B;olCsk?$Y`t1E2V}oduMmG(h2-9;B3Ir zP0Re@f+de?CQCer#SM*RLsw(r;s4IUUa)Wk$QQm?WEK_{@<-;J#r$H728J1BEDg8O zXbj3AL)x0{IwkuD+3K^MDz$SGRv_xcjMFjbN$4j=QU=}|GCBLQ7o>WVDsdm9+^12M zV4)GVm6uJz$V}D>{{qkiEuFii8R@ENCzB1LQE0ctUv(e+Jm|fB(#X`3hst|K>?= I%bow<0#1ESIsgCw diff --git a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py index 600f74e..8de400f 100644 --- a/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py +++ b/SumasenLibs/excel_lib/sumaexcel/sumaexcel.py @@ -113,6 +113,10 @@ class SumasenExcel: self.basic = basic + self.output_path = basic.get("output_path") + if not os.path.exists(self.output_path): + os.makedirs(self.output_path, exist_ok=True) + logging.info("step-2") # basicセクションから必要なパラメータを取得 @@ -143,7 +147,7 @@ class SumasenExcel: logging.error("sections not found in basic section") # 出力ファイルパスを設定 - self.output_filepath = f"{self.docpath}/{doc_file}" + self.output_filepath = f"{self.output_path}/{doc_file}" # 新規のExcelワークブックを作成 self.workbook = openpyxl.Workbook() # デフォルトで作成されるシートを削除 diff --git a/SumasenLibs/excel_lib/testdata/certificate_template.xlsx b/SumasenLibs/excel_lib/testdata/certificate_template.xlsx index 5c966953d07f76b7bd7c474385477de36669a541..d023f4c8d55371832829a9abbf1649b8e08f8a0a 100644 GIT binary patch delta 4311 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 delta 4307 zcmZ8lXE+-S*N)mMq(-gUu~*DmC3XlJiq@aX!kT-an7y!Uf0syoC0N@o;!q>yo z&CbKaP5jj}WQD1<$ErL-;A0np2LFzmtJ34}5(p3YTWKS^X@rY!PMofOO?rRDTB6DH z)maBkL1CZkfY0raSXIy0`zH!_nR0NoknGfomJ)4#g`uLJGX3>-f9ABMjZ(%`?MmmQ zNtC(?(m|ze?n?RkBqh2s4g=@r00K&O;#3K|?+{`8}tdNgLMMSvaWwwHxh>rM} zjgxdq)7!&?vpRg=lUg(=z6&wiHLS8kYt1B97%PEBsLFzaIyN#|bwuhOEb9q#X2d4F z@gxSpZJwXZhooz#MWoOs#d(`UXT=UEv<-%Y@_0m2yef4h1|NDbS5d7cHs+O4+MP<`2I9wEt*kc zcEPZfYysIhVZ3DWgq5_?G{I}&SG+=S-fXQeeeE|*poDD_2uZ6i6O?omE92St9%YcX z!L`m2 z9uTBDLq)R21)6Q+j5^NrTR8GUrfsMBv>9{{5*2tEICSJ1uHE^6b3c(9-fDXytBf*%4x}U=`u4wt~RF?Ae!k z#ws;MKJqcs`|dZ@o9|W_KcX6lh_-F(hb-&0OtY6@Hl+h3HaF%HSj3**lad=E*9lV0 z$c#VuaVEWLlS>SV`*;}!;34kXsam^BB26nRIa5|{@$%lI2o2Y$XaQnnZ?R1I?Cqw+K2W*_gee=eAIDbEpiX-HS#$SYv`vW{v{TaD@9fAeeCaf- z@}a*}3f#Orkednlk#pS?D;?EoE8uSU({NrM?|-jL<;71^smJrh#qQZwI*04Wcq|S# zl5@0JF%+Z&30_`a|@{004tJQJ~Tdl)*b3 zggT;{?)Qy1dsnx0Z^t^qTeUzWS>kg-gWJa!Nl5%*yv--!ZnVHCrU1O5+<7mjdjGoh z@fXgY1T)T*vMRH+oXekw#yV_Ux}1XG!NdhgN${ z$q8vG$a@yanArqSd8KW`f`sLXztgm%xaC5~bitdGJ!Yer;~44~XKiZUMsRB(!*hp

rHj_YFXwz;Q%AwrsqF|u(lA8ht$Z7`DD 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 zama

ゴール時刻
-
+
@@ -123,7 +123,7 @@ // APIのベースURLを環境に応じて設定 const API_BASE_URL = 'http://rogaining.sumasen.net/api'; let original_goal_time = ''; - let selected_event_code = ''; + let selected_event_code = ''; // イベントリスナーの設定 document.addEventListener('DOMContentLoaded', function() { @@ -147,7 +147,7 @@ alert('イベントコードを選択してください'); return; } - selected_event_code = eventCode; + selected_event_code = eventCode; loadTeamData(e.target.value, eventCode); }); @@ -253,6 +253,16 @@ try { const newTime = new Date(input.value); + // inputがnullの場合は棄権処理 + if (!input) { + const validateElement = document.getElementById('validate'); + display.textContent = '棄権'; + if (validateElement) { + validateElement.textContent = '棄権'; + } + return; + } + display.textContent = newTime.toLocaleString(); const eventCodeSelect = document.getElementById('eventCode'); @@ -279,23 +289,23 @@ .then(checkins => { const startCheckin = checkins.find(c => c.cp_number === -1); if (startCheckin) { - const startTime = new Date(startCheckin.create_at); - const timeDiff = (newTime - startTime) / 1000; // 秒単位の差 - const maxTime = team.duration + 15*60; // 制限時間+15分 - updateValidation(timeDiff, maxTime ); - const overtime = ((newTime - startTime) / 1000 - team.duration/1000 + 60 ) // 60; - if( overtime>0 ){ - late_point = overtime*(-50); - lateElement = document.getElementById('latePoints'); - lateElement.textContent = late_point; - lateElement.classList.add('text-red-600'); - }else{ - lateElement = document.getElementById('latePoints'); - lateElement.textContent = 0; - lateElement.classList.remove('text-red-600'); - } - } - }) + const startTime = new Date(startCheckin.create_at); + const timeDiff = (newTime - startTime) / 1000; // 秒単位の差 + const maxTime = team.duration + 15*60; // 制限時間+15分 + updateValidation(timeDiff, maxTime ); + const overtime = ((newTime - startTime) / 1000 - team.duration/1000 + 60 ) // 60; + if( overtime>0 ){ + late_point = overtime*(-50); + lateElement = document.getElementById('latePoints'); + lateElement.textContent = late_point; + lateElement.classList.add('text-red-600'); + }else{ + lateElement = document.getElementById('latePoints'); + lateElement.textContent = 0; + lateElement.classList.remove('text-red-600'); + } + } + }) .catch(error => handleApiError(error)); } else { @@ -304,24 +314,25 @@ const timeDiff = (newTime - startTime) / 1000; // 分単位の差 const maxTime = team.duration + 15*60; // 制限時間+15分 - //console.info('startTime=',startTime,',goalTime=',newTime,',timeDiff=',timeDiff,'duration=',team.duration,',maxTime=',maxTime); + //console.info('startTime=',startTime,',goalTime=',newTime,',timeDiff=',timeDiff,'duration=',team.duration,',maxTime=',maxTime); updateValidation(timeDiff, maxTime ); - // 1秒でも遅刻すると、1分につき-50点 - const overtime = ((newTime - startTime) / 1000 - team.duration ); - if( overtime>0 ){ - //console.info('overtime=',overtime); - late_point = Math.ceil(overtime/60)*(-50); - lateElement = document.getElementById('latePoints'); - lateElement.textContent = late_point; - lateElement.classList.add('text-red-600'); - }else{ - lateElement = document.getElementById('latePoints'); - lateElement.textContent = 0; - lateElement.classList.remove('text-red-600'); - } - } + // 1秒でも遅刻すると、1分につき-50点 + const overtime = ((newTime - startTime) / 1000 - team.duration ); + if( overtime>0 ){ + //console.info('overtime=',overtime); + late_point = Math.ceil(overtime/60)*(-50); + lateElement = document.getElementById('latePoints'); + lateElement.textContent = late_point; + lateElement.classList.add('text-red-600'); + }else{ + lateElement = document.getElementById('latePoints'); + lateElement.textContent = 0; + lateElement.classList.remove('text-red-600'); + } + } }); + calculatePoints(); // 総合ポイントの計算 } catch (e) { console.error('Error updating goal time:', e); @@ -419,7 +430,7 @@ try { const [teamResponse, checkinsResponse] = await Promise.all([ fetch(`${API_BASE_URL}/team_info/${zekkenNumber}/`), - fetch(`${API_BASE_URL}/checkins/${zekkenNumber}/${event_code}/`), + fetch(`${API_BASE_URL}/checkins/${zekkenNumber}/${event_code}/`), ]); // 各レスポンスのステータスを個別にチェック @@ -434,7 +445,7 @@ // ゴール時刻の表示を更新 updateGoalTimeDisplay(teamData.end_datetime); - original_goal_time = teamData.end_datetime; + original_goal_time = teamData.end_datetime; // イベントコードに対応するイベントを検索 //const event = eventData.find(e => e.code === document.getElementById('eventCode').value); @@ -453,34 +464,36 @@ '未ゴール'; goalTimeDisplay.textContent = goalTime; - console.info('teamData.goal_photo = ',teamData.goal_photo ); + updateGoalTime(goalTime) // ゴール時刻の表示を更新 + + console.info('teamData.goal_photo = ',teamData.goal_photo ); if (goalTime === '-') { goalTimeDisplay.classList.add('cursor-pointer'); goalTimeDisplay.onclick = () => editGoalTime(goalTimeDisplay); } - //console.info("step 0"); - // ゴール時計の表示を更新 - const goalTimeElement = document.getElementById('goalTime'); - if (teamData.goal_photo) { - // 画像要素を作成 - //console.info("step 1"); - const img = document.createElement('img'); - img.src = teamData.goal_photo; - img.classList.add('h-32', 'w-auto', 'object-contain', 'cursor-pointer'); - img.onclick = () => showLargeImage(teamData.goal_photo); + //console.info("step 0"); + // ゴール時計の表示を更新 + const goalTimeElement = document.getElementById('goalTime'); + if (teamData.goal_photo) { + // 画像要素を作成 + //console.info("step 1"); + const img = document.createElement('img'); + img.src = teamData.goal_photo; + img.classList.add('h-32', 'w-auto', 'object-contain', 'cursor-pointer'); + img.onclick = () => showLargeImage(teamData.goal_photo); - //console.info("step 2"); - // 既存の内容をクリアして画像を追加 - goalTimeElement.innerHTML = ''; - goalTimeElement.appendChild(img); + //console.info("step 2"); + // 既存の内容をクリアして画像を追加 + goalTimeElement.innerHTML = ''; + goalTimeElement.appendChild(img); - //console.info("Goal photo displayed: ",teamData.goal_photo); - } else { - goalTimeElement.textContent = '画像なし'; - console.info("No goal photo available"); - } + //console.info("Goal photo displayed: ",teamData.goal_photo); + } else { + goalTimeElement.textContent = '画像なし'; + console.info("No goal photo available"); + } // チェックインリストの更新 @@ -493,11 +506,11 @@ checkinsData.forEach((checkin, index) => { const tr = document.createElement('tr'); tr.dataset.id = checkin.id; - tr.dataset.local_id = index+1; + tr.dataset.local_id = index+1; tr.dataset.cpNumber = checkin.cp_number; tr.dataset.buyPoint = checkin.buy_point; - tr.dataset.checkinPoint = checkin.checkin_point; - tr.dataset.path_order = index+1; + tr.dataset.checkinPoint = checkin.checkin_point; + tr.dataset.path_order = index+1; const bgColor = checkin.buy_point > 0 ? 'bg-blue-100' : ''; tr.innerHTML = ` @@ -510,7 +523,11 @@ `` : ''} - ${checkin.cp_number===-1 || checkin.image_address===null ? "" : ``} + ${checkin.cp_number===-1 || checkin.image_address===null ? "" : + ``}
${checkin.sub_loc_id}
@@ -546,7 +563,7 @@ // } //} }); - updatePathOrders(); + updatePathOrders(); // 合計ポイントの更新 //document.getElementById('totalPoints').textContent = totalPoints; @@ -991,37 +1008,39 @@ function applyImageOrientation(imgElement) { // 総合ポイントの計算 function calculatePoints() { - //console.info('calculatePoints'); + //console.info('calculatePoints'); const rows = Array.from(document.getElementById('checkinList').children); let totalPoints = 0; // チェックインポイントの合計をクリア let cpPoints = 0; // チェックインポイントの合計をクリア let buyPoints = 0; // 買い物ポイントの合計をクリア + let latePoints = 0; // 遅刻ポイントの合計をクリア - // 各行のチェックインポイント及び買い物ポイントを合算 + // 各行のチェックインポイント及び買い物ポイントを合算 rows.forEach(row => { - const buybox = row.children[6].querySelector('input[type="checkbox"]'); - const checkbox = row.children[7].querySelector('input[type="checkbox"]'); - const point = parseInt(row.children[8].textContent); + const buybox = row.children[6].querySelector('input[type="checkbox"]'); + const checkbox = row.children[7].querySelector('input[type="checkbox"]'); + const point = parseInt(row.children[8].textContent); if (checkbox) { totalPoints += point; if (buybox && buybox.checked) { buyPoints += point; - }else{ - cpPoints += point; - } + }else{ + cpPoints += point; + } } }); // 遅刻ポイントの計算=ゴール時刻がEventのゴール時刻を超えていたら1分につき-50点を加算する。 - const latePoints = parseInt(document.getElementById('latePoints').textContent) || 0; - // 総合得点を計算 + latePoints = parseInt(document.getElementById('latePoints').textContent) || 0; + // 総合得点を計算 const finalPoints = totalPoints + latePoints; - // 判定を更新。順位を表示、ゴール時刻を15分経過したら失格 - //console.info('calculatePoints:totalPoints=',cpPoints,',buyPoints=',buyPoints,',finalPoints=',finalPoints); + // 判定を更新。順位を表示、ゴール時刻を15分経過したら失格 + //console.info('calculatePoints:totalPoints=',cpPoints,',buyPoints=',buyPoints,',finalPoints=',finalPoints); document.getElementById('totalPoints').textContent = cpPoints; document.getElementById('buyPoints').textContent = buyPoints; + document.getElementById('latePoints').textContent = latePoints; document.getElementById('finalPoints').textContent = finalPoints; } @@ -1034,17 +1053,17 @@ function applyImageOrientation(imgElement) { const zekkenNumber = document.querySelector('#zekkenNumber').value; const eventCode = document.querySelector('#eventCode').value; - const display = document.getElementById('goalTimeDisplay'); + const display = document.getElementById('goalTimeDisplay'); if (!display) { console.error('Goal time elements not found'); return; } - let goalTime = display.textContent; - console.info('Goal time = ',goalTime); + let goalTime = display.textContent; + console.info('Goal time = ',goalTime); - try { + try { const checkins = getCurrentCheckins(); // 現在の表示データを取得 const response = await fetch(`${API_BASE_URL}/update_checkins/`, {