From 106ab0e94efeb24b9d76b780ab69270109cf87f9 Mon Sep 17 00:00:00 2001 From: Akira Date: Thu, 7 Nov 2024 03:24:15 +0900 Subject: [PATCH] implement sumaexcel step-1 --- Dockerfile.gdal | 1 + .../testdata/certificate_template.xlsx | Bin 11138 -> 11217 bytes rog/postgres_views.sql | 55 +++++++++++++++-- rog/views.py | 57 ++++++++---------- templates/.DS_Store | Bin 6148 -> 6148 bytes 5 files changed, 76 insertions(+), 37 deletions(-) diff --git a/Dockerfile.gdal b/Dockerfile.gdal index c30d958..0b61846 100644 --- a/Dockerfile.gdal +++ b/Dockerfile.gdal @@ -39,6 +39,7 @@ RUN apt-get update && apt-get install -y \ python3-pip RUN pip install --upgrade pip +RUN pip install -e ./SumasenLibs/excel_lib RUN apt-get update diff --git a/SumasenLibs/excel_lib/testdata/certificate_template.xlsx b/SumasenLibs/excel_lib/testdata/certificate_template.xlsx index a5f7d3f521d020345d15fd3905c49cf923cc5a7b..5c966953d07f76b7bd7c474385477de36669a541 100644 GIT binary patch delta 5244 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 delta 5190 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 NvXYk-cc1GY?LW|2q!9oB diff --git a/rog/postgres_views.sql b/rog/postgres_views.sql index 40c3075..089e538 100644 --- a/rog/postgres_views.sql +++ b/rog/postgres_views.sql @@ -42,11 +42,9 @@ WHERE -- マテリアライズドビューの作成 -- マテリアライズドビューの再作成 -DROP MATERIALIZED VIEW IF EXISTS mv_entry_details; - CREATE MATERIALIZED VIEW mv_entry_details AS SELECT - -- エントリー基本情報 + -- 既存のフィールド e.id, CAST(e.zekken_number AS TEXT) as zekken_number, e.is_active, @@ -86,6 +84,19 @@ SELECT COALESCE(cs.total_checkins, 0) as checkin_count, COALESCE(cs.purchase_count, 0) as purchase_count, + -- ゴール情報 + gi.goalimage as goal_image, + gi.goaltime as goal_time, + + -- 完走状態の判定を追加 + CASE + WHEN gi.goaltime IS NULL THEN '棄権' + WHEN gi.goaltime <= ev.end_datetime THEN '完走' + WHEN gi.goaltime > ev.end_datetime AND + gi.goaltime <= ev.end_datetime + INTERVAL '15 minutes' THEN '完走(遅刻)' + ELSE '失格' + END as validation, + -- ランキング情報 cr.ranking as category_rank, cr.total_participants, @@ -123,6 +134,8 @@ FROM AND CAST(e.zekken_number AS TEXT) = cs.zekken_number LEFT JOIN v_category_rankings cr ON e.id = cr.id LEFT JOIN rog_member m ON t.id = m.team_id + LEFT JOIN rog_goalimages gi ON ev.event_name = gi.event_code + AND CAST(e.zekken_number AS TEXT) = gi.zekken_number GROUP BY e.id, e.zekken_number, e.is_active, e."hasParticipated", e."hasGoaled", e.date, @@ -134,11 +147,43 @@ GROUP BY cs.total_points, cs.normal_points, cs.bonus_points, cs.penalty_points, cs.total_checkins, cs.purchase_count, cs.last_checkin, cr.ranking, cr.total_participants, - e.owner_id; -- オーナーIDをGROUP BYに追加 + gi.goalimage, gi.goaltime, + e.owner_id; -- インデックスの再作成 CREATE UNIQUE INDEX idx_mv_entry_details_event_zekken ON mv_entry_details(event_name, zekken_number); -- ビューの更新 -REFRESH MATERIALIZED VIEW mv_entry_details; \ No newline at end of file +REFRESH MATERIALIZED VIEW mv_entry_details; + + +-- チェックインと位置情報を結合したビューを作成 +DROP VIEW IF EXISTS v_checkins_locations CASCADE; +CREATE OR REPLACE VIEW v_checkins_locations AS +SELECT + g.event_code, + g.zekken_number, + g.path_order, + g.cp_number, + l.sub_loc_id, + l.location_name, + l.photos, + g.image_address, + g.create_at, + g.buy_flag, + g.validate_location, + g.points +FROM + gps_checkins g + LEFT JOIN rog_location l ON g.cp_number = l.cp +ORDER BY + g.event_code, + g.zekken_number, + g.path_order; + +-- インデックスのサジェスチョン(実際のテーブルに適用する必要があります) +/* +CREATE INDEX idx_gps_checkins_cp_number ON gps_checkins(cp_number); +CREATE INDEX idx_rog_location_cp ON rog_location(cp); +*/ \ No newline at end of file diff --git a/rog/views.py b/rog/views.py index 164921b..ee287cc 100644 --- a/rog/views.py +++ b/rog/views.py @@ -91,6 +91,8 @@ from django.urls import get_resolver import os import json +from sumaexcel import SumasenExcel + logger = logging.getLogger(__name__) @api_view(['PATCH']) @@ -2605,41 +2607,32 @@ def update_checkins(request): @api_view(['GET']) def export_excel(request, zekken_number): - # エントリー情報の取得 - entry = Entry.objects.select_related('team','event').get(zekken_number=zekken_number) - checkins = GpsCheckin.objects.filter(zekken_number=zekken_number).order_by('path_order') - # Excelファイルの生成 - output = BytesIO() - workbook = xlsxwriter.Workbook(output) - worksheet = workbook.add_worksheet('通過証明書') + # 初期化 + variables = { + "zekken_number":sekken_number, + "event_code":request["FC岐阜"], + "db":"rogdb", + "username":"admin", + "password":"admin123456", + "host":"localhost", + "port":"5432" + } + excel = SumasenExcel(document="test", variables=variables, docbase="./docbase") + # ./docbase/certificate.ini の定義をベースに、 + # ./docbase/certificate_template.xlsxを読み込み + # ./docbase/certificate_(zekken_number).xlsxを作成する - # スタイルの定義 - header_format = workbook.add_format({ - 'bold': True, - 'bg_color': '#CCCCCC', - 'border': 1 - }) + # シート初期化 + ret = excel.make_report(variables=variables) + if ret["status"]==True: + filepath=ret["filepath"] + logging.info(f"Excelファイル作成 : ret.filepath={filepath}") + else: + message = ret.get("message", "No message provided") + logging.error(f"Excelファイル作成失敗 : ret.message={message}") - # ヘッダー情報の書き込み - worksheet.write('A1', 'チーム名', header_format) - worksheet.write('B1', entry.team.team_name) - worksheet.write('A2', 'ゼッケン番号', header_format) - worksheet.write('B2', zekken_number) - # チェックインデータの書き込み - headers = ['順序', 'CP番号', 'チェックイン時刻', '検証', 'ポイント'] - for col, header in enumerate(headers): - worksheet.write(3, col, header, header_format) - - for row, checkin in enumerate(checkins, start=4): - worksheet.write(row, 0, checkin.path_order) - worksheet.write(row, 1, checkin.cp_number) - worksheet.write(row, 2, checkin.create_at.strftime('%Y-%m-%d %H:%M:%S')) - worksheet.write(row, 3, '✓' if checkin.validate_location else '') - worksheet.write(row, 4, checkin.points) - - workbook.close() # レスポンスの生成 output.seek(0) @@ -2647,7 +2640,7 @@ def export_excel(request, zekken_number): output.read(), content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ) - response['Content-Disposition'] = f'attachment; filename=通過証明書_{zekken_number}.xlsx' + response['Content-Disposition'] = f'attachment; filename=./docbase/certificate_{zekken_number}.xlsx' return response # ----- for Supervisor ----- diff --git a/templates/.DS_Store b/templates/.DS_Store index 9a5fa71274f9ffd7313c7c09b0f9675b6a11be8a..63096526dd352674594c8238f23be31df2ba1d48 100644 GIT binary patch delta 37 tcmZoMXfc@J&&aVcU^gQp$7CL+f1D}B$vH{+`8kZ6n7^=WX6N|J4*=&e42=K) delta 31 ncmZoMXfc@J&&a+pU^gQp`(z%bf172QU$IPV5Z=tr@s}R}qd*F0